![]() |
Fenster schließt sich nicht
Hallo,
in einer D11.3 VCL Anwendung habe ich ein neues Fenster hinzugefügt. Dieses wird mit ShowModal aufgerufen und hat ein Ereignis, das ich vorher zuweise welches von diesem Formular im OnShow aufgerufen wird. Dieses Ereignis Startet eine Aktion welche über ein Event eine Methode dieses Fensters aufruft um den Status der Operation anzuzeigen. Dise Methode hat u.a. einen Cound und einen Index Parameter. Sind beide gleich ist die Operation zuende und das Fenster soll geschlossen werden. Ich rufe daher Close bzw. inzwschen self.Close auf, aber es schließt sich nicht automatisch. Auch der OK Button im Fenster wird enabled (ja, im Gutfall etwas schwachsinnig, der OK Button ist eigentlich für den Fehlerfall, da soll der Dilog sich nicht automatisch schließen. Klicke ich auf OK im Fenster wird es geschlossen. Das Fenster hat keine Eventhandler für OnClose oder OnCloseQuery. Hat jemand eine Idee was ein Schließen eines Fensters mittels Close verhindern kann? Grüße TurboMagic |
AW: Fenster schließt sich nicht
Setz einfach ModalResult := mrOK; bei modalen Fenstern funktioniert Close nicht ganz so wie bei nicht-modalen.
|
AW: Fenster schließt sich nicht
Close funktioniert bei Modalen, und auch teilweise bei Nicht-Modalen.
[edit] siehe #7 und #6 Bei Modalem macht es einfach nur
Delphi-Quellcode:
, also funktional kein Unterschied zu deinem Lösungsvorschlag.
ModalResult := mrCancel;
OnClose und OnyCloseQuery wird bei Dialogen (modalen Forms) aber sowieso niemals aufgerufen. (ja, das ist IMHO ein Bug, aber der ist schon seit 20 Jahren so, also weigert sich wer das zu reparieren) Natürlich schließt Close beim Modaten das Fenster niemals sofort, sondern erst wenn ShowModal verlassen wird, also nichts die MessageLoop darin blockiert (z.B. ein Sleep oder eine Schleife im Event). Free würde es sofort schließen, daber das benutzt man hier NIEMALS, denn wenn doch, dann knallt es anschließend. |
AW: Fenster schließt sich nicht
Danke für die Tipps, werde ich baldmöglichst mal ausprobieren...
|
AW: Fenster schließt sich nicht
Zitat:
|
AW: Fenster schließt sich nicht
Zitat:
Delphi-Quellcode:
Sollte das bei dir nicht funktionieren, dann liegt das vermutlich nicht an Delphi. Vielleicht stimmt auch was mit deinem TestCase nicht.
procedure TCustomForm.CloseModal;
var CloseAction: TCloseAction; begin try CloseAction := caNone; if CloseQuery then begin CloseAction := caHide; DoClose(CloseAction); end; case CloseAction of caNone: ModalResult := 0; caFree: Release; end; except ModalResult := 0; Application.HandleException(Self); end; end; |
AW: Fenster schließt sich nicht
OK, hab nur nach Close geguckt.
Seh ich es richtig, oder verändert dieses Mistteil von CloseModal bösartig das ModalResult? Von mrCancel zu mrNone, worauf dann wirklich die Form nicht mehr geschlossen wird. :wall: Wer denkt sich soeinen Scheißdreck aus? ![]()
Delphi-Quellcode:
procedure TCustomForm.Close;
var CloseAction: TCloseAction; begin if fsModal in FFormState then ModalResult := mrCancel <<<<<<<<<<< else if CloseQuery then begin if FormStyle = fsMDIChild then if biMinimize in BorderIcons then CloseAction := caMinimize else CloseAction := caNone else CloseAction := caHide; DoClose(CloseAction); if CloseAction <> caNone then if Application.MainForm = Self then Application.Terminate else if CloseAction = caHide then Hide else if CloseAction = caMinimize then WindowState := wsMinimized else Release; end; end;
Delphi-Quellcode:
Echt mal, warum kann man nicht an der Stelle einen Kommentar rein tun?
function TCustomForm.ShowModal: Integer;
begin ... ModalResult := 0; repeat ... Application.HandleMessage; if Application.Terminated then ModalResult := mrCancel else if ModalResult <> 0 then CloseModal; until ModalResult <> 0; Also dass Teile aus dem Else "hier" oben auch gemacht werden, nur nicht hier, sondern erst später in ShowModal->CloseModal, vorm Ende der Schleife. (außer wenn Terminated) Das protected CloseModal (mich wundert echt, dass es nicht private ist) wird/sollte man sowieso nicht selber aufrufen. Es bleibt beim Close. |
AW: Fenster schließt sich nicht
Das Setzen von Modalresult im OnShow oder OnActivate Event ist leider zu früh, da im Showmodal erst danach die Schleife beginnt, diedie Abbruchbedingung enthält.
Hier nur ein Auszug:
Delphi-Quellcode:
Wenn man die Form im OnShow oder OnAvtivate schließen möchte, dann per
try
Show; try SendMessage(Handle, CM_ACTIVATE, 0, 0); ModalResult := 0; repeat ... ... until ModalResult <> 0;
Delphi-Quellcode:
PostMessage(FormHandle, WM_CLOSE, 0, 0);
Vielleicht wäre es besser im OnShow einen Thread zu starten, der die Methode ausführt und über Synchronice die Anzeige zu aktualisieren und im OnTerminate das Form zu schließen. |
AW: Fenster schließt sich nicht
Zitat:
|
AW: Fenster schließt sich nicht
uppps, falsch geguckt .... war caNone, nicht mrNone ... und davor den Variablennamen nicht nochmal gelesen :wall:
Delphi-Quellcode:
procedure TCustomForm.Close;
var CloseAction: TCloseAction; begin if fsModal in FFormState then ModalResult := mrCancel else function TCustomForm.ShowModal: Integer; begin ... ModalResult := 0; repeat ... Application.HandleMessage; <<<<<<<<<<<<<<< hier würde das .Close ausgeführt oder ein ModalResult gesetzt if Application.Terminated then ModalResult := mrCancel else if ModalResult <> 0 then CloseModal; until ModalResult <> 0; procedure TCustomForm.CloseModal; var CloseAction: TCloseAction; begin try CloseAction := caNone; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< if CloseQuery then |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz