![]() |
Findcomponent TclientSocket.active := true setzen
Hallo zusammen,
ich erstelle dynamisch bis zu 8 clientsockets .....
Code:
....
For j := 0 To 4 do
begin If (PreisLedCfg[j].IP_Ausfahrt <> '0.0.0.0') then begin try Price_Info_ClientSocketA:=TclientSocket.Create(self); with Price_Info_ClientSocketA do begin Name := 'Price_Info_ClientSocketA_'+PreisLedCfg[j].Anlage; // A für Ausfahert ClientType := ctNonBlocking; Host := GetIPFromHost(PreisLedCfg[j].IP_Ausfahrt);//GetIPFromHost(host[i]); //IP des Zielrechners Port:=StrToInt(PreisLedCfg[j].Port); active :=true; //Aufbau der Verbindung OnError := Price_Info_ClientSocketA_Error; end; // create Price_Info_ClientSocket except end; // ShowMessage(Exception(ExceptObject).Message); end; Nun habe ich das Problem, dass bei einem Onerror die Verbindung über einen Timer reconnected wird. Dazu wollte ich über If not (TClientsocket(FindComponent(Price_Info_ClientSock etE.Name)).active) then //if not Price_Info_ClientSocketE.Active then begin Memo1.Lines.Add(Price_Info_ClientSocketE.Name +'<connection failed>'); TClientsocket(FindComponent(Price_Info_ClientSocke tE.Name)).Active := true; //Price_Info_ClientSocketE.Active := true; Reconnect; den besimmten clientsocket wieder auf activ setzen. procedure TMainForm.Reconnect; begin Timer_PriceInfo.Interval := Pause; Timer_PriceInfo.Enabled := True; Memo1.clear; Memo1.Lines.Add(Price_Info_ClientSocketE.Name +'<attempting to reconnect in '+ IntToStr(Pause) +'ms>') end; aber irgendwie funktioniert es nicht, dass der clientsocket sich wieder connectet Vielen Dank schon mal für eure Hilfe |
AW: Findcomponent TclientSocket.active := true setzen
Tja, die Reihenfolge der Befehle ist halt wichtig.
Zuerst alle Properties und Events des TClientSocket-Objekts bestücken und dann erst Active := True setzen.
Delphi-Quellcode:
// Zuerst Eventhandler zuweisen
OnError := Price_Info_ClientSocketA_Error; // und dann erst active :=true; //Aufbau der Verbindung |
AW: Findcomponent TclientSocket.active := true setzen
Die Verbindungen funktionieren ja wunderbar.
erst wenn ich z.B. von einem bestimmten client das Netzwerkkabe ziehe und bis zum Fehler (OnError) warte. Und ich die Abrfage ob der Client = Aktiv ist. wird der richtige client wohl nicht gefunden If not (TClientsocket(FindComponent(Price_Info_ClientSock etE.Name)).active) then //if not Price_Info_ClientSocketE.Active then begin Memo1.Lines.Add(Price_Info_ClientSocketE.Name +'<connection failed>'); TClientsocket(FindComponent(Price_Info_ClientSocke tE.Name)).Active := true; //Price_Info_ClientSocketE.Active := true; Reconnect; |
AW: Findcomponent TclientSocket.active := true setzen
Ich würde mir eine Zwischenvariable deklarieren, sonst greift man womöglich auf unterschiedliche Komponenten zu, wenn man mal etwas ändert.
Delphi-Quellcode:
var
Sock: TClientSocket; begin Sock := FindComponent(SuchString) as TClientSocket; if Assigned(Sock) then If not (Sock.active) then begin Memo1.Lines.Add(Sock.Name +'<connection failed>'); Sock.Active := true; Reconnect; end; end; |
AW: Findcomponent TclientSocket.active := true setzen
Das Event OnError ist so deklariert:
Delphi-Quellcode:
Also muss man die übergeben Parameter auch benützen und darf nicht selbst mit FindComponent() suchen.
TSocketErrorEvent = procedure (Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer) of object; |
AW: Findcomponent TclientSocket.active := true setzen
Was ihr immer mit dem FindComponent habt. Das ist totaler Müll. Pack die Sockets in eine Liste, fertig.
|
AW: Findcomponent TclientSocket.active := true setzen
Zitat:
|
AW: Findcomponent TclientSocket.active := true setzen
Das OnError event habe ich dekariert.
wie übergebe ich nun die benötigten Parameter genau ? zur Procedue reconnect und procedure timer ? |
AW: Findcomponent TclientSocket.active := true setzen
Wie, übergeben? Wenn ein Fehler auftritt, dann sollte der Socket ein Event feuern und die Parameter zur Auswertung bestücken. Ich habe zwar ewig nichts mehr mit den Socket-Kompos gemacht, aber anders sehe ich keinen Sinn in diesem Event.
|
AW: Findcomponent TclientSocket.active := true setzen
Ich habe ja mehrere clients, wenn einer einen error verursacht kommmt es zum onError Event.
dann soll ja reconnectet werden. die Procedure im Timer soll dann prüfen, ob der Client.active ist wenn nicht active setzen. Also muß ich doch genau diesen client (der einen Fehler hat) vom Onerror Event zur Timer procedur übergeben. Und da habe ich mein problem wie ich das genau mache. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz