Hallo zusammen
Ich stehe bei einem Problem an bei dem Ihr mir sicher helfen könnt.
Und zwar folgendes:
Vereinfacht gesagt habe ich ein Formular auf dem ich die Klasse TFirst instanziere. Dieses Objekt wiederum instanziert die Klasse TSecond. TSecond ist ein Panel (im Beispiel unterhalb die vereinfachte Version ohne Panel). Wird auf diesem Panel ein Button geklickt, soll eine Funktion auf dem Hauptformular ausgeführt werden.
Beim kreieren der Klasse TFirst weisst TFirst TSecond die Methode aus dem Hauptformular zu. Aber: Diese ist zu diesem Zeitpunkt noch nicht zugewiesen. Klingt verwirrlich, deshalb hier ein vereinfachtes Beispiel (habe auf Objektfreigaben etc. absichtlich verzichtet).
Delphi-Quellcode:
type
TClick = procedure of object;
TFirst = class
private
FClick: TClick;
public
constructor Create;
property DoIt: TClick read FClick write FClick;
end;
TSecond = class
private
FClick: TClick;
procedure InternalClick( _sender: TObject );
public
property DoIt: TClick read FClick write FClick;
constructor Create;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
private
procedure DoItLocal;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//------------------------------- TFirst
constructor TFirst.Create;
var
c: TSecond;
begin
c:= TSecond.Create;
c.DoIt:= FClick; //FClick ist zu diesem Zeitpunkt noch nil
end;
//------------------------------- TSecond
constructor TSecond.Create;
begin
Form1.Button1.OnClick:= InternalClick; //Hässliche Implementierung, ich weiss, dient aber auch zur zur Veranschaulichung :-)
end;
procedure TSecond.InternalClick(_sender: TObject);
begin
//Hier sollte die Procedur "DoItLocal" auf Form1 ausgeführt werden, ist aber nil da die Procedure beim Create noch nicht zugewiesen war
if Assigned( FClick ) then begin
FClick;
end;
end;
//------------------------------- TForm1
procedure TForm1.DoItLocal;
begin
ShowMessage('Event ausgelöst');
end;
procedure TForm1.FormCreate(Sender: TObject);
var
e: TFirst;
begin
e:= TFirst.Create; //Innerhalb dem Create wird die Procedure zugewiesen. Diese ist aber nil, da die Procedure der Klasse TFirst erst eine Zeile tiefern zugewiesen wird...
e.DoIt:= Self.DoItLocal;
end;
Meiner Meinung nach muss ich nun statt der Procedure den Pointer über/weitergeben. Aber wie...?
Herzlichen Dank!
RedOne