AGB  ·  Datenschutz  ·  Impressum  







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

Problem mit modalen Dialogen

Ein Thema von kaju74 · begonnen am 16. Nov 2010 · letzter Beitrag vom 26. Mai 2020
Antwort Antwort
kaju74

Registriert seit: 22. Okt 2003
185 Beiträge
 
#1

Problem mit modalen Dialogen

  Alt 16. Nov 2010, 10:36
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
Angehängte Dateien
Dateityp: zip modal_problem.zip (2,8 KB, 4x aufgerufen)

Geändert von mkinzler (16. Nov 2010 um 11:07 Uhr) Grund: Code-Tag durch delphi-Tag ersetzt
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Problem mit modalen Dialogen

  Alt 16. Nov 2010, 12:18
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
Angehängte Dateien
Dateityp: zip modal_problem.zip (4,0 KB, 9x aufgerufen)
Frank Reim
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#3

AW: Problem mit modalen Dialogen

  Alt 16. Nov 2010, 14:29
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.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#4

AW: Problem mit modalen Dialogen

  Alt 16. Nov 2010, 14:48
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
kaju74

Registriert seit: 22. Okt 2003
185 Beiträge
 
#5

AW: Problem mit modalen Dialogen

  Alt 16. Nov 2010, 17:17
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
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Problem mit modalen Dialogen

  Alt 16. Nov 2010, 17:40
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#7

AW: Problem mit modalen Dialogen

  Alt 16. Nov 2010, 19:40
ä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;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
UliTs

Registriert seit: 20. Mai 2020
Ort: 52074 Aachen
50 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Problem mit modalen Dialogen

  Alt 26. Mai 2020, 16:38
...
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 .

Uli

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


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 20:02 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