[gelöst] Im Event Sender im Array herausfinden

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
NoCee
Beiträge: 170
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
CPU-Target: Intel 32/64Bit, ARM9
Wohnort: Ulm

[gelöst] Im Event Sender im Array herausfinden

Beitrag von NoCee »

Hallo zusammen,
irgendwie ist meine Frage verschwunden.
Kann es sein daß wenn der Betreff fehlt, der Beitrag ins Nirwana verschwindet?

Ich habe ein Array of Timer die alle das gleiche machen.
Um herauszufinden welcher Timer abgelaufen ist, hab ich im Netzt folgendes
gefunden was auch tadellos funktioniert:

Code: Alles auswählen

procedure TForm1.onTimePaar(Sender: TObject);
var
  aTimer: TTimer;
  i: Integer;
  Nr: Integer;
  begin
     aTimer := Sender as TTimer;
    for i := 1 to 10 do begin
      if aTimer = TimePaar[i] then begin
        Nr:= i;
        break;
      end;
    end;   
Bei einem Array of TLTCPComponent (LNET Komponente) möchte ich jetzt das gleiche Prinzip anwenden.
Der Event wird gefeuert wenn ein TCP/IP Socket einen Error bringt.
Die Eventprocedure sieht in der ersten Zeile folgendermaßen aus:
procedure TForm1.FNetClientRBGXError(const msg: string; aSocket: TLSocket);
Ich hab jetzt das triviale Problem daß mir das Wort "Sender" fehlt.
Das muß doch ähnlich gehen, oder?
Irgendwie so was wie
mysocket:=aSocket as TLSocket usw.
Oder bin ich da völlig auf dem Holzweg?

Für Hilfe wäre ich sehr dankbar.

Gruß
NoCee
Zuletzt geändert von NoCee am Mi 17. Nov 2021, 19:04, insgesamt 1-mal geändert.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1435
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Im Event Sender im Array herrausfinden

Beitrag von fliegermichl »

TLTCPComponent hat die Array Property Socks. Die kannst du durchsuchen:

Code: Alles auswählen

procedure TForm1.FNetClientRBGXError(const msg: string; aSocket: TLSocket);
var i, j : integer;
 tcp : TLTCPComponent;
begin
 tcp := nil;
 for i := low(myLTCPComponents) to High(myLTCPComponents) do
   for j := Low(myLTCPComponents[i].Socks) to High (myLTCPComponents.Socks) do
    if myLTCPComponents[i].Socks[j] = aSocket then
     tcp := myLTCPComponents[i];
 if (tcp <> nil) then
   ...
end;

Benutzeravatar
kupferstecher
Beiträge: 422
Registriert: Do 17. Nov 2016, 11:52

Re: Im Event Sender im Array herrausfinden

Beitrag von kupferstecher »

NoCee hat geschrieben:
Di 16. Nov 2021, 21:23
Irgendwie so was wie
mysocket:=aSocket as TLSocket usw.
"as" bedeutet einen (abgesicherten) Typcast nach TLSocket. Da aSocket aber schon vom Typ TLSocket ist, ist das überflüssig. Bei dem TTimer-Beispiel ist das anders, die Timer-Instanz wird über eine Variable vom Typ TObject übergeben, obwohl die Instanz tatsächlich vom Typ TTimer ist. Alle Klassen werden ja vom Typ TObject abgeleitet, damit lässt sich das Konstrukt (Sender: TObject) prinzipiell für alle Klassen verwenden. Ist also universell, dafür ist ein Typecast nötig.
Vielleicht hilft es für das Verständnis noch zu wissen, dass die Instanzvariablen immer nur Referenzen sind, d.h. es steht lediglich die Speicheradresse drin, wo die tatsächliche Instanz liegt.

Bei der Abfrage

Code: Alles auswählen

  if aTimer = TimePaar[i] then
werden einfach beide Adressen verglichen, zeigen sie auf die gleiche Speicherstelle, dann handelt es sich um die gleiche Instanz.

fliegermichl hat ja schon beschrieben, wie man an den Socket kommt.

NoCee
Beiträge: 170
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
CPU-Target: Intel 32/64Bit, ARM9
Wohnort: Ulm

Re: Im Event Sender im Array herrausfinden

Beitrag von NoCee »

Danke für die Infos.

Ich hab jetzt versucht das umzusetzen
das FNetClientRBGx ist ein array von 1 bis 10 von TLTCPComponent
deshalb hab ich für i direkt 1 bis 10 genommen.

Code: Alles auswählen

Nr: integer;
  i,k: integer;
  tcp: TLTCPComponent;
begin
  tcp := nil;
  Nr := 0;
  for i := 1 to 10 do begin
    for k := Low(FNetClientRBGx[i].Socks) to High(FNetClientRBGx[i].Socks) do begin //hier bekomme ich den Fehler Kursor steht hinter .Socks: 
                                                                                                                                          // Error: Wrong number of parameters specified for call to "GetItem"
      if FNetClientRBGx[i].Socks[k] = aSocket then begin
        Nr:= i;
        break;
      end;
    end;
    if Nr <> 0 then break;
  end;
  writeln('Nummer ist: '+inttostr(Nr));      
Das FNetClientRBGx ist doch ein array mit array von Socks
Bei Low(FNetClientRBGx i.Socks macht es doch keinen Sinn bei Socks einen Indes [k] anzuhängen.
Wo hab ich einen Hund drin?

Schon mal Dank für eure Hilfe
Gruß
NoCee

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1435
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Im Event Sender im Array herrausfinden

Beitrag von fliegermichl »

Sorry mein Fehler. socks ist kein Array sondern eine Property mit indexiertem Zugriff.
Es muss dann so gehen:

Code: Alles auswählen

 for i := 1 to 10 do
  for j := 0 to (FNetClientRBGx[i].Count - 1) do
   if FNetClientRBGx[i].socks[j] = aSocket then
    tcp := FNetClientRBGx[i];

NoCee
Beiträge: 170
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
CPU-Target: Intel 32/64Bit, ARM9
Wohnort: Ulm

Re: Im Event Sender im Array herrausfinden

Beitrag von NoCee »

Läuft jetzt. Obs funktioniert kommt noch auf.

Ganz verstehen tu ichs noch nicht.
Heißt Property mit indexiertem Zugriff daß das Property
irgendwie dynamisch angelegt wird und dann die Anzahl der erzeugten socks" .Count " ist?

vielen Dank für die Hilfe
Gruß
NoCee

[Edit: Habs gerade getestet, funktioniert einwandfrei]

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Im Event Sender im Array herrausfinden

Beitrag von Sieben »

Heißt Property mit indexiertem Zugriff daß das Property
irgendwie dynamisch angelegt wird und dann die Anzahl der erzeugten socks" .Count " ist?
Ja. Das wohl bekannteste indexierte Property ist:

Code: Alles auswählen

 TStrings = class(TPersistent)
      //...
    property Strings[Index: Integer]: string read Get write Put; default;
Wobei die Getter und Setter dann so aussehen:

Code: Alles auswählen

    function Get(Index: Integer): string; virtual; abstract;
    procedure Put(Index: Integer; const S: string); virtual;

NoCee
Beiträge: 170
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
CPU-Target: Intel 32/64Bit, ARM9
Wohnort: Ulm

Re: Im Event Sender im Array herrausfinden

Beitrag von NoCee »

OK
grundsätzlich hab ichs kapiert.
Und funktionieren tuts auch.

Vielen Dank für eure Unterstützung

Gruß
NoCee

Antworten