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 3 von 4     123 4      
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#21

AW: Formular neu createn?

  Alt 20. Apr 2017, 09:55
Hallo,
warum wird hier immer Form.Show benutzt *wunder ?

An den Thread-Ersteller:
Ist Form2 modal, d.h. erst wenn Form2 geschlossen wird, kann mit Form1 weitergearbeitet werden?
Heiko
  Mit Zitat antworten Zitat
Maurooon

Registriert seit: 7. Dez 2016
70 Beiträge
 
#22

AW: Formular neu createn?

  Alt 20. Apr 2017, 15:38
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.
Es ist richtig, dass ich alle Formulare bei Programmstart erzeuge und dann immer nur noch "showe" und "hide" bzw sie zeige und verstecke. Und du hast recht, dass ich nun noch verwirrter bin als vorher. Ich bedanke mich aber an dieser Stelle für alle Antworten und vorallem für deine hier.

Um ein bisschen konkreter zu werden: es geht um ein Spiel. Mit dem Button auf der ersten Form starte ich das Spiel und wechsele zu einer anderen Form indem ich diese nur zeige nicht erzeuge (wurde sie ja schon). Nachdem man das Spiel jetzt gespielt hat, die Form schließt (bzw. versteckt) und dann aber nochmal das Spiel spielen will, findet man es vor wie am Ende. Das soll so aber nicht sein. Deshalb suche ich nach einer Möglichkeit, entweder die Form nach Schließung bzw. nach verstecken wieder zurückzusetzen oder über einen Neustart-Button die Form direkt neu zu erzeugen. Irgendwie muss das doch gehen :/
Hab auch schon viel gesucht im Internet aber man findet überall (wie auch hier jetzt) unterschiedliche Möglichkeiten und deshalb ist es schwer für mich als Anbfänger herauszufilter, was jetzt genau DAS ist was funktioniert und was das richtige ist für mich.

Wenn also jemand so lieb wäre und mir für meinen Fall eine funktionierende Lösungung nicht einfach nur zu schreiben sondern auch zu erklären (ich verwende sehr ungern Code den ich nicht verstehe - macht ja auch keinen Sinn), wäre ich demjenigen sehr verbunden. Am besten erklärt ihr mir ob und wenn ja was ich zu den uses hinzufügen muss, und in welche Form ich jetzt was in welches Event schreiben muss. Ich habe denke ich schon einiges verstanden, nur muss man die Unordnung in meinem Kopf noch ein kleinwenig ordnen.

Trotzdem schonmal wie gesagt ein herzliches Dankeschön an jeden Antworter. Ich weiß, dass es jeder nur gut meint. Habt trotzdem ein bisschen Verständnis, dass ich eben noch ein sogenannter Noob bin.

Liebe Grüße
"One of the basic rules of the universe is that nothing is perfect. Perfection simply doesn't exist... Without imperfection, neither you nor I would exist." - Stephen Hawking
  Mit Zitat antworten Zitat
Maurooon

Registriert seit: 7. Dez 2016
70 Beiträge
 
#23

AW: Formular neu createn?

  Alt 20. Apr 2017, 15:39
Hallo,
warum wird hier immer Form.Show benutzt *wunder ?

An den Thread-Ersteller:
Ist Form2 modal, d.h. erst wenn Form2 geschlossen wird, kann mit Form1 weitergearbeitet werden?
Ehm also wie gesagt wenn ich zurück zum Hauptmenü gehe mache ich nur
Code:
Form2.hide;
und wenn ich wieder spielen will
Code:
Form1.hide;
und
Code:
Form2.show;
was jetzt modal bedeutet weiß ich leider nicht
"One of the basic rules of the universe is that nothing is perfect. Perfection simply doesn't exist... Without imperfection, neither you nor I would exist." - Stephen Hawking
  Mit Zitat antworten Zitat
Maurooon

Registriert seit: 7. Dez 2016
70 Beiträge
 
#24

AW: Formular neu createn?

  Alt 20. Apr 2017, 15:47
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.
Nach dreimaligem durchlesen habe ich es glaube ich tatsächlich verstanden. In den Projektoptionen stelle ich ein, dass Form2 nicht von Anfang an erzeugt wird und schreibe dann in den Button auf der ersten Form nicht nur Form2.show; sondern
Delphi-Quellcode:
Application.CreateForm(TForm2, Form2);
Form2.Show;
und in den Code von der zweiten Form welche ich über eine Messagebox schließen kann folgendes:
Delphi-Quellcode:
if Application.MessageBox('Zurück zum Hauptmenü?', 'Meldung', MB_ICONWARNING or MB_OKCANCEL) = IDOK then begin
   Form2.Hide;
   Action := caFree; //ist Action eine Variable die ich vorher irgendwo initalisieren muss?
