![]() |
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 |
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 |
Re: Wie wird ein Fenster geschlossen?
Zitat:
Formular -> Ereignisse -> OnCloseQuery ;) |
Re: Wie wird ein Fenster geschlossen?
Zitat:
|
Re: Wie wird ein Fenster geschlossen?
Hallo hier beiden,
danke für die schnellen Antworten! Zitat:
@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 |
Re: Wie wird ein Fenster geschlossen?
Benutze im Code
![]() Alternativ könntest du auch vor dem Aufruf von Close die OnClose-Property auf nil setzen. |
Re: Wie wird ein Fenster geschlossen?
Zitat:
Zitat:
Einfache eine Boolean Variable im private Abschnitt der Formklasse deklarieren und gut ist. |
Re: Wie wird ein Fenster geschlossen?
Hallo Sebastian,
Zitat:
Gruß, Marco P.S.: Wie steht's eigentlich mit deinem TChart-Klone? :-D |
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:
der Body der Funltion sieht dann so aus:
private
_bExecuteCloseAction: Boolean; ... public ... Constructor Create(Owner: TComponent); Override; function CloseQuery: Boolean; Override; Procedure Close(_bExecuteCloseAction: Boolean); ReIntroduce; Overload; ...
Delphi-Quellcode:
Natürlich muss die Boolean variable im Constructor noch initialisiert werden:
Procedure TMyForm.Close(_bExecuteCloseAction: Boolean);
Begin bExecuteCloseAction:=_bExecuteCloseAction; Close; End;
Delphi-Quellcode:
und im CloseQuery abgeprüft:
Constructor TMyForm.Create(Owner: TComponent);
Begin Inherited; bExecuteCloseAction:=True; End;
Delphi-Quellcode:
Jetzt kannst du irgendwo im code schreiben
function TMyForm.CloseQuery: Boolean; Override;
Begin If bExecuteCloseQuery Then Begin //hier Deine schließfunktionalität Result:=?????; End Else Result:=True; End;
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 |
Re: Wie wird ein Fenster geschlossen?
Also Jungs, was macht ihr da eigentlich? Das ist ja grausam. :roll:
Delphi-Quellcode:
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?
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; |
Re: Wie wird ein Fenster geschlossen?
Zu Terminate:
Gut, es handelt sich also nicht um das Haupt-Formular :wink: . Aber falls es so wäre, ist dann Terminate nicht die schnellste Lösung, wenn man die EventHandler auslassen will? Oder gibt es noch andere Nachteile? Zu nil: Schnell eine eigene Prozedur
Delphi-Quellcode:
und mit Strg + R durch den Code gehen hätte es auch getan, aber Luckies Lösung ist wahrscheinlich doch die beste.
procedure TMyForm.CloseWithoutPrompt;
begin OnClose{Query} := nil; Close; end; |
Re: Wie wird ein Fenster geschlossen?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
@Sidorion: Danke für deinen Lösungsvorschlag! :-D Ich habe das Ganze zum Testen leicht modifiziert in eine kleine Demo gepackt (Anhang) und es funktioniert einwandfrei... Der Aufwand ist zwar nicht gleich 0, hält sich aber im Rahmen. :wink: Falls jemand eine bessere/einfachere Lösung parat hat, bitte posten!! :thumb: @Luckie: Das hat Sid ja im Großen und Ganzen schon gepostet :wink: In der Demo sind beide Varianten kombiniert. @Sebastian: Und was ist, wenn ich das Fenster dann wieder über Show() einblende und es über die Titelleiste schließe? :???: Und drück dich nicht vor der anderen Frage! :mrgreen: :wink: Gruß, Marco |
Re: Wie wird ein Fenster geschlossen?
Zitat:
Zur dieser gewissen anderen Frage: Der Umfang hat sich inzwischen verdoppelt, die Entwicklungszeit steigt dazu proportional :wink: . Der Code ist zu etwa 70% fertig, es fehlen noch ein Demo-Programm und wenigstens etwas Dokumentation. Jetzt aber genug mit OT :wink: . |
Re: Wie wird ein Fenster geschlossen?
Eine andere Möglichkeit wäre folgende:
Wenn man auf das X klickt, wird, soweit ich mich nicht irre, eine System-Botschaft an das Fenster geschickt (die nicht kommt, wenn man Close() aufruft). Also einfach die Botschaften-Behandlung abfangen (WndProc oder so ähnlich) und bei der Botschaft den entsprechenden Code ausführen. |
Re: Wie wird ein Fenster geschlossen?
Hallo zusammen:
@Marc: An sowas habe ich auch schon gedacht... Ist aber um einiges aufwändiger. Andererseits könnte man z.B. auch ermitteln, ob Windows versucht, die Anwendung zu beenden, weil der PC heruntergefahren wird. @Sebastian: Na, was hab ich dir gesagt? :mrgreen: Wie gesagt, schreib mir, wenn das Teil fertig ist! :) Gruß, Marco |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:19 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