AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Abfragemenü

Ein Thema von Dunkelbunt27 · begonnen am 20. Apr 2011 · letzter Beitrag vom 20. Apr 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Dunkelbunt27
Dunkelbunt27

Registriert seit: 10. Aug 2010
232 Beiträge
 
Delphi XE Professional
 
#1

Abfragemenü

  Alt 20. Apr 2011, 10:24
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
Miniaturansicht angehängter Grafiken
bild1.png  
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#2

AW: Abfragemenü

  Alt 20. Apr 2011, 10:26
Delphi-Quellcode:
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;
Du kannst mit einem fünfsten Parameter einen Default-Button definiere, der dann den Fokus nach dem Anzeigen des Dialogs hat, z.B.:
MessageDlg('Möchten Sie die Änderungen im Dokument1 speichern?', mtInformation, [mbYes, mbNo, mbCancel], 0, mbYes); Zudem würde ich das ganze mit der Format-Funktion kombinieren, sodass der Message-Text flexibler wird.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)

Geändert von s.h.a.r.k (20. Apr 2011 um 10:28 Uhr)
  Mit Zitat antworten Zitat
SirTwist

Registriert seit: 28. Sep 2006
196 Beiträge
 
Delphi XE Professional
 
#3

AW: Abfragemenü

  Alt 20. Apr 2011, 10:29
Dein MainForm hat ein Ereignis OnCanClose. Hier schreibst Du eine Abfrage rein in der Form
Delphi-Quellcode:
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;
(Alles ungetestet aus dem Gedächtnis runtergetippt!)
  Mit Zitat antworten Zitat
Benutzerbild von Dunkelbunt27
Dunkelbunt27

Registriert seit: 10. Aug 2010
232 Beiträge
 
Delphi XE Professional
 
#4

AW: Abfragemenü

  Alt 20. Apr 2011, 10:30
Danke.
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#5

AW: Abfragemenü

  Alt 20. Apr 2011, 10:30
Evtl. sollte man noch dazu sagen, dass die Methode MessageDlg() nicht threadsafe ist und man diese in der Unit Dialogs findet.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von Dunkelbunt27
Dunkelbunt27

Registriert seit: 10. Aug 2010
232 Beiträge
 
Delphi XE Professional
 
#6

AW: Abfragemenü

  Alt 20. Apr 2011, 10:36
FormCanClose ist ja nicht als Ereignis vordefiniert (bei mir zumindest nicht)
reicht es also aus die Procedure anzulegen
procedure TForm1.FormCanClose(Sender: TObject; var CanClose: Boolean);; und in type zu definieren?

EDIT:
Es gibt ein OnCloseQuery, procedure TForm1.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
Das ist identisch.

Geändert von Dunkelbunt27 (20. Apr 2011 um 10:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dunkelbunt27
Dunkelbunt27

Registriert seit: 10. Aug 2010
232 Beiträge
 
Delphi XE Professional
 
#7

AW: Abfragemenü

  Alt 20. Apr 2011, 11:05
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:
  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;
<Edit> Doppelpost -.- </Edit>
  Mit Zitat antworten Zitat
SirTwist

Registriert seit: 28. Sep 2006
196 Beiträge
 
Delphi XE Professional
 
#8

AW: Abfragemenü

  Alt 20. Apr 2011, 11:09
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.
  Mit Zitat antworten Zitat
Benutzerbild von Dunkelbunt27
Dunkelbunt27

Registriert seit: 10. Aug 2010
232 Beiträge
 
Delphi XE Professional
 
#9

AW: Abfragemenü

  Alt 20. Apr 2011, 11:13
Okay,
Danke.
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#10

AW: Abfragemenü

  Alt 20. Apr 2011, 11:17
Delphi-Quellcode:
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;
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.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:07 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