Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Findcomponent TclientSocket.active := true setzen (https://www.delphipraxis.net/161471-findcomponent-tclientsocket-active-%3D-true-setzen.html)

Pet04 5. Jul 2011 10:48

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

shmia 5. Jul 2011 11:09

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

Pet04 5. Jul 2011 12:06

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;

DeddyH 5. Jul 2011 12:47

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;

shmia 5. Jul 2011 12:50

AW: Findcomponent TclientSocket.active := true setzen
 
Das Event OnError ist so deklariert:
Delphi-Quellcode:
TSocketErrorEvent = procedure (Sender: TObject; Socket: TCustomWinSocket;
    ErrorEvent: TErrorEvent; var ErrorCode: Integer) of object;
Also muss man die übergeben Parameter auch benützen und darf nicht selbst mit FindComponent() suchen.

FredlFesl 5. Jul 2011 17:24

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.

DeddyH 5. Jul 2011 17:31

AW: Findcomponent TclientSocket.active := true setzen
 
Zitat:

Zitat von FredlFesl (Beitrag 1110118)
Pack die Sockets in eine Liste, fertig.

Wo sie sich nach dem ersten Aufruf von FindComponent automatisch befindet :roll:

Pet04 6. Jul 2011 10:27

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 ?

DeddyH 6. Jul 2011 10:32

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.

Pet04 6. Jul 2011 10:41

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 11:29 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz