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 Problem mit caHide im OnClose der Form (https://www.delphipraxis.net/86074-problem-mit-cahide-im-onclose-der-form.html)

oki 8. Feb 2007 16:21


Problem mit caHide im OnClose der Form
 
Hi,

nun versteh ich die Welt nicht mehr. Das ist doch eigentlich ganz simpel. Ich will nur unter einer ganz bestimmten Bedingung die Anwendung schließen. Daz uhabe ich folgendes getan:

ein Property FUserClose : Boolean; definiert, welches ich wie folgt im OnClose berücksichtige
Delphi-Quellcode:
procedure TServerSocketForm.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  If FUserClose then
    Action := cafree
  else
    Action := caHide;
end;
Ich habe überprüft, dass FUserClose zu diesem Zeitpunkt False ist und für Action caHide zugewiesen wird. Trotzdem wird meine Anwendung geschlossen.

wo ist mein Denkfehler?

Gruß oki

hoika 8. Feb 2007 16:24

Re: Problem mit caHide im OnClose der Form
 
Hallo,

FormCloseQuery ist die richtige Stelle.


Heiko

oki 8. Feb 2007 19:55

Re: Problem mit caHide im OnClose der Form
 
Hi Hoika,

ok, das ist sicher auch eine gute Stelle. Ich möchte aber ein Hide haben. Wenn man mir das im OnClose Ereignis auch noch so aufdrängelt, dann will ich auch dass es geht.

Zitat:

Das Ereignis OnClose wird beim Schließen des Formulars ausgelöst.

type
TCloseAction = (caNone, caHide, caFree, caMinimize);

TCloseEvent = procedure(Sender: TObject; var Action: TCloseAction) of object;

property OnClose: TCloseEvent;

Beschreibung

Mit OnClose können Sie spezielle Verarbeitungen durchführen, wenn das Formular geschlossen wird. Sie können in der zugehörigen Ereignisbehandlungsroutine beispielsweise prüfen, ob in allen Feldern eines Dateneingabeformulars gültige Eingaben vorgenommen wurden.

Ein Formular wird geschlossen, nachdem die Methode Close aufgerufen oder im Systemmenü die Option Schließen gewählt wurde.

Der Typ TCloseEvent zeigt auf eine Methode, die für das Schließen des Formulars zuständig ist. Der Parameter Action bestimmt, ob das Formular tatsächlich geschlossen wird. Er kann die folgenden Werte annehmen:

Wert Bedeutung

caNone Das Formular darf nicht geschlossen werden, daher geschieht nichts.
caHide Das Formular wird nicht geschlossen, sondern lediglich verborgen. Die Anwendung kann nach wie vor auf das Formular zugreifen.
caFree Das Formular wird geschlossen und sein Speicher freigegeben.
caMinimize Das Formular wird nicht geschlossen, sondern als Symbol angezeigt. Bei untergeordneten MDI-Formularen ist dies die Standardeinstellung.
Ich denke, dass das allgemein für Formulare, jedoch nicht für Hauptformulare gilt. Da muß dann ja eine Hide wie ein Close wirken. So nach dem Motto, ein Hauptfenster kann nicht verborgen, sondern nur minimiert werden.

Gruß oki

thkerkmann 8. Feb 2007 20:30

Re: Problem mit caHide im OnClose der Form
 
Hi,

OnCloseAction IST die richtige Stelle:

Delphi-Quellcode:
procedure TForm1.OnCloseQuery(Sender:TObject; CanClose:boolean);
begin
  CanClose := FUserClose;
  if NOT CanClose then
    Hide;
end;
Und du bekommst auch dein Hide :-)

Gruss

oki 8. Feb 2007 21:06

Re: Problem mit caHide im OnClose der Form
 
Hi Jungs!

Ich will wirklich nicht streiten. Ich gebe euch auch recht mit euren Bemerkungen zur Nutzung des Ereignisses OnCloseQuery. Aber warum gibt es den var-Parameter Action wenn man ihn nicht nutzen soll? Das versteh ich nicht.

Gruß oki

hoika 9. Feb 2007 08:08

Re: Problem mit caHide im OnClose der Form
 
Hallo,

in MDI-Client-Fenster kannst du damit steuern,
ob das Client-Fenster geschlossen oder nur versteckt wird.


Heiko

oki 9. Feb 2007 14:29

Re: Problem mit caHide im OnClose der Form
 
Hi hoika,

also kann ich OnClose nutzen, muß jedoch nur beachten, dass caHide zum schließen des anwendung führt.

gruß oki

PS: Sieht bei mir jetzt ein bischen nach Rechthaberei aus. Ist aber nicht so gemeint.

SirThornberry 9. Feb 2007 15:22

Re: Problem mit caHide im OnClose der Form
 
Ich bin wie oki der Meinung das man das auch im OnClose machen kann denn dafür ist es ja da (und bietet mehr möglichkeiten als das onCloseQuery).
Wenn man mit dem Debugger mal dort ansetzt ist Action per Default "caHide" beim schließen der Form per X in der rechten oberen Ecke. Beim Mainform entspricht caHide dem schließen des gesamten, bei anderen Forms nicht. Es ist also nicht wie man annimmt das beim Standardform per Default die Action caFree ist sondern sie ist caHide und somit hat das ganze keinen Sinn was im Ausgangspost steht weil dadurch keine Änderung eintritt.
Beim Mainform ist die einzige Möglichkeit im OnClose, Action auf caNone zu setzen und manuell das Hide des Forms aufzurufen.

oki 9. Feb 2007 20:10

Re: Problem mit caHide im OnClose der Form
 
Joop, das ist auch meine Erkenntnis. Ich hatte mich nur vom caHide verwirren lassen, da ich nicht wußte, dass bei MainForms so die Anwendung geschlossen wird.

Der Ansatz war eigentlich, dass ich das versehentliche Schließen der Anwendung über den Close-Button rechts oben im Systemmenü verhindern will. Die Anwendung soll dann nur noch über ein TrayIcon in der Taskbar aktiv bleiben. Das hab ich jetzt auch im OnClose belassen, nur nicht mit caHide sondern caFree und eine Zeile mehr :) . Ich hab das sicher auch nicht als ein großes Problem gesehen, sondern mich nur gewundert. Es scheint aber auch so zu sein, dass die Masse lieber mit OnCloseQuery arbeitet.

Herzlichen Dank noch mal für die Antworten

Gruß oki


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