Bei einer kleinen selbstprogrammierten Anwendung stand ich vor dem Problem, dass ein Formular auf ein anderes Formular zugreifen muss, das andere Formular jedoch auch eine Aktion auf ersterem Formular ausführen muss.
Wenn ich nun jeweils die andere Unit in den Interface-Teil hinzufüge, meckert der Compiler (zirkuläre Referenz).
Eine mögliche Lösung wäre, die Referenz auf das erste Formular einem public Feld vom Typ “TCustomForm” des zweiten Formulars zuzuweisen, die Unit des ersten Formulars dem Implementation-Abschnitt der 2.Form bekannt zu machen und dann in der entsprechenden Prozedur auf die Klasse der ersten Form casten.
Beispiel:
Unit Form2;
interface
uses
[...]
type
TForm2 = class(TForm)
[...]
private
Form1Ref: TControl;
procedure DoSomethingOnForm1;
[...]
public
[...]
end;
implementation
uses
Form1;
[...]
procedure TForm2.DoSomethingOnForm1;
Var
Form1: TForm1;
begin
Form1 := TForm1(Form1Ref);
Form1.MacheIrgendEtwasAufForm1;
end;
Funktioniert, ist aber hässlich™.
Etwas tippintensiver, aber wesentlich “hübscher” geht es mit einem Event:
Unit Form2;
interface
uses
[...]
type
TForm2Event = procedure (Sender: TObject) of Object;
TForm2 = class(TForm)
[...]
private
FForm2Event: TForm2Event;
procedure DoSomethingOnForm1;
[...]
public
property Form2Event: TForm2Event Read FForm2Event Write FForm2Event;
end;
implementation
[...]
procedure TForm2.DoSomethingOnForm1;
begin
// Auslösen des Events
If Assigned(Form2Event)
Form2Event(Sender);
end;
_______________________________________________
Unit Form1;
interface
[...]
Type
TForm1 = class(TForm)
[...]
public
procedure Form2EventAusfuehren(Sender: TObject);
end;
[...]
implementation
TForm1.FormCreate(Sender: TObject);
begin
[...]
Form2.Form2Event := Form2EventAusfuehren;
end;
procedure Form1.Form2EventAusfuehren(Sender: TObject);
begin
// hier Code der auf Form1 ausgeführt werden soll
end;
