Einzelnen Beitrag anzeigen

RedOne

Registriert seit: 2. Jun 2008
71 Beiträge
 
Delphi XE2 Professional
 
#1

Procedurepointer übergeben

  Alt 8. Jun 2012, 17:57
Delphi-Version: 2009
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
  Mit Zitat antworten Zitat