Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Pointer auf Methode (einer Klasse) mit unbekannter Signatur (https://www.delphipraxis.net/145415-pointer-auf-methode-einer-klasse-mit-unbekannter-signatur.html)

s.h.a.r.k 31. Dez 2009 15:54


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:
{ 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;
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:
Delphi-Quellcode:
blub.AddEventLister(evtClick, OnClickA);
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?

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;

sirius 31. Dez 2009 19:39

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!

s.h.a.r.k 1. Jan 2010 18:44

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?

sirius 2. Jan 2010 14:34

Re: Pointer auf Methode (einer Klasse) mit unbekannter Signa
 
Ja das ist möglich. Redest du jetzt eigentlich von Funktionen oder von Methoden?

s.h.a.r.k 2. Jan 2010 14:40

Re: Pointer auf Methode (einer Klasse) mit unbekannter Signa
 
Einer Methode einer Klasse.

himitsu 2. Jan 2010 14:41

Re: Pointer auf Methode (einer Klasse) mit unbekannter Signa
 
Geht es hier eigentlich um das Selbe?
http://www.delphipraxis.net/internal...t.php?t=171086

Zitat:

Zitat von sirius
Ja das ist möglich. Redest du jetzt eigentlich von Funktionen oder von Methoden?

@sirius: Da drüben sind es Methoden und Prozeduren/Funktionen.

s.h.a.r.k 2. Jan 2010 15:21

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 13:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz