Übergabe Funktion an Constructor

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Joh
Lazarusforum e. V.
Beiträge: 308
Registriert: Sa 26. Mai 2012, 17:31
OS, Lazarus, FPC: Win 10 (L 2.2.6 x64 FPC 3.2.2)
CPU-Target: 64Bit

Übergabe Funktion an Constructor

Beitrag von Joh »

Moin,

wenn ich eine Komponente im Code erstelle, kann ich ja die Ereignisprozedur mit

Code: Alles auswählen

komponente.OnChange := @setFilter;
zuweisen.
Wie übergebe ich dann die Funktion im Constructor, wenn ich die Ereignisprozedur mit übergeben will?

Der Aufruf

Code: Alles auswählen

constructor Create (AOwner: TComponent; ...; ptr: Pointer);
mit

Code: Alles auswählen

sf := TmyFeld.Create(self, ..., @setFilter);
wirft mit einen Error: Incompatible type for arg no. 4: Got "<procedure variable type of procedure(TObject) of object;Register>", expected "Pointer".
Bisher war ich der Meinung, ein @setFilter entspricht einem Pointer auf die Funktion setFilter. Kann ich überhaupt die Prozedur übergeben?
Oder wäre der passendere Weg, im Construktor über AOwner.setFilter zu gehen?

Joh

(ich befürchte, man merkt, das hier jemand, der eigentlich prozedural programmiert, versucht, Objekte zu erzeugen...)
just my two Beer

Benutzeravatar
Zvoni
Beiträge: 414
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Übergabe Funktion an Constructor

Beitrag von Zvoni »

Ein OnChange-Ereignis hat ja in der Regel nen Datentyp "TNotifyEvent"
https://lazarus-ccr.sourceforge.io/docs ... event.html

Ungetestet

Code: Alles auswählen

sf := TmyFeld.Create(self, ..., Pointer(@setFilter));  //Harter Cast
Damit brauchst du aber wieder einen Cast zurück im Constructor, glaub ich zumindest

Oder das versuchen:

Code: Alles auswählen

constructor Create (AOwner: TComponent; ...; ptr: TNotifyEvent);
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Joh
Lazarusforum e. V.
Beiträge: 308
Registriert: Sa 26. Mai 2012, 17:31
OS, Lazarus, FPC: Win 10 (L 2.2.6 x64 FPC 3.2.2)
CPU-Target: 64Bit

Re: Übergabe Funktion an Constructor

Beitrag von Joh »

Zvoni hat geschrieben: Do 10. Jul 2025, 12:19 Oder das versuchen:

Code: Alles auswählen

constructor Create (AOwner: TComponent; ...; ptr: TNotifyEvent);
Danke! so funktionierts. Noch so schön :-)
just my two Beer

Benutzeravatar
Zvoni
Beiträge: 414
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Übergabe Funktion an Constructor

Beitrag von Zvoni »

Joh hat geschrieben: Do 10. Jul 2025, 13:09
Zvoni hat geschrieben: Do 10. Jul 2025, 12:19 Oder das versuchen:

Code: Alles auswählen

constructor Create (AOwner: TComponent; ...; ptr: TNotifyEvent);
Danke! so funktionierts. Noch so schön :-)
Denk dran: Das funktioniert dann insoweit, sofern die Events alle den gleichen Typ haben (TNotifyEvent).
Sollte ein Event mit einem anderen Datentyp ins Spiel kommen (andere Arguments-Liste), ist wohl das sinnvollste einen Constructor-Overload pro Datentyp zu machen
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Antworten