Autor |
Beitrag |
Padz
Hält's aus hier
Beiträge: 12
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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: 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 
Hält's aus hier
Beiträge: 12
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 26.03.09 13:49
|
|
Padz 
Hält's aus hier
Beiträge: 12
|
Verfasst: 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
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:
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:
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.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Do 26.03.09 14:07
Padz hat folgendes geschrieben : | Nun muss ich ja zwangläufig eine zweite If-Verzweigung erstellen:
Delphi-Quelltext 1:
| If MessageDlg(...) = mrNo then CanClose := False; |
|
Delphi-Quelltext 1:
| CanClose := (MessageDlg(...) = mrNo); |
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 26.03.09 14:10
Zuletzt bearbeitet von jaenicke am Do 26.03.09 14:42, insgesamt 1-mal bearbeitet
|
|
Padz 
Hält's aus hier
Beiträge: 12
|
Verfasst: Do 26.03.09 14:18
So.
Dankeschön, es funktioniert.
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.
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm1.Ende1Click(Sender: TObject); begin halt end; |
Gruß
Padz
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
Hält's aus hier
Beiträge: 12
|
Verfasst: Do 26.03.09 14:27
Danke, jetzt funktioniert das auch.
Mir wurde es nun mal mit "halt" beigebracht.
Jetzt ist da nur noch das Problem mit dem "Abbrechen", siehe oben.
Gruß
Padz
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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: Delphi-Quelltext 1:
| case Application.MessageBox('Soll gespeichert werden?', 'Speichern?', MB_ICONQUESTION or MB_YESNOCANCEL) of |
|
|
Padz 
Hält's aus hier
Beiträge: 12
|
Verfasst: 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
|
|