Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ShowModal wird nicht beendet (https://www.delphipraxis.net/150838-showmodal-wird-nicht-beendet.html)

himitsu 28. Apr 2010 19:05


ShowModal wird nicht beendet
 
Im Prinzip mache ich dieses (gekürzert Code):
Delphi-Quellcode:
Procedure TInsightForm.FormClose(Sender: TObject; Var Action: TCloseAction);
  Begin
    Free;
    Action := caNone;
  End;

InsightForm.ShowModal;
Tja, die Form verschwindet, aber der ShowModal-Aufruf wird nicht beendet und die ganze VCL blockiert.


Wieso wird dieser Aufruf denn nicht beendet, obwohl dessen Form schon verschwunden ist?


PS: Action ist absichtlich caNone, da sonst ja versucht würde nach dieser Funktion noch auf die Form (welche ja weg ist) zuzugreifen.

Christian Seehase 28. Apr 2010 19:10

Re: ShowModal wird nicht beendet
 
Moin Himitsu,

was willst Du denn nun im OnClose?
Free oder caNone?

[EDIT sagt]
Probier's mal mit caFree
[/EDIT sagt]

himitsu 28. Apr 2010 19:21

Re: ShowModal wird nicht beendet
 
Ich sagte ja, es ist gekürzt.

Delphi-Quellcode:
// OK-Button > Default = True
Procedure TInsightForm.Button2Click(Sender: TObject);
  Begin
    ModalResult := mrNone;
    FInsight.Form_SelectItem(TreeView1.Selected);
  End;

// Abbrechen-Button > Cancle = True
Procedure TInsightForm.Button3Click(Sender: TObject);
  Begin
    ModalResult := mrNone;
    FInsight.Form_Close;
  End;

// der [x]-Button
Procedure TInsightForm.FormClose(Sender: TObject; Var Action: TCloseAction);
  Begin
    FInsight.Form_Close;
    Action := caNone;
  End;
Ich wollte die Instanz komplett extern verwalten.
Die FInsight.xxx-Prozeduren geben die Form frei (.Free), wenn einige interne Prüfungen erfolgreich waren, ansonsten bleibt die Form erhalten/sichtbar.
Und zusätzlich gibt es noch ein "externes" Insight.Hide, womit man programmseitig die Form auflösen kann.

Das Freigeben via .Free hatte ich eigentlich verwendet, damit FormClose nicht nach den Button-Klicks auch noch aufgerufen wird.


Ich versuche dieses aber auch umzustellen, bin grad dabei mir was zu überlegen.
Aber ich find es dennoch komosch/blöde, daß ShowModal nix vom Ableben der Form mitbekommt. :shock:


Zitat:

Zitat von Christian Seehase
[EDIT sagt]
Probier's mal mit caFree
[/EDIT sagt]

Nja, da ich ja aktuell die Form extern freigebe, kann ich ja kein caFree nutzen ... wie gesagt, wenn die Form schon weg ist und dann versucht wird dieses, Aufgrund von caFree, nochmal freizugeben, dann knallt es. :stupid:

Uwe Raabe 28. Apr 2010 19:31

Re: ShowModal wird nicht beendet
 
Da in ShowModal auch nach dem FormClose noch auf die Form-Instanz zugegriffen wird, schießt du dir mit dem Free geradezu selbst die Füße weg. Die früheste Stelle, an der du das Form gefahrlos freigeben kannst, ist die Zeile nach dem ShowModal.

Als wäre das nicht schon genug, führt das Setzen der Action auf caNone auch noch dazu, daß ModalResult auf 0 gesetzt wird und das ShowModal damit nicht endet.

Fazit: Du solltest dein Design überdenken.

himitsu 28. Apr 2010 19:33

Re: ShowModal wird nicht beendet
 
Wollte nur bescheidgeben ... es funktioniert jetzt :bounce2:

Das Form wird erst nach .ShowModal freigegeben und Aktionen vom Formular selber blenden sie nur aus (.Hide via .Close).

http://www.delphipraxis.net/internal...t.php?t=177124


Danke nochmal für Hilfe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:08 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