Aufbau einer Handlerliste

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

Aufbau einer Handlerliste

Beitrag von Lorca »

Hallo zusammen :)

ich möchte gerne eine Handlerliste aufbauen, habe jedoch Probleme beim speichern von ON_xxx Handlern in einer Liste (TList)
Hierzu benötige ich eigentlich nur die Funktionen;
"procedure variable type of procedure(TObject) of object;Register (TNotifyEvent) -->> Pointer ( für die TList ) und wieder raus aus der Liste, also
"Pointer -->> " procedure variable type of procedure(TObject) of object;Register

Kann jemand sagen ob bzw. wie ich diese Event Funktionen konvertieren kann?
Natürlich würde ich auch gerne TDataSetChangeEvent, TDataStateEvent ... in einer Liste Puffern.

Ich habe zwar herausgefunden das ich mit ADDR( das TNotifyEvent ) die Funktionen als Pointer in die Liste bekomme.
Habe jedoch keine Idee, diese wieder heraus zu holen(um diese abzuarbeiten)

Hintergrund:
Synchronisierung von verschiedenen Bildschirm Bildern welche auf eine Tabelle zugreifen.
Jeder Bildschirm hängt sich z.B in das ONOpen Ereignis ein und wird dann in einer Liste gespeichert.
Wird nun Open aufgerufen, sollen alle Open Ereignisse abgearbeitet werden.


Viele Grüße
Lorca :)

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6217
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Aufbau einer Handlerliste

Beitrag von af0815 »

TPersistent (unit classes) hat Observer vorbereitet und das Interface IFPObserved. Ist das nicht genau das, was du suchst, wie so etwas funktioniert ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

PascalDragon
Beiträge: 834
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Aufbau einer Handlerliste

Beitrag von PascalDragon »

Lorca hat geschrieben:
Mo 11. Sep 2023, 12:05
ich möchte gerne eine Handlerliste aufbauen, habe jedoch Probleme beim speichern von ON_xxx Handlern in einer Liste (TList)
Hierzu benötige ich eigentlich nur die Funktionen;
"procedure variable type of procedure(TObject) of object;Register (TNotifyEvent) -->> Pointer ( für die TList ) und wieder raus aus der Liste, also
"Pointer -->> " procedure variable type of procedure(TObject) of object;Register

Kann jemand sagen ob bzw. wie ich diese Event Funktionen konvertieren kann?
Natürlich würde ich auch gerne TDataSetChangeEvent, TDataStateEvent ... in einer Liste Puffern.

Ich habe zwar herausgefunden das ich mit ADDR( das TNotifyEvent ) die Funktionen als Pointer in die Liste bekomme.
Habe jedoch keine Idee, diese wieder heraus zu holen(um diese abzuarbeiten)
Methodenzeiger bestehen intern aus zwei Zeigern, nämlich den Zeiger zum Code der Methode und dem Datenelement, welches Self repräsentiert. Du kannst das also nicht ohne weiteres in eine TList schmeißen. Du musst entweder wie bei jedem ordinärem Record auch Speicher für TMethod anlegen und den Methodenzeiger dorthin zuweisen (Methodenzeiger können nach TMethod konvertiert werden und umgekehrt). Oder du nimmst eine generische Liste (FGL.TFPGList<> oder Generics.Collections.TList<>) und spezialisiert sie mit TNotifyEvent.
FPC Compiler Entwickler

Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

Re: Aufbau einer Handlerliste

Beitrag von Lorca »

Hallo zusammen,

herzlichen Dank für eure freundlichen Antworten, :)

Nun lieber af0815, das mit der TPersistent und dem Observer Interface ist mir derzeit noch viel zu kompliziert.
Ich liebe es einfach, pragmatisch und nachvollziebar :) ( Ich bin halt ein fauler Hund :D)

Lieber PascalDragon, das mit diesem "Doppelpointer" habe ich dann auch bei meinen Recherchen im Internet gefunden.
Dagegen scheint die Observer Geschichte Kinderleicht zu sein *Supergrins"

Wie auch immer ich habe da mal selber ein Handler Objekt aufgebaut und eine DAO Klasse um dies zu demonstrieren.
Da sich die EVENTs nicht puffern lassen, habe ich halt ein TObject herum gebaut. Dies lässt sich speichern :)

In der Demo muss lediglich die DBConnection und die ZTable korrekt für jeden Tester eingestellt werden.( die ersten 3 Statements in:
TForm1.Formcreate )

Es funzt wunderbar. Ich speichere die Event Handler in einer TStringlist. Eine TList ist genauso möglich.

Im Anhang mal die Demo


Viele Grüße und nochmals Danke schön
Lorca :)
Dateianhänge
EventHandler.zip
(142.61 KiB) 78-mal heruntergeladen

PascalDragon
Beiträge: 834
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Aufbau einer Handlerliste

Beitrag von PascalDragon »

Lorca hat geschrieben:
Di 12. Sep 2023, 09:57
Lieber PascalDragon, das mit diesem "Doppelpointer" habe ich dann auch bei meinen Recherchen im Internet gefunden.
Was an folgendem nicht leicht ist, verstehe ich nicht:

Code: Alles auswählen

uses
  fgl;
  
type
  TNotifyEventList = specialize TFPGList<TNotifyEvent>;
  
var
  l: TNotifyEventList;
begin
  l:= TNotifyEventList.Create;
  try
    // ein paar Objektinstanzen erstellen (sagen wir mal o1 bis o3)
    // ...
    
    // dann die Liste füllen (alle diese Methoden haben eine zu TNotifyEvent passende Signature)
    l.Add(@o1.OnMethod1);
    l.Add(@o2.OnMethodFoo);
    l.Add(@o3.WhatEver);
    
    // und jetzt aufrufen
    for i := 0 to l.Count -1 do
       l[i](MySender);
  finally
    l.Free;
  end;
end.
FPC Compiler Entwickler

BeniBela
Beiträge: 309
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: Aufbau einer Handlerliste

Beitrag von BeniBela »

Man kann das optimieren und die Liste erst erstellen, wenn ein zweites Event hinzugefügt wird: https://blog.grijjy.com/2023/04/27/ligh ... st-events/

Antworten