end;
Ich bitte um Bestätigung oder Anweisungen wie es wirklich geht
"One of the basic rules of the universe is that nothing is perfect. Perfection simply doesn't exist... Without imperfection, neither you nor I would exist." - Stephen Hawking
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73
Online

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

AW: Formular neu createn?

  Alt 20. Apr 2017, 15:54
und in den Code von der zweiten Form welche ich über eine Messagebox schließen kann folgendes:
Delphi-Quellcode:
if Application.MessageBox('Zurück zum Hauptmenü?', 'Meldung', MB_ICONWARNING or MB_OKCANCEL) = IDOK then begin
   Form2.Hide;
   Action := caFree; //ist Action eine Variable die ich vorher irgendwo initalisieren muss?
end;
Ich bitte um Bestätigung oder Anweisungen wie es wirklich geht
Anstatt Hide, verwendest du Close. Und das Action := caFree kommt in das Ereignis onClose des Formulars (Action ist dort schon als var Parameter deklariert).
  Mit Zitat antworten Zitat
Maurooon

Registriert seit: 7. Dez 2016
70 Beiträge
 
#26

AW: Formular neu createn?

  Alt 20. Apr 2017, 16:04
und in den Code von der zweiten Form welche ich über eine Messagebox schließen kann folgendes:
Delphi-Quellcode:
if Application.MessageBox('Zurück zum Hauptmenü?', 'Meldung', MB_ICONWARNING or MB_OKCANCEL) = IDOK then begin
   Form2.Hide;
   Action := caFree; //ist Action eine Variable die ich vorher irgendwo initalisieren muss?
end;
Ich bitte um Bestätigung oder Anweisungen wie es wirklich geht
Anstatt Hide, verwendest du Close. Und das Action := caFree kommt in das Ereignis onClose des Formulars (Action ist dort schon als var Parameter deklariert).
ich bekomme folgenden Fehler:
Error: Incompatible type for arg no. 1: Got "TCloseAction", expected "TBasicAction"
"One of the basic rules of the universe is that nothing is perfect. Perfection simply doesn't exist... Without imperfection, neither you nor I would exist." - Stephen Hawking
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73
Online

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

AW: Formular neu createn?

  Alt 20. Apr 2017, 16:10
ich bekomme folgenden Fehler:
Error: Incompatible type for arg no. 1: Got "TCloseAction", expected "TBasicAction"
Zeig mal deinen Code.
  Mit Zitat antworten Zitat
Maurooon

Registriert seit: 7. Dez 2016
70 Beiträge
 
#28

AW: Formular neu createn?

  Alt 20. Apr 2017, 16:13
ich bekomme folgenden Fehler:
Error: Incompatible type for arg no. 1: Got "TCloseAction", expected "TBasicAction"
Zeig mal deinen Code.
Code:
procedure TForm2.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  Action := caFree;
end;
"One of the basic rules of the universe is that nothing is perfect. Perfection simply doesn't exist... Without imperfection, neither you nor I would exist." - Stephen Hawking
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73
Online

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

AW: Formular neu createn?

  Alt 20. Apr 2017, 16:16
Code:
procedure TForm2.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  CloseAction := caFree;
end;
Bei dir (deiner Delphi-Version) heißt es wohl CloseAction.
  Mit Zitat antworten Zitat
Maurooon

Registriert seit: 7. Dez 2016
70 Beiträge
 
#30

AW: Formular neu createn?

  Alt 20. Apr 2017, 16:54
Ich habe ein Problem.

Wenn ich die zweite Form schließe über die Messagebox wie bereits erwähnt, stürzt das Programm ab und zeigt mir einen Error in einer Zeile, in der ich eine simple if-Anweisung abfrage über die Position eines Images auf der Form. An dieser Zeile dürfte nichts falsch sein weil sie vorher ohne Probleme funktioniert hat. Nur seit ich die Form schließe und etwas in OnClose habe stürzt das Programm immer ab. Weiß jemand wieso?
"One of the basic rules of the universe is that nothing is perfect. Perfection simply doesn't exist... Without imperfection, neither you nor I would exist." - Stephen Hawking
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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:29 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