Das sind eigentlich zwei Probleme.
Zum ersten sollte man niemals fix den Variablennamen einer Instanz von TForm1 oder jeder anderen Formklasse verwenden, weil:
Code: Alles auswählen
procedure TForm1.ShowForm2;
var f : TForm2;
begin
f := TForm2.Create(Application);
f.ShowModal;
f.Free;
end;
Wenn du jetzt in der Implementierung von TForm2 irgendwo auf die Variable Form2 zugreifst, kracht es.
Weil die Variable heisst f und ist in der Unit in der TForm2 definiert ist, unbekannt.
Die zirkuläre Referenz kann man auflösen, indem unit2 im implementation Teil von unit1 eingebunden wird.
unit1 kann dann wahlweise im interface oder implementation Teil von unit2 eingebunden werden.
Ich mache solche Beziehungen über mehrere Formulare meistens mit Schnittstellenmethoden.
So kann man z.B. in TForm2 eine function Execute(var x, y, z : Single) : boolean; implementieren, die dann etwa so ausschaut.
Code: Alles auswählen
function TForm2.Execute(var x, y, z : Single) : boolean;
begin
editx.Text := FloatToStr(x);
edity.Text := FloatToStr(y);
editz.Text := FloatToStr(z);
Result := ShowModal = mrOk; // Wenn der Anwender in Form2 auf abbrechen geklickt hat, soll nichts geändert werden
if Result then
begin
x := TryStrToFloat(editx.Text);
y := ... usw.
end;
end;
Jetzt kannst du bei TForm1 Buttonclick die Instanz von TForm2 erzeugen, per Execute die Werte übergeben und abhängig davon, ob der Anwender auch den OK Button geklickt hat verwenden.