Autor |
Beitrag |
Nerzhul
      
Beiträge: 20
|
Verfasst: Mo 19.04.04 18:42
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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Martin77
      
Beiträge: 282
XP Prof
D6 Prof, D7 Personal, D7 Enterprise, D8 personal
|
Verfasst: 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 
      
Beiträge: 20
|
Verfasst: 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
      
Beiträge: 282
XP Prof
D6 Prof, D7 Personal, D7 Enterprise, D8 personal
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 19.04.04 19:02
Ein Timer ist nicht sehr elegant, finde ich. Die vorherige Prüfung ist IMHO die bessere Lösung.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Nerzhul 
      
Beiträge: 20
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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?
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Nerzhul 
      
Beiträge: 20
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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.)
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Martin77
      
Beiträge: 282
XP Prof
D6 Prof, D7 Personal, D7 Enterprise, D8 personal
|
Verfasst: 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 
      
Beiträge: 20
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 19.04.04 20:28
Das ist so ziemlich der schlimmste Missbrauch eines Timers, von dem ich je gehört habe .... 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Mo 19.04.04 20:59
Statt Timer gibt es eine wesentlich einfachere Methode..!
Delphi-Quelltext 1:
| PostMessage(Handle, WM_CLOSE, 0, 0); |
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
Nerzhul 
      
Beiträge: 20
|
Verfasst: Mo 19.04.04 21:26
Danke, mit PostMessage funktionierts wunderbar
-M
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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. 
|
|
Nerzhul 
      
Beiträge: 20
|
Verfasst: 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
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Di 20.04.04 15:45
 Habe ich auch alles schon gesagt, aber vielleicht hast Du (@Luckie) ja mehr Glück!
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|