[Delphi] ClientSocket.Active

Pagina: 1
Acties:

  • SlaSauS
  • Registratie: Juli 2000
  • Laatst online: 12-01 22:16
Probleem Schets:
Ik wil in het event OnDisconnect van mijn object "ClientSocket" gelijk opnieuw connecten naar een nieuwe host.

Het statement ClientSocket.Active := True; wil echter niet werken onder OnDisconnect en word overgeslagen om een voor mij onbekende reden.
Maar als ik ClientSocket.Active := True; vanuit ButtonConnect aanroep, wordt er wel opnieuw geconnect :?

code onder ButtonConnect:
code:
1
2
3
4
5
6
7
procedure TFormMecius.ButtonConnectClick(Sender: TObject);
begin
  if ClientSocket.Active = False then
    ClientSocket.Active := True
  else
    ShowMessage('Already connected');
end;

code onder event OnDisconnect:
code:
1
2
3
4
5
6
7
8
9
10
procedure TFormMecius.ClientSocketDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
    ClientSocket.Host := '64.4.13.59'; // de nieuwe host

    ShowMessage('Vlakvoor verbinden');
    ClientSocket.Active := True; //waarom werkt dit niet?
    ShowMessage('Verbonden!');

end;

hij laat de ShowMessages wél netjes zien, maar hij connect gewoon niet opnieuw, terwijl als ik nu opnieuw op ButtonConnect zou klikken, er wel naar de nieuwe host, 64.4.13.59, word geconnect...

wie-o-wie?

Verwijderd

Pas na het afhandelen van de OnDisconnect event, zet ClientSocket de boolean FConnected op False.

De method Connect van ClientSocket werkt alleen als die boolean FConnected False is.

code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure TCustomWinSocket.Disconnect(Socket: TSocket);
begin
  Lock;
  try
    [..]
    { Met de volgende method wordt het OnDisconnect event
    afgevuurd }
    Event(Self, seDisconnect);
    [..]
    FConnected := False;
    [..]
  finally
    Unlock;
  end;
end;

procedure TClientSocket.DoActivate(Value: Boolean);
begin
  { Hier wordt gekeken of FConnected wel False is }
  if (Value <> FClientSocket.Connected) and not
    (csDesigning in ComponentState) then
  begin
    [..]
  end;
end;

De oplossing die ik in zo'n gevallen meestal gebruik is een event dmv PostMessage naar jezelf te sturen, en bij ontvangst van dat event de Connect aan te roepen.