Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   FreePascal Formular neu createn? (https://www.delphipraxis.net/192455-formular-neu-createn.html)

Olli73 19. Apr 2017 20:54

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:
Action := caFree;
einbauen oder das Formualar mit
Delphi-Quellcode:
.Free
(oder
Delphi-Quellcode:
.Release
) freigeben.

Darlo 19. Apr 2017 20:55

AW: Formular neu createn?
 
Zitat:

Zitat von t.roller (Beitrag 1368322)
Das geht so:

Da fehlt das ungefähr 😉
Nach dem Schließen des form sollte dieses freigegeben werden und vor dem Erzeugen besser noch Prüfen ob bereits vorhanden.

t.roller 19. Apr 2017 21:28

AW: Formular neu createn?
 
Zitat:

Zitat von Darlo (Beitrag 1368324)
Zitat:

Zitat von t.roller (Beitrag 1368322)
Das geht so:

Da fehlt das ungefähr 😉
Nach dem Schließen des form sollte dieses freigegeben werden und vor dem Erzeugen besser noch Prüfen ob bereits vorhanden.

zu 1: Self.Free; angefügt nach Close;
zu 2: doppelt gemoppelt:
procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference); prüft das selbst.

Jasocul 20. Apr 2017 08:00

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:
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
Delphi-Quellcode:
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
Delphi-Quellcode:
Form2.Free
machen.
Delphi-Quellcode:
Application.CreateForm(TForm2, Form2);
Form2.ShowModal;
Form2.Free;
Solltest du die Form2 mit einem
Delphi-Quellcode:
Show
aufrufen, solltest du der Empfehlung mit dem
Delphi-Quellcode:
Action := caFree;
nachkommen.

In dem von dir erwähnten Button der Form1 machst du ein
Delphi-Quellcode:
Form2.Show
. Das änderst du nun wie folgt:
Delphi-Quellcode:
Application.CreateForm(TForm2, Form2);
Form2.Show;
Da du im OnClose der Form2 ein
Delphi-Quellcode:
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.

Darlo 20. Apr 2017 08:07

AW: Formular neu createn?
 
Zitat:

Zitat von Jasocul (Beitrag 1368346)
[*]Kotzt doch bitte für einen Anfänger nicht einfach Source hin, ohne ihn zu erläutern.

Hinkotzen tut hier glaube ich keiner etwas, da jeder hier i.d.R. helfen möchte. Die Befehle
Delphi-Quellcode:
create, free, assigned
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...

sko1 20. Apr 2017 08:21

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:
    Application.CreateForm(TFormMain, FormMain);

oder mit

    FormMain := TFormMain.Create(Nil);
Ciao
Stefan

Jasocul 20. Apr 2017 08:25

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.

sko1 20. Apr 2017 08:39

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

Darlo 20. Apr 2017 08:41

AW: Formular neu createn?
 
Zitat:

Zitat von sko1 (Beitrag 1368348)
Ich klinke mich hier mal kurz ein:

wo liegt der wesentliche Unterschied, ob man zur Laufzeit ein Formular erzeugt mit

Delphi-Quellcode:
    Application.CreateForm(TFormMain, FormMain);

oder mit

    FormMain := TFormMain.Create(Nil);
Ciao
Stefan

Soweit ich das im Kopf habe wird mit dem Konstruktor in Variante #2 auch das OnCreate ausgelöst, jedoch ist im onCreate dann FormMain noch nicht bekannt sondern = nil -> crash wenn man statt self.xy FormMain.xy aufruft.

Jasocul 20. Apr 2017 08:45

AW: Formular neu createn?
 
Zitat:

Zitat von Darlo (Beitrag 1368352)
...crash wenn man statt self.xy FormMain.xy aufruft.

Richtig. Ein absolutes NoGo. Leider machen das trotzdem einige Programmierer.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:19 Uhr.
Seite 2 von 4     12 34      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz