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
Aufbau einer Handlerliste
- af0815
- Lazarusforum e. V.
- Beiträge: 6216
- 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
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).
-
- 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
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.Lorca hat geschrieben: ↑Mo 11. Sep 2023, 12:05ich 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)
FPC Compiler Entwickler
Re: Aufbau einer Handlerliste
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 )
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
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 )
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
-
- 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
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
-
- 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
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/