Funktions- und Methodenzeiger
Funktionen und Prozeduren können selbst in Variablen gespeichert werden (bzw. ein Verweis auf sie). Somit ist es möglich, einer Funktion eine andere Funktion als Parameter zu übergeben.
type
TMeineFunktion = function: Integer;
In diesem Fall haben die Funktionen oder Prozeduren keinen Namen, sondern bestehen aus dem Schlüsselwort function oder procedure, bei Bedarf gefolgt von Parametern in runden Klammern und einem Rückgabewert. Handelt es sich um Methoden, folgt noch "of object":
TMeineMethode = procedure of object;
Praktischer Nutzen der Sache: Man kann somit eine Ereignisbehandlungsroutine erstellen und erst zur Laufzeit einem Objekt (einer Komponente) zuordnen.
Beispiel:
type
TMyOnClick = procedure(Sender: TObject) of object;
TMyForm = class(TForm)
procedure MyButtonClickEvent(Sender: TObject);
end;
var
MyOnClick: TMyOnClick;
MyForm: TMyForm;
...
MyOnClick := MyForm.MyButtonClickEvent;
Die OnClick-Events der Komponenten haben ebenfalls einen Methodenzeiger als Typ, den gleichen wie TMyOnClick im Beispiel. Deshalb ist es möglich, z.B. einem Button zur Laufzeit eine Methode mit dem gleichen Parameter zuzuweisen. Variablen vom Typ einer Funktion/Prozedur beinhalten die Speicheradresse, also einen Zeiger auf die Routine. Bei Methoden werden zwei Zeiger gespeichert: die Adresse der Methode und eine Referenz auf die Instanz.
Delegates
Das Konzept der Delegaten in .NET entspricht diesen Funktions- und Methodenzeigern. Das Schlüsselwort delegate wird von Delphi nicht unterstützt.
Multicast-Events
In .NET ist es möglich, einem Event mehr als einen Eventhandler zuzuordnen. Die Zuordnung weiterer Methodenzeiger zu einem Event erfolgt über die Funktion include. Sie erwartet als ersten Parameter einen Event-Namen und als zweiten den Zeiger auf eine passende Methode. Das Gegenstück dazu ist die Funktion exclude.
