![]() |
AW: Formular neu createn?
In den Beiträgen #8 und #10 sehe ich ein Speicherleck.
Close gibt standardmäßig das Formular nicht frei, sondern versteckt es nur => Entweder im OnClose des Formulars ein
Delphi-Quellcode:
einbauen oder das Formualar mit
Action := caFree;
Delphi-Quellcode:
(oder
.Free
Delphi-Quellcode:
) freigeben.
.Release
|
AW: Formular neu createn?
Zitat:
Nach dem Schließen des form sollte dieses freigegeben werden und vor dem Erzeugen besser noch Prüfen ob bereits vorhanden. |
AW: Formular neu createn?
Zitat:
zu 2: doppelt gemoppelt: procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference); prüft das selbst. |
AW: Formular neu createn?
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
Delphi-Quellcode:
gemacht werden kann, stimmt natürlich. Man sollte sich dann aber sicher sein, dass das wirklich so gewollt ist. Der nächste Aufruf
Action := caFree;
Delphi-Quellcode:
geht sonst nämlich mit einer Zugriffsverletzung in die Hose.
Form2.Show
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
Delphi-Quellcode:
machen.
Form2.Free
Delphi-Quellcode:
Solltest du die Form2 mit einem
Application.CreateForm(TForm2, Form2);
Form2.ShowModal; Form2.Free;
Delphi-Quellcode:
aufrufen, solltest du der Empfehlung mit dem
Show
Delphi-Quellcode:
nachkommen.
Action := caFree;
In dem von dir erwähnten Button der Form1 machst du ein
Delphi-Quellcode:
. Das änderst du nun wie folgt:
Form2.Show
Delphi-Quellcode:
Da du im OnClose der Form2 ein
Application.CreateForm(TForm2, Form2);
Form2.Show;
Delphi-Quellcode:
eingebaut hast, sollte dann alles wie gewünscht funktionieren.
Action := caFree
Diese Vorgehensweise würde übrigens auch mit ShowModal funktionieren. An ein paar Kommentatoren:
|
AW: Formular neu createn?
Zitat:
Delphi-Quellcode:
sind sicherlich nicht das unterste Einsteigerniveau, jedoch auch kein Hexenwerk. Mit bisschen F1 und google sollte ein Grundverständnis möglich sein. Wenns es dann noch Probleme gibt sind wir ja weiterhin da. Auch wenn es nicht immer der angenehmste Weg ist, aber mit einer Hilfe zur Selbsthilfe lernt man in meinen Augen am schnellsten und meisten...
create, free, assigned
|
AW: Formular neu createn?
Ich klinke mich hier mal kurz ein:
wo liegt der wesentliche Unterschied, ob man zur Laufzeit ein Formular erzeugt mit
Delphi-Quellcode:
Ciao
Application.CreateForm(TFormMain, FormMain);
oder mit FormMain := TFormMain.Create(Nil); Stefan |
AW: Formular neu createn?
@sko1:
Ich verwende normalerweise die zweite Variante. Die erste Variante macht noch ein paar Prüfungen und setzt z.B. gegebenenfalls die MainForm der Anwendung. |
AW: Formular neu createn?
Danke, ich habe im Prinzip auch immer die zweite Variante verwendet, außer die automatisch erzeugte Form in der dfm.
Da es scheinbar keine Nachteile gibt lass ich das auch so, hatte mich nur gewundert dass die Experten hier dem OP die erste Variante vorgeschlagen hatten. Ciao Stefan |
AW: Formular neu createn?
Zitat:
|
AW: Formular neu createn?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz