Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.171 Beiträge
 
Delphi 12 Athens
 
#1

generische Callback-Liste erstellen ?

  Alt 16. Apr 2010, 19:21
Ich wollte mir eine grundlegende Eventliste erstellen, also eine Liste womit Callbackprozeduren gespeichert werden und auch aufgerufen werden können.

Als "normale" Liste hab ich schon lange im Einsatz und da ich
Delphi-Quellcode:
// Ausschnitt mit den wichtigsten Headern und Funktionen

Type TEvent = Procedure(Sender: TMyObject) of Object;
     TCallback = Class
       FEventList: Array of TEvent;
       Procedure Add (Const Value: TEvent);
       Procedure Remove(Const Value: TEvent);
       Procedure Call (Sender: TSender);
     End;

Procedure TCallback.Call(Sender: TSender);
  Var i: Integer;

  Begin
    For i := Count - 1 downto 0 do
      FEventList[i](Sender);
  End;
Nun brauch ich grade in einen Projekt mehrere dieser Listen und dachte mir
"och, warum erstellst'e dir nicht einfach ein (generisches) Grundgerüst".
So weit so gut ... die Deklaration funktioniert perfekt, aber das Aufrufen der Funktionen funktioniert einfach nicht.
Delphi-Quellcode:
// meine Deklaration

Type TInternalCallback<TProc> = Class(TList<TProc>)
       Procedure Add (Const Value: TProc);
       Procedure Remove(Const Value: TProc);
     End;
     TCallback<TProc, TSender> = Class(TInternalCallback<TProc>)
       Procedure Call(Const Sender: TSender);
     End;
     TCallback<TProc, TSender, TParam1> = Class(TInternalCallback<TProc>)
       Procedure Call(Const Sender: TSender; Const Param1: TParam1);
     End;
     TCallback<TProc, TSender, TParam1, TParam2> = Class(TInternalCallback<TProc>)
       Procedure Call(Const Sender: TSender; Const Param1: TParam1; Const Param2: TParam2);
     End;
     ...
Delphi-Quellcode:
// das Ganze etwas übersichtlicher (inkl. Markierung der Fehlerstelle)

Type TCallback<TProc, TSender> = Class(TList<TProc>)
       Procedure Add (Const Value: TProc);
       Procedure Remove(Const Value: TProc);
       Procedure Call (Sender: TSender);
     End;

Procedure TCallback<TProc, TSender>.Call(Sender: TSender);
  Var i: Integer;

  Begin
    For i := Count - 1 downto 0 do
      Items[i](Sender);
      // ^ genau hier
  End;
Zitat:
[DCC Fehler] OpenToolsAPI.pas(495): E2066 Operator oder Semikolon fehlt
Sowas bringt natürlich die selbe Fehlermldung:
Delphi-Quellcode:
For i := Count - 1 downto 0 do
  TProc(Items[i])(Sender);
  // ^ genau hier
Und dieses geht auch nicht
Delphi-Quellcode:
Type TCallback<TProc: Procedure, TSender> = Class(TList<TProc>)
       Procedure Add (Const Value: TProc);
       Procedure Remove(Const Value: TProc);
       Procedure Call (Sender: TSender);
     End;
Zitat:
[DCC Fehler] OpenToolsAPI.pas(18): E2029 Bezeichner erwartet, aber 'PROCEDURE' gefunden
Und verwenden wollte ich es z.B. so:
(dieses nimmt der Compiler auch kommentarlos entgegen)
Delphi-Quellcode:
Type TEvent = Procedure(Sender: TMyObject) of Object;
  TEventList = TCallback<TEvent, TMyObject>;
Wie kann ich also dem Compiler sagen, daß dieses "TProc" einen Methoden-Zeiger darstellen soll?


[add]
Wenn sich für den Aufruf nichts finden läßt, dann werde ich wohl doch zumindestens die Call-Prozedur ohne Generics lösen und für jede Methoden-Zeiger eine eigene Klasse von dem BasistypenTInternalCallback<TProc> = Class(TList<TProc>) ableiten
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat