Also, wenn ich Anfänger wäre, wäre ich möglicherweise verwirrter, als vorher.
Einige Dinge sind hier richtig aufgeschrieben worden, aber ich denke, die Zusammenhänge sind evtl. schwer verständlich.
Wenn du die Form schließt (Form2.Close) ist sie nur unsichtbar. Du bist nicht der Erste, den das irritiert.
Ein Form2.Show zeigt sie dann wieder an, wie sie zuletzt verlassen wurde. das ist genau das, was dir passiert ist.
Natürlich gilt das nur, wenn innerhalb der Form nicht irgendwelche Aktionen beim OnShow (oder anderen Ereignissen) durchgeführt werden.
Der Hinweis, dass im OnClose die Anweisung
Action := caFree;
gemacht werden kann, stimmt natürlich. Man sollte sich dann aber sicher sein, dass das wirklich so gewollt ist. Der nächste Aufruf
Form2.Show
geht sonst nämlich mit einer Zugriffsverletzung in die Hose.
Als Anfänger hast du sicher alle Forms zum Programmstart erzeugt (ist die Standard-Vorgabe).
Das heißt die Form2-Variable ist schon mit Inhalt gefüllt. Das solltest du ändern, damit du im Source einheitlich vorgehen kannst.
In den Projekt-Optionen (dort der Bereich Formulare) kannst du festlegen, welche Formen schon bei Programmstart erzeugt werden.
Es gibt auch andere Möglichkeiten, aber das lasse ich jetzt mal weg, um nicht noch mehr Verwirrung zu stiften (Auch wenn es schon einen Beitrag gibt, wo das gezeigt wird. Allerdings ohne Erläuterung).
Wenn du die Form2 mit ShowModal aufrufst, ist es relativ einfach. Da die Form2 dann den Focus nicht an Form1 zurückgibt, bis Form2 geschlossen wird, kannst du direkt danach ein
Form2.Free
machen.
Delphi-Quellcode:
Application.CreateForm(TForm2, Form2);
Form2.ShowModal;
Form2.Free;
Solltest du die Form2 mit einem
Show
aufrufen, solltest du der Empfehlung mit dem
Action := caFree;
nachkommen.
In dem von dir erwähnten Button der Form1 machst du ein
Form2.Show
. Das änderst du nun wie folgt:
Delphi-Quellcode:
Application.CreateForm(TForm2, Form2);
Form2.Show;
Da du im OnClose der Form2 ein
Action := caFree
eingebaut hast, sollte dann alles wie gewünscht funktionieren.
Diese Vorgehensweise würde übrigens auch mit ShowModal funktionieren.
An ein paar Kommentatoren:
- Es ist mir neu, dass Application.CreateForm prüft, ob die Form schon existiert.
- Eine Prüfung, ob die Form schon existiert ist nicht trivial (für einen Anfänger). Ja, ich weiß, wie es geht, will aber die Verwirrung in Grenzen halten.
- Kotzt doch bitte für einen Anfänger nicht einfach Source hin, ohne ihn zu erläutern.