Einzelnen Beitrag anzeigen

Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

Pointer auf Methode (einer Klasse) mit unbekannter Signatur

  Alt 31. Dez 2009, 15:54
Edit:
Bitte weiter unten die aktualiserte Frage lesen

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:
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;
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat