Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Modales Fenster schließen
Nerzhul - Mo 19.04.04 18:42
Titel: Modales Fenster schließen
Hallo,
Ich habe zwei Formulare, Form1 und Form2. Von Form1 aus wird Form2 modal angezeigt. In Form2 befindet sich ein Button mit einem Modalresultwert 'mrAbort'. Wenn dieser Button gedrückt wird schließt sich Form2 automatisch und dieser Wert wird zurückgeliefert. So weit, so gut.
Ich möchte das gleiche jetzt aber auch aus einer Prozedur in Form2 heraus machen, also in etwa so
Delphi-Quelltext
1: 2: 3: 4: 5:
| if Bedingung then begin Form2.Modalresult := mrAbort; Form2.Close; end; |
Dies funktioniert so aber nicht :-( Was ist zu tun?
-M
Christian S. - Mo 19.04.04 18:51
Was funktioniert denn nicht? Wird das Formular nicht geschlossen, bekommst Du eine Fehlermeldung, explodiert der Bildschirm?
Ansich wird das Formular schon bei der Zuweisung zu ModalResult geschlossen, ein Form2.Close ist nicht mehr nötig.
Martin77 - Mo 19.04.04 18:55
Peter Lustig hat folgendes geschrieben: |
Ansich wird das Formular schon bei der Zuweisung zu ModalResult geschlossen, ein Form2.Close ist nicht mehr nötig. |
Hätte das Fast übersehen, und wollte das gleiche posten :)
Jetzt frag nicht wieso ich trotzdem poste :)
Wenn du eine Exception bekommst, dann weil das close überflüssig ist, da deine Form2 bereits im Grab liegt :)
Martin
Nerzhul - Mo 19.04.04 18:57
Also, der Code wird ausgeführt, Form2 bleibt aber geöffnet.
Kann es daran liegen, dass der Code beim OnActivate-Ereignis ausgeführt wird?
Gruß,
-M
Edit: Auch ohne Form2.Close tut sich nix...
Martin77 - Mo 19.04.04 19:00
Glaube im OnActivate kannste die Form nicht schliessen, weiss nicht ob OnShow besser ist
Wenn du die Form2 eh sofort schliesst, wieso machst du sie dann überhaupt? Dann spar dir das doch.
Ansonsten starte im OnActivate einfach nen Timer und warte dann
Martin
Christian S. - Mo 19.04.04 19:02
Ein Timer ist nicht sehr elegant, finde ich. Die vorherige Prüfung ist IMHO die bessere Lösung.
Nerzhul - Mo 19.04.04 19:08
*seufz* Mit OnShow gehts auch nicht...
Ich möchte bestimmten Code ausführen [und zwar automatisch, sobald das Fenster angezeigt wird] und das Fenster unter bestimmten Bedingungen dann automatisch schließen.
Hmmm ... dann muss ich wohl doch nen Timer nehmen, auch wenn das ziemlich stillos ist, oder? ;-)
Gruß,
-M
Christian S. - Mo 19.04.04 19:17
Wie wird denn die Bedingung bestimmt? Da im OnActivate-Ereignis in Form2 noch keine Interkation mit dem Nutzer statt gefunden haben kannn, sollte man diese Bedingung doch auch vor Aufruf von Form2.ShowModal bestimmen lassen, oder?
Nerzhul - Mo 19.04.04 19:23
Doch, es erfolgt eine Interaktion über einen Dialog [MessageDlg], der vorher aufgerufen wird. Die Bedingung an sich wird ja auch durchlaufen, nur schließen tut sich nix :-(
-M
Christian S. - Mo 19.04.04 19:36
Der MessageDlg muss doch aber nicht im OnActivate-Ereignis aufgerufen werden, oder? Den kannste doch noch in Form1 aufrufen! (Vermute ich jetzt einfach mal, am Besten postest Du mal das OnActivate-Ereignis.)
Martin77 - Mo 19.04.04 20:06
@Peter: Klar ist der Timer keine gute Lösung, aber ich habe keine bessere Lösung für mein Problem damals gefunden, ausser mir selbst eine WM_USER +X zu schicken. Und da war der Timer für das Miniprojekt sinnvoller. Da musste die Form aber auch eine gewisse Zeit offen bleiben.
Aber der Dialog kann ja vorher kommen und daraufhin entscheiden ob der Dialog angezeigt werden soll oder nicht.
Nerzhul - Mo 19.04.04 20:08
Hmmmnaja, es geht ja nicht nur um den MessageDialog. In Form2 läuft ein ganzer Prozeß [im Sinne von Anreihung von Anweisungen und Ereignissen] automatisch ab, aber darum geht es ja auch nicht.
Ich hab das jetzt so gelöst dass in Form2 ein Timer ist, der im OnActivate-Ereignis aktiviert wird. Im Timer-Ereignis wird der Timer dann wieder ausgeschaltet und der Prozeß angestoßen.
-M
Christian S. - Mo 19.04.04 20:28
Das ist so ziemlich der schlimmste Missbrauch eines Timers, von dem ich je gehört habe .... :roll:
Motzi - Mo 19.04.04 20:59
Statt Timer gibt es eine wesentlich einfachere Methode..!
Delphi-Quelltext
1:
| PostMessage(Handle, WM_CLOSE, 0, 0); |
Nerzhul - Mo 19.04.04 21:26
Danke, mit PostMessage funktionierts wunderbar :-)
-M
Delete - Di 20.04.04 00:54
Kann es sein, dass da irgendwo die Logik auf der Strecke bleibt? Wenn die Bedingung nicht erfüllt ist, dann öffne es doch gar nicht erst. :roll:
Nerzhul - Di 20.04.04 12:47
Äh, nicht alle Bedingungen stehen schon zur Entwurfs- oder zum Beginn der Laufzeit fest, sonst könnte man sich ja tatsächlich große Programmteile sparen ;-)
Gruß,
-M
Delete - Di 20.04.04 12:53
Moment. Wenn du beim Erzeugen des Fensters die Bedingung abfragen kannst, dann sollte das auch vor ShowModal möglich sein. Wenn nicht dann stimmt was nicht mit deinem Programmdesign. Das was du da jedenfalls machst ist eine Katastrophe.
Christian S. - Di 20.04.04 15:45
:lol: Habe ich auch alles schon gesagt, aber vielleicht hast Du (@Luckie) ja mehr Glück!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!