![]() |
Delphi-Version: 5
Formular neu createn?
Guten Abend,
gibt es eine Möglichkeit, per Buttonclick oder Ähnlichem eine Form zu löschen und wieder neu zu createn? Also dass man quasi nur diese eine Form neu startet als würde man neu kompilieren. Ich hoffe ihr könnt mir weiterhelfen. LG |
AW: Formular neu createn?
Ehrlich gesagt verstehe ich nur Bahnhof.
Du willst ein neues Formular haben oder ein bestehendes löschen das habe ich verstanden. Aber was hat das mit Kompilieren zu tun? |
AW: Formular neu createn?
zum Beispiel: Ich habe zwei Formen. Auf der einen habe ich einen Button über den ich zur zweiten komme. Dort bewege ich über einen weiteren Button ein Objekt von der linken oberen Ecke in die untere rechte. Wenn ich die zweite Form schließe und erneut über den ersten Button die zweite öffne, ist das Image immer noch in der unteren rechten Ecke. Ich suche jetzt nach einer Möglichkeit, eine Form zu schließen, um sie bei erneutem Öffnen so vorzufinden, wie ich sie createt habe also wie sie nach dem Kompilieren aussah.
Ich hoffe jetzt ist es etwas verständlicher :D LG |
AW: Formular neu createn?
Bist Du im Editor oder geht es um eine Frage zur Runtime?
|
AW: Formular neu createn?
Wieso dann mit Kanonen auf Spatzen schießen?
Speichere doch einfach die Originalposition des Objekts und setze es im FormShow des Formulars #2 an die Originalposition zurück. |
AW: Formular neu createn?
Zitat:
Bitte tue hier nicht so überheblich, nicht vergessen du hast auch mal angefangen. Dein Ton wird immer rauer habe ich den Eindruck. gruss |
AW: Formular neu createn?
Ja, klar geht das. Ungefähr so:
Delphi-Quellcode:
var
myform2: TForm2; begin form2.close; form2.free; myform2 := TForm2.Create(self); myform2.show; end; |
AW: Formular neu createn?
Hallo,
1. Es geht nicht um MDI? 2. Zitat:
(Form2) OnButton1Click Self.Close; erneut öffnen Form2 := TForm2.Create; Form2.ShowModal; wie ich sie createt habe das sollte genauso sein Es sei denn: Du erzeugst Form2 gar nicht bei jedem (Form1)-Button-Klick, sondern zeigst sie nur mit Form2.Show an. Dann musst du dir die Positionen im FormCreate merken und im OnShow wiederherstellen Ansonsten: Ein bisschen mehr Code wäre schön, am besten das ganze (Minimal-)Projekt als Zip. |
AW: Formular neu createn?
Zitat:
|
AW: Formular neu createn?
Das geht so:
Delphi-Quellcode:
program Project1;
uses Vcl.Forms, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas' {Form2}; {$R *.res} begin Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TForm1, Form1); // Application.CreateForm(TForm2, Form2); Application.Run; end. ---------------------- procedure TForm1.Button1Click(Sender: TObject); begin Application.CreateForm(TForm2, Form2); Form2.Show; end; ---------------------- procedure TForm2.Button1Click(Sender: TObject); begin Close; Self.Free; end; ---------------------- |
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:
|
AW: Formular neu createn?
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? |
AW: Formular neu createn?
Zitat:
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 |
AW: Formular neu createn?
Zitat:
Code:
und wenn ich wieder spielen will
Form2.hide;
Code:
und
Form1.hide;
Code:
was jetzt modal bedeutet weiß ich leider nicht :cry:
Form2.show;
|
AW: Formular neu createn?
Zitat:
Delphi-Quellcode:
sondern
Form2.show;
Delphi-Quellcode:
und in den Code von der zweiten Form welche ich über eine Messagebox schließen kann folgendes:
Application.CreateForm(TForm2, Form2);
Form2.Show;
Delphi-Quellcode:
Ich bitte um Bestätigung oder Anweisungen wie es wirklich geht:D
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; |
AW: Formular neu createn?
Zitat:
|
AW: Formular neu createn?
Zitat:
Error: Incompatible type for arg no. 1: Got "TCloseAction", expected "TBasicAction" |
AW: Formular neu createn?
Zitat:
|
AW: Formular neu createn?
Zitat:
Code:
procedure TForm2.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin Action := caFree; end; |
AW: Formular neu createn?
Zitat:
|
AW: Formular neu createn?
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? |
AW: Formular neu createn?
Zitat:
|
AW: Formular neu createn?
Hab das Problem gelöst. Trotzdem danke!
|
AW: Formular neu createn?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:29 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