![]() |
Pointer auf Methode (einer Klasse) mit unbekannter Signatur
Edit:
Bitte weiter unten die aktualiserte Frage lesen :zwinker: Hallo zusammen, und zwar bastle ich gerade an daran, den EventListener-Mechanismus, welcher z.B. aus Java oder Flash bekannt ist, nachzubauen. Mir schwebt der folgende Code vor:
Delphi-Quellcode:
Nun habe ich das Problem, dass der Compiler mir einen Fehler bringt, wenn ich eine Methode als Listener anmelden will, alsi bei der Ausführung des folgenden Codes:
{ Definierte Events }
type TEventType = (evtClick, evtError); { Methoden, die später durch die Events aufgerufen werden } procedure OnClickA(Sender: TObject); begin { ... } end; procedure OnClickB(Sender: TObject); begin { ... } end; procedure OnErrorA(const AError: String); begin { ... } end; procedure OnErrorB(const AError: String); begin { ... } end; { Events verknüpfen } blub.AddEventLister(evtClick, OnClickA); blub.AddEventLister(evtClick, OnClickB); blub.AddEventLister(evtClick, OnErrorA); blub.AddEventLister(evtClick, OnErrorB); { AddEventListener-Methode soll einen Pointer auf die entsprechende aufzurufende Methode in eine passende Liste übernehmen } procedure TBlub.AddEventListener(const AType: TEventType; AListener: TMethod); begin // In passender Liste Referenz auf Methode einfügen FMethodPointerList[AType].Add(@AListener); { Hier noch die Definition von FMethodPointerList: FMethodPointerList : array[ low(TEventType) .. high(TEventType) ] of TList; } end;
Delphi-Quellcode:
Mir ist klar, dass ich eigentlich den Fehler posten sollte, aber mir geht es primär eher um etwas anderes: ich will ja nur einen Zeiger auf die Methode übergeben, dabei interessiert mich nicht wie viele Parameter die Methode hat. Dies wird später entsprechend ausgewertet, von Methoden die die Definition kennen. Habt ihr eine Ahnung, ob das überhaupt möglich ist? Wenn ja, wie kann ich denn sowas anstellen?
blub.AddEventLister(evtClick, OnClickA);
Hier nochmals das Problem in Kurzform, was ich haben will:
Delphi-Quellcode:
procedure A(AVar: String); begin { ... } end;
procedure B(const ATemp: Integer): begin { ... } end; procedure C(AMuh: TKuh); begin { ... } end; procedure SaveMethodePointer(AMethodPointer: TMethodPointer); // TMethodPointer -> Welchen Typ sollte ich hier nutzen? begin FPointerList.Add(AMethodPointer); end; |
Re: Pointer auf Methode mit bel. Param. als Param. übergeben
Wird bei Java nicht gleich ein komplettes Interface anstatt einer einzelnen Methode übergeben?
Diese Art von Interfaces sind in Delphi aber (aus gewissen Gründen) nicht so beliebt. Was du suchst sind Eventmulticaster. Schau dir dazu mal in der VCL TApplicationEvents an! |
Re: Pointer auf Methode (einer Klasse) mit unbekannter Signa
Jup, ich suche eine Möglichkeit für Multicast-Events. Ich habe auch den Titel meines Threads umbenannt, da ich mir nochmals Gedanken über meine Fragestellung gemacht habe. Ich sollte es wie folgt definieren:
Wie kann ich einen Pointer auf eine Methode einer Klasse bekommt, deren Signatur ich nicht kenne? Im späteren Verlauf der Anwendung ist diese Sigantur bekannt und wird korrekt aufgerufen. An sich müsste sowas doch Mmlich sein, da der Pointer auf solch eine Methode doch unabhängig von der Signatur ist, oder? |
Re: Pointer auf Methode (einer Klasse) mit unbekannter Signa
Ja das ist möglich. Redest du jetzt eigentlich von Funktionen oder von Methoden?
|
Re: Pointer auf Methode (einer Klasse) mit unbekannter Signa
Einer Methode einer Klasse.
|
Re: Pointer auf Methode (einer Klasse) mit unbekannter Signa
Geht es hier eigentlich um das Selbe?
![]() Zitat:
|
Re: Pointer auf Methode (einer Klasse) mit unbekannter Signa
Jo, das hat mit der selben Sache zu tun ;) Eigentlich könnte man das ganze mergen, aber es sind teilweise doch andere Fragen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz