Discussion:
.Hide, .Visibe, .Showmodal - Problem
(zu alt für eine Antwort)
Stefan Koschke
2004-01-27 10:25:15 UTC
Permalink
Hallo zusammen,

ich verstehe die Welt nicht mehr :
Ich habe eine Form, welches modal geöffner wird um eine Grafik anzuzeigen
Form2.Showmodal;
Das funktioniert natürlich.
Nun kann ich mein Programm durch Aufruf mit einer Verknüpfung starten (es
wird immer die schon laufende Instanz des Programms aktiviert.
Deshalb habe ich eine Abfrage, ob die Form schon sichtbar ist und schließe
sie um sie danach wieder modal mit den neuen Daten anzuzeigen:
if form2.visible = true then
form2.hide;
..Code um den Forminhalt zu aktualisieren
form2.showmodal;
Nun bekomme ich genau da eine Exception, daß aus einem sichtbaren Fenster
kein modales gemacht werden kann.
Wieso zum Teufel ist die Form sichtbar?

Kann mir bitte jemand einen Tip geben?

Ciao
Stefan
Sascha-Carsten Wedler
2004-01-27 10:39:23 UTC
Permalink
Hallo
Post by Stefan Koschke
if form2.visible = true then
form2.hide;
..Code um den Forminhalt zu aktualisieren
form2.showmodal;
Nun bekomme ich genau da eine Exception, daß aus einem sichtbaren Fenster
kein modales gemacht werden kann.
Wieso zum Teufel ist die Form sichtbar?
Mit hide schließt du es nicht. Es ist noch da, aber nicht mehr modal und
sichtbar.
Tja...und aus einem sichbaren kann man halt kein modales machen :-)
Mit Form2.ModalResult := mrOK oder Form2.Close müßte es klappen.
Sonst ist das Fenster noch "modal".

--
die sieben hat was schräges, wenn sie shift.
www.delphi-orakel.de
Marian Aldenhoevel
2004-01-27 11:21:50 UTC
Permalink
Hi,
Post by Stefan Koschke
if form2.visible = true then
form2.hide;
Ein modales Formular wirst Du so nicht los. Dazu brauchst Du Close,
oder eine Zuweisung an Modalresult.

Ciao, MM
--
Rosenhain 23, 53123 Bonn - Fon +49 228 6203366, Fax +49 228 624031
www.marian-aldenhoevel.de
"Time is natures way to make sure everything does not happen at once"
Stefan Koschke
2004-01-27 11:16:42 UTC
Permalink
Hallo Marian,
Post by Marian Aldenhoevel
Hi,
Post by Stefan Koschke
if form2.visible = true then
form2.hide;
Ein modales Formular wirst Du so nicht los. Dazu brauchst Du Close,
oder eine Zuweisung an Modalresult.
ich habe es auch mit Close und Modalresult versucht, selbst der Debugger
zeigt Form2.Visible=false direkt vor Aufruf des ShowModal !
Trotzdem die Meldung "aus einem sichtbaren Fenster kann kein modales
werden!"

Ciao
Stefan
Mike Lischke
2004-01-27 17:27:45 UTC
Permalink
Hi Stefan Koschke,
Post by Stefan Koschke
ich habe es auch mit Close und Modalresult versucht, selbst der Debugger
zeigt Form2.Visible=false direkt vor Aufruf des ShowModal !
Trotzdem die Meldung "aus einem sichtbaren Fenster kann kein modales
werden!"
Ich habe schon oft bemerkt, dass Delphi "außer Tritt" gerät, was die Sichtbarkeit von Fenstern angeht. Im Zweifelsfall schiebst du nach Visible := False noch ein ShowWindow(Window.Handle, SW_HIDE); nach.

Mike
--
www.delphi-gems.com
www.lischke-online.de
Lothar Armbruester
2004-01-27 17:51:45 UTC
Permalink
Post by Stefan Koschke
Hallo Marian,
Post by Marian Aldenhoevel
Hi,
Post by Stefan Koschke
if form2.visible = true then
form2.hide;
Ein modales Formular wirst Du so nicht los. Dazu brauchst Du Close,
oder eine Zuweisung an Modalresult.
ich habe es auch mit Close und Modalresult versucht, selbst der Debugger
zeigt Form2.Visible=false direkt vor Aufruf des ShowModal !
Trotzdem die Meldung "aus einem sichtbaren Fenster kann kein modales
werden!"
Mal so ins Blaue geraten:
Pack mal ein Application.ProcessMessages hinter das Form2.Close.
Vielleichts klappt's dann ja mit der Nachbarin. :-)

