Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Wie wird ein Fenster geschlossen? (https://www.delphipraxis.net/49515-wie-wird-ein-fenster-geschlossen.html)

Marphy 12. Jul 2005 13:30


Wie wird ein Fenster geschlossen?
 
Hallo zusammen,
mein kleines Problem:
Wenn der User auf den X-Button in der Titelleiste meines Formulars klickt, soll irgendeine Methode aufgerufen werden (z.B. um eine bestimmte Aktion abzubrechen etc.). Wird das Fenster jedoch im Code über ein Close() geschlossen, soll o.g. nicht ausgeführt werden... Wie kann ich dieses Problem am Besten lösen? In VB gibt's im OnCloseQuery()-Event wenigstens noch einen entsprechenden Parameter... :( Habe ich vielleicht was übersehen?

Danke und liebe Grüße,
Marco

Boombuler 12. Jul 2005 13:34

Re: Wie wird ein Fenster geschlossen?
 
Notfalls mach dir selber einen Parameter!

wenn du im Code Close aufrufen willst setzt du einfach eine Bool-Variable auf True und wenn im OnCloseQuery die Variable auf True steht wingst du das direkt durch...

Greetz
B00mbuler

Kompon Ente 12. Jul 2005 13:34

Re: Wie wird ein Fenster geschlossen?
 
Zitat:

Zitat von Marphy
In VB gibt's im OnCloseQuery()-Event wenigstens noch einen entsprechenden Parameter... :( Habe ich vielleicht was übersehen?

Jep, hast du!

Formular -> Ereignisse -> OnCloseQuery ;)

fred.reichbier 12. Jul 2005 13:39

Re: Wie wird ein Fenster geschlossen?
 
Zitat:

Zitat von Kompon Ente
Zitat:

Zitat von Marphy
In VB gibt's im OnCloseQuery()-Event wenigstens noch einen entsprechenden Parameter... :( Habe ich vielleicht was übersehen?

Jep, hast du!

Formular -> Ereignisse -> OnCloseQuery ;)

Ich glaube, OnCloseQuery wird aufgerufen wenn der user auf X drückt und wenn CLOSE aufgerufen wird :gruebel:

Marphy 12. Jul 2005 13:40

Re: Wie wird ein Fenster geschlossen?
 
Hallo hier beiden,
danke für die schnellen Antworten!

Zitat:

Zitat von Kompon Ente
Zitat:

Zitat von Marphy
In VB gibt's im OnCloseQuery()-Event wenigstens noch einen entsprechenden Parameter... :( Habe ich vielleicht was übersehen?

Jep, hast du!

Formular -> Ereignisse -> OnCloseQuery ;)

Dass es in Delphi auch ein OnCloseQuery() gibt, weiß ich natürlich. Ein Parameter, der die "Art" angibt, wie ein Formular geschlossen wird, besitzt dieses Event in Delphi jedoch nicht (sehr wohl aber in VB). Das meinte ich :wink:

@boombuler:
Diese Lösung habe ich mir auch schon überlegt. Wäre aber allerdings nur eine Notlösung... Warum kann sich jeder selbst denken :???: :wink:

@fred:
Genau!

Gruß, Marco

Khabarakh 12. Jul 2005 14:09

Re: Wie wird ein Fenster geschlossen?
 
Benutze im Code Delphi-Referenz durchsuchenApplication.Terminate, dadurch wird das OnClose-Event übersprungen.
Alternativ könntest du auch vor dem Aufruf von Close die OnClose-Property auf nil setzen.

Luckie 12. Jul 2005 14:12

Re: Wie wird ein Fenster geschlossen?
 
Zitat:

Zitat von Khabarakh
Benutze im Code Delphi-Referenz durchsuchenApplication.Terminate, dadurch wird das OnClose-Event übersprungen.

Bist du sicher, dass das so eine gute Idee ist? :?
Zitat:

Alternativ könntest du auch vor dem Aufruf von Close die OnClose-Property auf nil setzen.
Auch das halte ich eher für eine 'von-hinten-durch-die-Brust-ins-Auge' Lösung.

Einfache eine Boolean Variable im private Abschnitt der Formklasse deklarieren und gut ist.

Marphy 12. Jul 2005 14:16

Re: Wie wird ein Fenster geschlossen?
 
Hallo Sebastian,

Zitat:

Zitat von Khabarakh
Benutze im Code Delphi-Referenz durchsuchenApplication.Terminate, dadurch wird das OnClose-Event übersprungen.
Alternativ könntest du auch vor dem Aufruf von Close die OnClose-Property auf nil setzen.

Ich will aber nicht meine ganze Anwendung, sondern nur ein Fenster schließen. Der andere Vorschlag ist auch nicht das Optimum, da (a) zu aufwendig, vor jedem Close() dat Dingens zu "nilen" und nachher wieder auf die entsprechende Methode zu setzen und (2) will ich vielleicht auch bei Close() im OnClose()-Event Code ausführen, nur eben anderen, als wenn der Nutzer die Form über den X-Button schließt. :gruebel:

Gruß, Marco

P.S.: Wie steht's eigentlich mit deinem TChart-Klone? :-D

Sidorion 12. Jul 2005 14:30

Re: Wie wird ein Fenster geschlossen?
 
Da kommst Du wohl um eine eigene methode nicht drumrum
close() ist nämlich nicht virtuell und wird imho auch beim Drücken auf das Kreuz gerufen.
eine Lösung wäre:
im Interface deiner Form schreibst du:
Delphi-Quellcode:
  private
   _bExecuteCloseAction: Boolean;
  ...
  public
  ...
  Constructor Create(Owner: TComponent); Override;
  function CloseQuery: Boolean; Override;
  Procedure Close(_bExecuteCloseAction: Boolean); ReIntroduce; Overload;
  ...
der Body der Funltion sieht dann so aus:
Delphi-Quellcode:
Procedure TMyForm.Close(_bExecuteCloseAction: Boolean);
Begin
  bExecuteCloseAction:=_bExecuteCloseAction;
  Close;
End;
Natürlich muss die Boolean variable im Constructor noch initialisiert werden:
Delphi-Quellcode:
Constructor TMyForm.Create(Owner: TComponent);
Begin
  Inherited;
  bExecuteCloseAction:=True;
End;
und im CloseQuery abgeprüft:
Delphi-Quellcode:
function TMyForm.CloseQuery: Boolean; Override;
Begin
  If bExecuteCloseQuery
  Then Begin
    //hier Deine schließfunktionalität
    Result:=?????;
  End Else Result:=True;
End;
Jetzt kannst du irgendwo im code schreiben
Delphi-Quellcode:
MyForm1.Close(false); //wenn nix ausgeführt werden soll
//oder
MyForm.Close;
//bzw
MyForm.Close(true); //wenn die funktionalität ausgeführt werden soll

Luckie 12. Jul 2005 14:37

Re: Wie wird ein Fenster geschlossen?
 
Also Jungs, was macht ihr da eigentlich? Das ist ja grausam. :roll:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure Button1Click(Sender: TObject);
  private
    bCloseButtonUsed: Boolean;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  bCloseButtonUsed := False;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if bCloseButtonUsed then
    CanClose := bCloseButtonUsed
  else
    CanClose := Messagebox(Handle, 'Schließen?', 'Fenster schließen', MB_YESNO) = ID_YES;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  bCloseButtonUsed := True;
  Close;
end;
Klickt man auf die Schaltfläche auf dem Formular, wird es sofort geschlossen, bei Klick auf das Kreuz in der Titelleiste kommt die Abfrage. So war es doch gewollt oder?


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:21 Uhr.
Seite 1 von 2  1 2      

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