Ich würde gerne ausserhalb des Objekts eine Prozedur definieren, welche ich innerhalb meines Objekts aufrufen kann. Sinn und Zweck soll sein, dass wenn jemand auf ein Image klickt und somit den Button betätigt, soll dies der Anwender aussehalb meines Objektes erfahren, indem seine zuvor definierte Prozedur aufgerufen wird.
Man kann schon was machen, um ein Ereignis in einer Klasse zu erzeugen und in einer aufrufenden
Unit auf dieses Ereignis zu reagieren. Ich verwende als Beispiel immer gerne das, was ich ständig mache: Im Datenmodul, das die Datenbank-Zugriffskomponenten enthält, ein Ereignis erzeugen, wenn bestimmte Tabellen gesrcollt werden, um auf diese Weise in der Statusbar der Mainform gewisse Informationen über den ausgewählten Record anzeigen zu lassen.
Schritt 1: Du deklarierst in der Klassen-
Unit außerhalb der Klassen-Deklaration einen Ereignis-Typ:
Delphi-Quellcode:
UNIT UnitData;
INTERFACE
USES
SysUtils, StrUtils, Classes, DBAccess, IBC,
DB, MemDS;
TYPE // Das wird außerhalb der Klasse deklariert
TUpdateStatusbarEvent =
Procedure of Object;
...
TYPE // ab hier beginnt dann die eigentliche Klasse
TDatMod =
CLASS(TDataModule)
...
end.
Schritt 2: Damit hast du nun einen neuen Typ namens
TUpdateStatusbarEvent
. Nun deklarierst du eine Variable von diesem Typ im Private-Abschnitt:
Delphi-Quellcode:
...
PRIVATE { Private-Deklarationen }
Var
fUpdateStatusbar : TUpdateStatusbarEvent;
...
end.
Schritt 3: Danach erzeugst du ein Property im Public-Bereich:
Delphi-Quellcode:
...
PUBLIC { Public-Deklarationen }
...
Property OnUpdateStatusbar : TUpdateStatusbarEvent read fUpdateStatusbar write fUpdateStatusbar;
...
end.
Schritt 4: In deiner aufrufenden
Unit, in der etwas passieren soll, weist du nun dieses Ereignis deines Objekts (deiner Klasse) einer Methode deiner aufrufenden
Unit zu, hier der Aktualisierung der Statusbar:
Delphi-Quellcode:
Procedure TFormMain.FormCreate(Sender: TObject);
begin
..
DatMod.OnUpdateStatusbar := StatusBarAktuell; // DatMod ist hier die Variable für die Instanz des Datenmoduls
..
end;
Schritt 5: Um nun im Datenmodul ein Ereignis auszulösen, verwende ich folgenden Code genau dort, wo das Ereignis ausgelöst werden soll, z.B. in der AfterScroll-Ereignisbehandlung:
Delphi-Quellcode:
Procedure TDatMod.View_LogAccessAfterScroll(DataSet: TDataSet);
begin
If Assigned(fUpdateStatusbar) Then fUpdateStatusbar;
end;
In meiner Hauptform wird nun immer dann, wenn sich in dieser Tabelle der Datensatzzeiger ändert (gescrollt wird), die private Methode
StatusBarAktuell;
aufgerufen.