Und tschüss,
Lothar
--
Lothar Armbrüster | ***@oktagramm.de
Hauptstr. 26 | ***@heptagramm.de
D-65346 Eltville | ***@t-online.de
Stefan Koschke
2004-01-28 07:43:58 UTC
Permalink
Hallo Lothar,
Post by Lothar Armbruester
Post by Stefan Koschke
ich habe es auch mit Close und Modalresult versucht, selbst der Debugger
zeigt Form2.Visible=false direkt vor Aufruf des ShowModal !
Trotzdem die Meldung "aus einem sichtbaren Fenster kann kein modales
werden!"
Pack mal ein Application.ProcessMessages hinter das Form2.Close.
Vielleichts klappt's dann ja mit der Nachbarin. :-)
mit der nachbarin habe ich keine Probleme, aber das ProcessMessages hatte
ich schon probiert, ohne Erfolg :-(

Ich habe jetzt eine "Krücke" eingebaut :
if Form2.visible = true then
Form2.Show
else
Form2.ShowModal;
Damit wird das Fenster erstmalig modal geöffnet und wenn es schon sichtbar
ist, eben nicht modal, verhält sich aber dann im weiteren Programmablauf
weiterhin wie modal, also Form1 ist nicht aktiv!

Ciao
Stefan
Sascha-Carsten Wedler
2004-01-28 09:15:46 UTC
Permalink
Hallo
Post by Stefan Koschke
if Form2.visible = true then
Form2.Show
else
Form2.ShowModal;
Damit wird das Fenster erstmalig modal geöffnet und wenn es schon sichtbar
ist, eben nicht modal, verhält sich aber dann im weiteren Programmablauf
weiterhin wie modal, also Form1 ist nicht aktiv!
nur um mich nochmal unqualifiziert einzumischen...
ich glaube das das Problem eigentlich darin besteht, das
das Hautpfenster beim "neustart" der Anwendung den
Fokus erhält , während das andere Form noch Modal ist.
Vielleicht solltest Du mal schauen ob du in der Funktion
die das mehrfache starten verhindert was drehen kannst...

--
die sieben hat was schräges, wenn sie shift.
www.delphi-orakel.de
Christian NineBerry Schwarz
2004-01-28 15:50:16 UTC
Permalink
Hallo Stefan
Post by Stefan Koschke
if Form2.visible = true then
Form2.Show
else
Form2.ShowModal;
Hast du mein Posting gesehen?
Post by Stefan Koschke
Damit wird das Fenster erstmalig modal geöffnet und wenn es schon
sichtbar ist, eben nicht modal, verhält sich aber dann im weiteren
Programmablauf weiterhin wie modal, also Form1 ist nicht aktiv!
Das ist klar, weil wie gesagt die Methode ShowModal weiterhin läuft!

Könntest du vielleicht auf meine Frage des Designs eingehen?

Traubensaft gibt Traubenkraft

Christian "NineBerry" Schwarz
--
Lebensborn - Built up somewhere in Germany
Lebensborn - Was made for racial policy
Lebensborn - A fateful part in history
Lebensborn - Invigorate democracy!
Stefan Koschke
2004-01-29 07:30:06 UTC
Permalink
Hallo Christian,
Post by Christian NineBerry Schwarz
Hallo Stefan
Hast du mein Posting gesehen?
ja
Post by Christian NineBerry Schwarz
Könntest du vielleicht auf meine Frage des Designs eingehen?
Der Ablauf ist folgender :
Programm ist gestartet, Form1 ist Hauptform. Dann kann (muß aber nicht)
Form2 Grafikform modal angezeigt sein.
Per WMCopyData bekommt das Programm die Info, daß es von außen durch
Doppelklick auf eine Grafikdatei ein zweites Mal gestartet werden soll (was
mit JclAppInstances verhindert wird) und jetzt neue Daten bearbeiten und
grafisch anzeigen soll.
Diese Routine zum Neuanzeigen der Grafik stellt ModalResult der Grafikform =
1, ruft Close auf usw. trotzdem die beschriebene Fehlermeldung.
Mit der von mir beschriebenen "Krücke" läuft es jetzt.

Ciao
Stefan
Stefan Koschke
2004-01-29 08:19:36 UTC
Permalink
Hallo zusammen,

hier noch ein Nachtrag, der vielleicht Klärung bringen könnte:

Ich habe jetzt mal schrittweise getestet, wie die Visible Eigenschaft meines
Grafikfensters aussieht:
true wenn es normal das erste Mal modal angezeigt ist
true nach Form2.modalresult := 1 !!!
true nach Form2.close !!!
Was mich allerdings dabei auch wundert : selbst mit F7 wird nach Form2.close
nicht in diese Routine gesprungen?
Irgendwie verstehe ich das nicht mehr :-(((

Ciao
Stefan
Christian NineBerry Schwarz
2004-01-29 12:50:23 UTC
Permalink
Hallo Stefan
Post by Stefan Koschke
Ich habe jetzt mal schrittweise getestet, wie die Visible
Die Erklärung des Phänomens habe ich bereits in meinem Posting
geliefert. Die visible-Eigenschaft ist nicht das entscheidende, sondern
der Ablauf der Methode ShowModal (Flag fsModal, DisableTaskWindows /
EnableTaskWindows).

Marian hat wohl die geschickteste Lösung vorgeschlagen: Das modale
Fenster gar nicht erst schließen und neu öffnen, sondern einfach das
darin angezeigte Bild austauschen.

Traubensaft gibt Traubenkraft

Christian "NineBerry" Schwarz
--
Lebensborn - Built up somewhere in Germany
Lebensborn - Was made for racial policy
Lebensborn - A fateful part in history
Lebensborn - Invigorate democracy!
Stefan Koschke
2004-01-29 14:32:29 UTC
Permalink
Hallo Christian,
Post by Christian NineBerry Schwarz
Hallo Stefan
...
Post by Christian NineBerry Schwarz
Marian hat wohl die geschickteste Lösung vorgeschlagen: Das modale
Fenster gar nicht erst schließen und neu öffnen, sondern einfach das
darin angezeigte Bild austauschen.
genau das mache ich jetzt und es funktioniert zur vollsten Zufriedenheit
:-)))

Ciao
Stefan

Marian Aldenhoevel
2004-01-29 09:04:19 UTC
Permalink
Hi,
Post by Stefan Koschke
Programm ist gestartet, Form1 ist Hauptform. Dann kann (muß aber nicht)
Form2 Grafikform modal angezeigt sein.
Per WMCopyData bekommt das Programm die Info, daß es von außen durch
Doppelklick auf eine Grafikdatei ein zweites Mal gestartet werden soll (was
mit JclAppInstances verhindert wird) und jetzt neue Daten bearbeiten und
grafisch anzeigen soll.
Male Dir mal den Kontrollfluss in dieser Anwendung auf. Dann dürftest
Du verstehen warum das nicht wie erwartet funktioniert.

Mein Tip mit Close und Modalresult bezog sich auf Aktionen des modalen
Fensters selbst. Hier kann das nicht funktionieren.

Dein Design klingt etwas fragwürdig. Warum zum Beispiel ist das
Grafikfenster modal? Normalerweise macht man das, weil die Aktion dort
abgeschlossen werden muss bevor das Programm sinnvoll weitermachen kann.
In Deinem Fall ist es aber eher ein ganz normales nicht modales Fenster.

Eine Möglichkeit Dein Problem zu lösen besteht darin, den Ablauf mit
PostMessage wieder "auseinanderzurollen". Dazu würdest Du Dir beim
WM_COPYDATA die nötigen Daten merken. Dann würdest Du eine Nachricht
an den modalen Dialog posten und eine an das Hauptfenster um den Dialog
neu zu öffnen.

Eine zweite Möglichkeit besteht darin, das Laden des Bildes nur im
modalen Fenster zu machen. Dann bräuchtest Du es nicht zu verstecken.

Ciao, MM
--
Rosenhain 23, 53123 Bonn - Fon +49 228 6203366, Fax +49 228 624031
www.marian-aldenhoevel.de
"Time is natures way to make sure everything does not happen at once"
Stefan Koschke
2004-01-29 11:44:19 UTC
Permalink
Hallo Marian,
Post by Marian Aldenhoevel
Hi,
...
Post by Marian Aldenhoevel
Dein Design klingt etwas fragwürdig. Warum zum Beispiel ist das
Grafikfenster modal? Normalerweise macht man das, weil die Aktion dort
abgeschlossen werden muss bevor das Programm sinnvoll weitermachen kann.
In Deinem Fall ist es aber eher ein ganz normales nicht modales Fenster.
Du hast Recht, ich möchte aber nicht, daß der Anwender in der Hauptform
Aktionen auslöst, während eine Grafik angezeigt wird, deshalb Modal, was mir
jedoch jetzt auf die Füße fällt...
Post by Marian Aldenhoevel
Eine Möglichkeit Dein Problem zu lösen besteht darin, den Ablauf mit
PostMessage wieder "auseinanderzurollen". Dazu würdest Du Dir beim
WM_COPYDATA die nötigen Daten merken. Dann würdest Du eine Nachricht
an den modalen Dialog posten und eine an das Hauptfenster um den Dialog
neu zu öffnen.
mühsam, weil das Ganze noch etwas komplizierter ist und ich den Ablauf etwas
vereinfacht dargestellt habe.
Post by Marian Aldenhoevel
Eine zweite Möglichkeit besteht darin, das Laden des Bildes nur im
modalen Fenster zu machen. Dann bräuchtest Du es nicht zu verstecken.
genau das werde ich tun, warum bin ich nicht selbst darauf gekommen?
Vielen Dank !

Ciao
Stefan
Loading...