AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Formular neu createn?

Ein Thema von Maurooon · begonnen am 19. Apr 2017 · letzter Beitrag vom 20. Apr 2017
Antwort Antwort
Seite 2 von 4     12 34      
Benutzerbild von Olli73
Olli73
Online

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
755 Beiträge
 
#11

AW: Formular neu createn?

  Alt 19. Apr 2017, 21:54
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 Action := caFree; einbauen oder das Formualar mit .Free (oder .Release ) freigeben.
  Mit Zitat antworten Zitat
Darlo

Registriert seit: 28. Jul 2008
Ort: München
1.196 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#12

AW: Formular neu createn?

  Alt 19. Apr 2017, 21:55
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.
Philip
  Mit Zitat antworten Zitat
t.roller
(Gast)

n/a Beiträge
 
#13

AW: Formular neu createn?

  Alt 19. Apr 2017, 22:28
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.
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.355 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: Formular neu createn?

  Alt 20. Apr 2017, 09:00
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.
Peter
  Mit Zitat antworten Zitat
Darlo

Registriert seit: 28. Jul 2008
Ort: München
1.196 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#15

AW: Formular neu createn?

  Alt 20. Apr 2017, 09:07
[*]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 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...
Philip
  Mit Zitat antworten Zitat
sko1

Registriert seit: 27. Jan 2017
601 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#16

AW: Formular neu createn?

  Alt 20. Apr 2017, 09:21
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
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.355 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: Formular neu createn?

  Alt 20. Apr 2017, 09:25
@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.
Peter
  Mit Zitat antworten Zitat
sko1

Registriert seit: 27. Jan 2017
601 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#18

AW: Formular neu createn?

  Alt 20. Apr 2017, 09:39
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
  Mit Zitat antworten Zitat
Darlo

Registriert seit: 28. Jul 2008
Ort: München
1.196 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#19

AW: Formular neu createn?

  Alt 20. Apr 2017, 09:41
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.
Philip
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.355 Beiträge
 
Delphi 11 Alexandria
 
#20

AW: Formular neu createn?

  Alt 20. Apr 2017, 09:45
...crash wenn man statt self.xy FormMain.xy aufruft.
Richtig. Ein absolutes NoGo. Leider machen das trotzdem einige Programmierer.
Peter
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:23 Uhr.
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