Die meisten dieser Probleme kannst du durch ein ordentliches Design deines Programmes vermeiden. Wenn du zirkuläre Referenzen hast, dann deutet das darauf hin, dass du etwas nicht richtig durchdacht hast (natürlich steht jeder, der beginnt zu Programmieren vor diesem Problem). 99,9% der Fälle lassen sich jedoch auch anders lösen.
Ich gebe dir mal einen kleinen Denkanstoß:
Ein selbst gebastelter modaler Dialog (Form2, Unit2) soll einen String in Edit24 des Hauptformulars ändern.
Schlechte Lösung:
Delphi-Quellcode:
unit Form1;
[...]
procedure TForm1.Button18Click(Sender: TObject);
begin
Form2.ShowModal;
end;
[...]
unit Form2;
[...]
implementation
uses Unit1;
procedure TForm2.Button29Click(Sender: TObject);
begin
Form1.Edit24.Text := '
Dies ist mein Text';
end;
Besser:
Delphi-Quellcode:
unit Unit1;
[...]
implementation
procedure TForm1.ButtonClick(Sender: TObject);
begin
Edit24.Text := Form2.ShowDialog;
end;
[...]
unit Unit2;
[...]
implementation
type
TForm2 =
class(TForm)
[...]
public
function ShowDialog:
string;
end;
[...]
interface
function TForm2.ShowDialog:
string;
begin
ShowModal;
result := '
Dies ist mein Text';
end;
Andere Probleme kannst du zum Beispiel über Methodenzeiger (in Delphi als "Ereignisse" missbraucht) lösen: Möchtest du etwas auf Form1 durch den nicht modalen dialog Form2 steuern, informiert Form2 Form1 über den vorher übergebenen Methodenzeiger über die Änderung. Auch hier gibt es keine zirkulären Referenzen.
Edit: Ansich ist es für ein einfaches Projekt nichts schlimmes mit diesen Zirkulären Referenzen zu arbeiten. Die Wiederverwendbarkeit deines Codes geht dann aber gegen Null, wie du auch an meinem Beispiel oben siehst.