Autor Beitrag
Padz
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Do 26.03.09 13:33 
Moin,
folgende Frage.
Ich habe einen kleinen Editor gebastelt.
Nun möchte ich, dass, wenn ich das Programm beende, überprüft wird, ob der Inhalt des Memos gespeichert wurde und wenn nicht ein Popup erscheint.
Mein Problem ist nun, wie ich das mit dem Überprüfen hinkriege, also wie es sieht, dass ich noch nicht gespeichert habe.

Würde mich über eine Antwort freuen.

Gruß
Padz
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 26.03.09 13:38 
Es gibt erstens das Ereignis OnCloseQuery beim Formular und zweitens die Eigenschaft Modified, die angibt, ob der Inhalt des Memos verändert wurde.
Beim Speichern setzt du diese auf False, ändert sich etwas im Memo, wird diese automatisch wieder auf True gesetzt. Wenn memEditor dein Memo ist:
ausblenden Delphi-Quelltext
1:
2:
if memEditor.Modified then
  ...
In OnCloseQuery musst du dann zusätzlich noch CanClose entsprechend setzen, wenn das Schließen nicht erlaubt werden soll.
Padz Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Do 26.03.09 13:46 
Also die Eigenschaft Modified finde ich leider nicht im Objectinspektor.

Und wie muss der Quellcode in der OnCloseQuery Prozedur aussehen?
Einfach
CanClose := False, wenn er das Formular nicht schließen soll.

Gruß
Padz
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 26.03.09 13:49 
user profile iconPadz hat folgendes geschrieben Zum zitierten Posting springen:
Also die Eigenschaft Modified finde ich leider nicht im Objectinspektor.
Du willst ja auch nicht dort sondern in OnCloseQuery damit arbeiten. Was würdest du denn im Objektinspektor damit machen wollen, den siehst du doch gar nicht, wenn das Programm läuft. Und in Delphi wäre das Ändern vor dem Ausführen des Programms wohl etwas witzlos, findest du nicht? ;-)

user profile iconPadz hat folgendes geschrieben Zum zitierten Posting springen:
Und wie muss der Quellcode in der OnCloseQuery Prozedur aussehen?
Einfach
CanClose := False, wenn er das Formular nicht schließen soll.
Richtig. Wobei du das ja nicht mit False sondern in Abhängigkeit von Modified schreiben willst.
Padz Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Do 26.03.09 14:04 
So erstmal Danke für die schnellen Antworten.
Ich bin jetzt soweit fast fertig.

Nur habe ich noch ein kleines Problem mit OnCloseQuery.
Undzwar fragt er ja mittels
ausblenden Delphi-Quelltext
1:
If Memo1.Modified then MessageDlg...					

ab, ob das Memo verändert wurde. Wenn nicht erscheint eine Nachricht.

Hier ist erstmal das Problem, dass gar nichts passiert. Wenn ich ein ungespeichertes Memo habe, schließt das Formular trotzdem ohne eine Meldung. Hier der Quellcode:
ausblenden Delphi-Quelltext
1:
If Memo1.Modified then MessageDlg('Das offene Dokument wurde noch nicht gespeichert. Wollen Sie trotzdem fortfahren?',mtInformation,[mbYes,mbNo],0);					


Nun muss ich ja zwangläufig eine zweite If-Verzweigung erstellen:
ausblenden Delphi-Quelltext
1:
If MessageDlg(...) = mrNo then CanClose := False;					


Kann man das auch irgendwie eleganter lösen, oder geht diese Lösung überhaupt nicht?

Gruß
Padz
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Do 26.03.09 14:07 
user profile iconPadz hat folgendes geschrieben Zum zitierten Posting springen:
Nun muss ich ja zwangläufig eine zweite If-Verzweigung erstellen:
ausblenden Delphi-Quelltext
1:
If MessageDlg(...) = mrNo then CanClose := False;					


ausblenden Delphi-Quelltext
1:
CanClose := (MessageDlg(...) = mrNo);					
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 26.03.09 14:10 
ausblenden Delphi-Quelltext
1:
2:
if not memEditor.Modified or (MessageDlg() = ...) then
  ...
Aber was du machen musst ist ja ohnehin eine weitere Verzweigung, denn nicht schließen willst du ja nur, wenn gespeichert werden soll, das Speichern aber nicht erfolgreich war oder abgebrochen wurde. Die Frage wäre dann, ob gespeichert werden soll mit "Ja, Nein, Abbrechen":
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
if memEditor.Modified then
  case MessageDlg() of
    mrYes:
      if SaveDialog1.Execute then
        memEditor.Lines.SaveToFile(SaveDialog1.FileName)
      else
        CanClose := False;
    mrCancel:
      CanClose := False;
  end;


Zuletzt bearbeitet von jaenicke am Do 26.03.09 14:42, insgesamt 1-mal bearbeitet
Padz Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Do 26.03.09 14:18 
So.
Dankeschön, es funktioniert. :D

Nur gibt es noch zwei kleine Fehler.
Wenn ich auf Abbrechen klicke, dann wird das Programm geschlossen, obwohl im Quelltext "mrCancel: CanClose := False;" steht.
Und das Popup erscheint nur, wenn ich das Programm mit dem "X" beende und nicht wenn ich auf meinen erzeugten Menüpunkt "Ende" klicke.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Ende1Click(Sender: TObject);
begin
  halt
end;


Gruß
Padz
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 26.03.09 14:24 
Halt ist ja auch eine sehr sehr schlechte Idee... Das ist wie wenn du dein Auto anhälst indem du den Motor rauswirfst aus dem Wagen...
Wie wäre es mit Close oder Application.Terminate?
Padz Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Do 26.03.09 14:27 
Danke, jetzt funktioniert das auch. :D
Mir wurde es nun mal mit "halt" beigebracht. :P

Jetzt ist da nur noch das Problem mit dem "Abbrechen", siehe oben. ;)

Gruß
Padz
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 26.03.09 14:35 
Das klappt bei mir aber, wie sieht dein Quelltext denn jetzt aus?

Nebenbei: Warum eigentlich MessageDlg? Es geht ja auch so:
ausblenden Delphi-Quelltext
1:
  case Application.MessageBox('Soll gespeichert werden?''Speichern?', MB_ICONQUESTION or MB_YESNOCANCEL) of					
Padz Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Do 26.03.09 14:41 
Also mit Application.MessageBox() funktioniert das bei mir jetzt auch. Komisch...

Und ich kannte Application.MessageBox noch nicht. Nur ShowMessage und MessageDlg. ^^

Gruß
Padz