Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Problem mit verschiedenen Forms (https://www.delphipraxis.net/196038-problem-mit-verschiedenen-forms.html)

DomPerle 17. Apr 2018 13:47

Problem mit verschiedenen Forms
 
Habe jetzt schon lange in den Themen gesucht, aber noch nicht das richtige gefunden.
Meine Anwendung besteht aus Form1, Form2, Form3.

In Form1 Button1Click startet Form2 und Button2Click startet Form3.
Form3 := TForm3.Create( Self );
Form3.Show;
äquivalent
Form4 := TForm3.Create( Self );
Form4.Show;
Form3 und Form4 sollen gleichzeitig sichtbar sein.
Wird in Form1 ein anderes Member ausgewählt, so möchte ich erreichen, daß Form3 und/oder Form4 falls geöffnet, geschlossen werden.
Bei Form3.Close bzw. Form4.Close erhalte ich 'AccessViolation'.
Ausserdem werden bei Button1Click bzw. Button2Click immer neue Fenster göffnet.
Beim Form3.ShowModal bzw. Form4.ShowModal läßt sich immer nur eines der beiden Fenster öffnen.

Ich hoffe ich habe mich für einen Anfänger klug genug ausgedrückt.
Für schnelle Hilfe bedanke ich mich jetzt schon.

günni0 17. Apr 2018 14:43

AW: Problem mit verschiedenen Forms
 
Ich bin ja kein großer Freund davon, Fenster selber zu erzeugen.
Die IDE ist eine relativ gute IDE, wo man vieles nicht mehr von Hand machen muss. Lasse deine Fensterinstanzen doch alle beim Programmstart automatisiert erzeugen, und vergiss das TFormX.Create().
Dann brauchst du nur noch .Show und .Close und es gibt keine Zugriffgsverletzungen mehr.

Zitat:

Beim Form3.ShowModal bzw. Form4.ShowModal läßt sich immer nur eines der beiden Fenster öffnen.
Das ist ja auch der Sinn eines modalen Fensters :P

rapante 17. Apr 2018 14:52

AW: Problem mit verschiedenen Forms
 
Hallo DomPerle,
zeig doch mal deinen bisherigen Quelltext, dann fällt es eventuell leichter das Problem ausfindig zu machen.

bernau 17. Apr 2018 15:25

AW: Problem mit verschiedenen Forms
 
Zitat:

Zitat von günni0 (Beitrag 1399553)
Ich bin ja kein großer Freund davon, Fenster selber zu erzeugen.
Die IDE ist eine relativ gute IDE, wo man vieles nicht mehr von Hand machen muss. Lasse deine Fensterinstanzen doch alle beim Programmstart automatisiert erzeugen, und vergiss das TFormX.Create().
Dann brauchst du nur noch .Show und .Close und es gibt keine Zugriffgsverletzungen mehr.

Zitat:

Beim Form3.ShowModal bzw. Form4.ShowModal läßt sich immer nur eines der beiden Fenster öffnen.
Das ist ja auch der Sinn eines modalen Fensters :P

Neee. Oder? Nicht dein Ernst.

Für mich ist das schlimmste, wenn alle Fenster beim Programmstart erzeugt werden. Ein Projekt von mir hat ca. verschiedene 300 Forms. Wie lange soll das denn starten?:shock:

Bei nicht modalen Fenstern ist es auch mal erlaubt mehrere Instanzen der Form zu öffnen. Dann kommst du ohnehin nicht um ein TForm.Create herum.

günni0 17. Apr 2018 15:39

AW: Problem mit verschiedenen Forms
 
Zitat:

Neee. Oder? Nicht dein Ernst.
Doch ist mein Ernst. Nicht jeder hat aber auch 300 Formulare.
ich beispielsweise habe 29 und die werden innerhalb 250 Millisekunden geladen. Bis die vom Nutzer eingestellte Sprache übernommen und allen Einstellungen geladen wurden, noch einmal 110 Millísekunden. Ist jetzt kein Weltuntergang in meinem Fall.

ich gelobe Besserung, versprochen, indem ich meinen schändlichen Code... verbessere :P

himitsu 17. Apr 2018 16:26

AW: Problem mit verschiedenen Forms
 
Auch Modale Forms kann man mehrmals erzeugen.

Nimm z.B. eine TForm1, da drauf ein Button und darin dann
Delphi-Quellcode:
F := TForm1.Create(Self);
F.ShowModal;
Aber gerade dann, wenn Forms mehrfach erzeugt werden, darf man die globalen Form-Variablen vom Delphi nicht mehr benutzen.

Und bei Freigabe der Forms werden diese globalen Variablen nicht automatisch auf NIL gesetzt. Ein Publisched-Field im Owner der neuen Form würde automatisch NIL, wenn es genau so heißt, wie die neue Form (aber in diesem Owner darf/kann es dann auch nur je eine einzige Instanz geben)

hoika 17. Apr 2018 16:54

AW: Problem mit verschiedenen Forms
 
Hallo,
das ja zwei Fragen.

Zitat:

Ausserdem werden bei Button1Click bzw. Button2Click immer neue Fenster göffnet.
Du erzeugst ja auch jedes Mal mit TFormx.Create ein neues Fenster.
Delphi-Quellcode:
Form3 := TForm3.Create( Self );
Form3.Show;
Delphi-Quellcode:
if Form3=nil then
begin
  Form3 := TForm3.Create( Self );
end;
Form3.Show;
Zitat:

Bei Form3.Close bzw. Form4.Close erhalte ich 'AccessViolation'.
Wo genau?

Nimm besser
FreeAndNil(Form3);


Die Frage wäre hier auch noch, wer schließt Form3 und Form 4, in meinem Fall hier ist es das Hauptformular (Form1).
Sollte Form3 sich selber schließen wollen, rufst du Close in Form3 auf (Form3.Close wäre das gleiche, muss aber nicht, macht man auch nicht).
Dann musst du dem Hauptform irgendwie beibringen, das die globale Variable Form3 auf nil gesetzt werden muss.

günni0 17. Apr 2018 17:08

AW: Problem mit verschiedenen Forms
 
Zitat:

Dann musst du dem Hauptform irgendwie beibringen, das die globale Variable Form3 auf nil gesetzt werden muss.
Ich habe irgendwo mal gelesen, dass sich für solche Fälle (Fenster öffnen, erstellen, schließen, bekannt-machen und so) jemand eine Art Wrapper-Unit geschrieben hat, die für all das zuständig ist und auch über alles bescheid weiß.
Also im Prinzip eine einfache Unit die alles macht, tut, weiß und super-schlau ist.

Vielleicht hilft sowas ja.

hoika 17. Apr 2018 17:09

AW: Problem mit verschiedenen Forms
 
Hallo,
das wäre eine gute Entkopplung von Hauptformular.

DP-Maintenance 17. Apr 2018 19:48

Dieses Thema wurde am "17. Apr 2018, 20:48 Uhr" von "Daniel" aus dem Forum "Fragen / Anregungen zur DP" in das Forum "GUI-Design mit VCL / FireMonkey / Common Controls" verschoben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:53 Uhr.
Seite 1 von 3  1 23      

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