![]() |
Abfragemenü
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Delphi-PRAXIS,
ich möchte so eine Abfrage für mein Programm, wie bei Programmen wie Word, welche aufgerufen wird wenn man das Programm schließt. Bei Word fragt diese z.B. ob man die Änderungen speichern möchte. Muss man dazu eine eigene Form einbinden oder gibt es eine andere Möglichkeit von Delphi aus? FG Dunkelbunt |
AW: Abfragemenü
Delphi-Quellcode:
Du kannst mit einem fünfsten Parameter einen Default-Button definiere, der dann den Fokus nach dem Anzeigen des Dialogs hat, z.B.:
var
MR : TModalResult; begin MR := MessageDlg('Möchten Sie die Änderungen im Dokument1 speichern?', mtInformation, [mbYes, mbNo, mbCancel], 0); case MR of mrYes : ; mrNo : ; mrCancel : ; end; end;
Delphi-Quellcode:
Zudem würde ich das ganze mit der Format-Funktion kombinieren, sodass der Message-Text flexibler wird.
MessageDlg('Möchten Sie die Änderungen im Dokument1 speichern?', mtInformation, [mbYes, mbNo, mbCancel], 0, mbYes);
|
AW: Abfragemenü
Dein MainForm hat ein Ereignis OnCanClose. Hier schreibst Du eine Abfrage rein in der Form
Delphi-Quellcode:
(Alles ungetestet aus dem Gedächtnis runtergetippt!)
procedure TForm1.FormCanClose(Sender: TObject; var CanClose: Boolean);
var rc: Integer; begin rc:= MessageDlg('Möchten Sie die Änderungen speichern?', mtConfirmation, [mbYes, mbNo, mbCancel], 0); case rc of mrCancel: begin CanClose := False; exit; end; mrYes: SaveData; end; end; |
AW: Abfragemenü
Danke.
|
AW: Abfragemenü
Evtl. sollte man noch dazu sagen, dass die Methode MessageDlg() nicht threadsafe ist und man diese in der Unit Dialogs findet.
|
AW: Abfragemenü
FormCanClose ist ja nicht als Ereignis vordefiniert (bei mir zumindest nicht)
reicht es also aus die Procedure anzulegen
Delphi-Quellcode:
und in type zu definieren?
procedure TForm1.FormCanClose(Sender: TObject; var CanClose: Boolean);;
EDIT: Es gibt ein OnCloseQuery, procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); Das ist identisch. |
AW: Abfragemenü
Wie kann ich es machen, dass wenn ich erst auf JA klicke (also ich möchte speichern)
und dann im Speicherdialog abbreche, sich das Programm nicht schließt? ich hab es jetzt so:
Delphi-Quellcode:
<Edit> Doppelpost -.- </Edit>
case MR of
mrYes : begin CanClose := False; if not FileExists(Filename) then begin SpeicherDialog := TSaveDialog.Create(self); Speichern_mit_Dialog; //if SpeicherDialog.Execute = False //Falsch, da so der Dialog erneut aufgerufen wird. // CanClose := False; end else begin Speichern(Filename); CanClose := True; Exit; end; end; mrNo : begin //leer end; mrCancel: begin CanClose := False; exit; end; end; |
AW: Abfragemenü
Sorry, natürlich heißt das Event CloseQuery....
am einfachsten definierst Du Deine Speichern()-Routine als Funktion, die einen Boolean zurückliefert, und zwar True genau dann, wenn alles gut gegangen ist. Dann hättest Du nur noch mrYes: CanClose := Speichern(); Wobei natürlich die File-Auswahlbox in der Speichern()-Routine aufgerufen werden muss. |
AW: Abfragemenü
Okay,
Danke. |
AW: Abfragemenü
Delphi-Quellcode:
Sinnvoller wäre es den Teil unter mrYes in eine eigene Methode auszulagern, allein schon wegen der Übersichtlichkeit, aber eben auch aufgrund der möglichen Wiederverwendbarkeit -- vorausgesetzt du schreibst diese Save()-Methode ausreichend allgemein.
procedure TForm1.OnCloseQuery(Sender: TObject; var CanClose: Boolean);
begin CanClose := True; case MR of mrYes : begin SD := TSaveDialog.Create(); try // Set dialog properties // ... if (SD.Execute) then begin // Save document end else begin // Do NOT close application because user cancelled // SaveDialog. CanClose := False; end; finally SD.Free(); end; end; // Nothing to do here mrNo : ; // Application should NOT be closed mrCancel : CanClose := False; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14: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