Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Problem mit modalen Dialogen (https://www.delphipraxis.net/155997-problem-mit-modalen-dialogen.html)

kaju74 16. Nov 2010 10:36

Problem mit modalen Dialogen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo.

Ich habe ein Problem, welches ich meines Wissens erst mit Delphi2010 habe. Es geht um modale Dialoge und deren Sichtbarkeit. Im Anhang habe ich mal ein Testszenario erstellt, welches das Problem demonstriert. Definiert man die Compilerdirektive "WORKING", funktioniert es, wie es sollte.

Zum Problem:

Ich habe in meiner DPR folgenden Aufbau:

Delphi-Quellcode:
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;

  SecondForm := TSecondForm.Create(Application);

  Application.CreateForm(TMainForm, MainForm);

  Application.Run;
end.
Die "SecondForm" wird dabei VOR dem eigentlichen Hauptformular erstellt, was in der realen Applikation der Einstellunsdialog ist, der bereits alle Daten in ein internen Objektmodell läd, welches das Hauptformular bereits beim Erzeugen benötigt.

Zum Demonstrationszwecken ruft die "SecondForm" ein weiteres Formular auf, das nur einen einfachen Text enthält (in der realen Applikation ist das z.Bsp. ein selbstgebauter Dialog).

Nun das Problem: Ruft man in der "SecondForm" mittels Button-Klick dieses dritte Formular auf, erscheint auf einmal wieder die "MainForm". Ist diese per Einstellung nun auf "Maximized" eingestellt, verschwindet die "SecondForm" gänzlich. WARUM?

Erzeugt man die "SecondForm" aber auf herkömmlichen Wege, also so:

Delphi-Quellcode:
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;

  Application.CreateForm(TMainForm, MainForm);
  Application.CreateForm(TSecondForm, SecondForm);

  Application.Run;
end.
...funktioniert es! Ich bilde mir ein, das dieses Verhalten mit Delphi2009 und sicher mit Delphi7 so NICHT war.

Was kann ich tun, das sich das Programm so verhält, wie es soll (also früher)?

Vielen Dank & lieben Gruß,
Marc

dataspider 16. Nov 2010 12:18

AW: Problem mit modalen Dialogen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

das Verhalten tritt bei mir auch unter Delphi 2007 auf.
Normalerweise würde ich das Formular dynamisch erzeugen und auch wieder freigeben.
Wenn du es aber immer brauchst, dann erzeuge es doch bei der ersten Verwendung.

Ich hebe dein Beispiel mal geändert. Vielleicht gefällt dir ja dieser Weg.

Frank

s.h.a.r.k 16. Nov 2010 14:29

AW: Problem mit modalen Dialogen
 
Erzeuge doch den Optionen-Dialog erst, wenn man den auch wirklich braucht. Selbst wenn der User nie den Dialog aufruft, liegt er planlos im Speicher rum. Daher solltest du dein Konzept mal überdenken!

Ich habe das im Moment so gelöst, dass ich eine Options-Klasse habe, die einen eigenen Dialog "mitführt", d.h. das Programm selbst kennt den Dialog nicht, sondern ruft lediglich eine Methode der Options-Klasse auf, wodruch der Dialog angezeigt wird. Alternativ könnte die Options-Klasse auch nur eine INI-Datei im Editor zeigen oder dergleichen. Wobei das auch nicht unbedingt optimal sein muss.

himitsu 16. Nov 2010 14:48

AW: Problem mit modalen Dialogen
 
Die erste Form, welche erstellt und an Application gebunden wird, wird automatisch zur Hauptform der Anwendung.

Lösungen:
- Secondform nicht an Application binden (ich würde aber das Andere empfehlen)
- oder TMainForm zuerst erstellen und wenn dieses erst nach der anderen Form angezeigt werden soll, dann dieses eben vorher nicht anzeigen. (Visible/Hide/Show)

Ansonsten ist es eh schöner, wenn selten/kurz benötigte Forms nicht ständig im Hintergrund geladen sind, sondern daß man sie erst erstellt, wenn nötig und danach wieder freigibt.

kaju74 16. Nov 2010 17:17

AW: Problem mit modalen Dialogen
 
Hallo.

Erstmal Danke für die Antworten...leider löst das nicht mein Problem. Es ist eine bestehende Anwendung, die sich nicht so einfach ändern lässt. In dem Einstellungsdialog wird ein Objektmodell geladen und direkt mit den Dialogelementen verknüpft. Auf dieses Objektmodell wird bereits im "OnCreate"-Abschnitt des Hauptformulars zugegriffen, daher DARF dieses Dialog nicht nach dem Hauptformular erzeugt werden. Sicher, ich könnte das alles umschreiben, aber das will ich mir ersparen.

Was mir auffällt: Mit dem Wechseln von Delphi7 auf Delphi2010 wurde auch das OS gewechselt, von Windows XP auf Windows7. Vielleicht liegt auch hier der Hund begraben, und Windows7 (oder VISTA, oder WinXP mit neuesten SP's) verfährt da neuerdings anders mit den Fenstern. Wenn das früher schon so gewesen wäre, wäre mir das aufgefallen, da das Verhalten recht unschön ist.

Lieben Gruß,
Marc

Sir Rufo 16. Nov 2010 17:40

AW: Problem mit modalen Dialogen
 
Aber wir können nichts für das Design-Problem der Anwendung.

Die MainForm ist nun mal die Basis einer GUI-Anwendung.
Somit wird diese auch als erstes erzeugt.

Im OnCreate des MainForms darauf zugreifen zu wollen ist definitiv ein Design-Fehler (wenn zu dem Zeitpunkt nicht klar ist, wo das denn herkommen soll)

Wundern sollte man sich darüber auch nicht, dass es mal funktioniert hat, sondern eher freuen, dass es bis jetzt funktioniert hat. Ich würde aber empfehlen das Laden des Objekt-Modells entsprechend zu ändern, dass es im OnCreate der MainForm nicht mehr passiert.

Schließlich befinden wir uns während dieses Events noch nicht im regulären Betrieb der Anwendung, sondern noch in deren Initialisierungsphase.

Bummi 16. Nov 2010 19:40

AW: Problem mit modalen Dialogen
 
ändere doch einfach den Aufruf, nimm es aus der automatischen Erzeugung heraus, und ändere den Zugriff auf
Delphi-Quellcode:
Function MyForm:TTheForm;
begin
if not Assigned(TheForm) then Result := TTheForm.create(Application) else Result := TheForm;
end;

UliTs 26. Mai 2020 16:38

AW: Problem mit modalen Dialogen
 
Zitat:

Zitat von dataspider (Beitrag 1061912)
...
Normalerweise würde ich das Formular dynamisch erzeugen und auch wieder freigeben.
Wenn du es aber immer brauchst, dann erzeuge es doch bei der ersten Verwendung.
...

Hallo Frank,
danke für Dein tolles Beispiel! Super einfach, braucht wenig Code und ist leicht nachträglich einzusetzen :-D .

Uli

P.S. Gibt es eigentlich einen "Danke"-Button, um Beiträge zu würdigen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:21 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