![]() |
TWordApplication - wie beim Schliessen erkennen ob ein Dokument verändert wurde?
Hallo
Im untenstehenden Code wird dem Event OnDocumentBeforeClose eine entsprechende Procedure WordBeforeClose zugewiesen. In dieser möchte ich - falls der Benutzer das Dokument verändert hat - eine Möglichkeit zum Speichern anbieten. Wenn das Dokument nicht verändert wurde, dann soll Word ohne weitere Meldung geschlossen werden. Wie kann man erkennen, ob ein Worddokument verändert wurde? Meine bisherige Suche blieb leider erfolglos.
Delphi-Quellcode:
Danke für die Hilfe.
wordApp := TWordApplication.Create(self);
wordApp.Documents.Open(docFilename, EmptyParam, false, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam); wordApp.Visible := true; wordApp.Activate; wordApp.ScreenUpdating := true; wordApp.OnDocumentBeforeClose := WordBeforeClose; Grüsse, Robert |
AW: TWordApplication - wie beim Schliessen erkennen ob ein Dokument verändert wurde?
Datei-Änderungsdatum oder Dateiinhalt vorher speichern
und danach vergleichen? Ein Modified-Property nicht entdeckt, oder Dergleichen. Es gibt aber ein Saved-Property, sowie ein Save-Event. ![]() ![]() |
AW: TWordApplication - wie beim Schliessen erkennen ob ein Dokument verändert wurde?
Hallo Robert,
man kann mit ActiveDocument.Saved = FALSE prüfen, ob das Dokument seit dem letzten Speichern geändert wurde.
Delphi-Quellcode:
Bis bald Chemiker
procedure TfWordDemos.WordStartenClick(Sender: TObject);
var FWord : OleVariant; DateiName : TFileName; begin FWord := CreateoleObject('Word.Application'); FWord.visible:= TRUE; DateiName := 'C:\Users\Internet\Documents\Test.Docx'; FWord.Documents.Open(FileName:= DateiName); ShowMessage('Word zeigen'); // In diesem Beispiel wird das aktive Dokument gespeichert, // wenn es seit dem letzten Speichern geändert wurde. if FWord.ActiveDocument.Saved = FALSE then begin FWord.ActiveDocument.save; {Word Dokument speichern} end; If FWord.Documents.Count >= 1 then begin FWord.ActiveDocument.Close; end; FWord.Quit; end; |
AW: TWordApplication - wie beim Schliessen erkennen ob ein Dokument verändert wurde?
Man kann, aber man tut es niemals nicht ... Dieses "auf True oder False prüfen" :!:
|
AW: TWordApplication - wie beim Schliessen erkennen ob ein Dokument verändert wurde?
Liste der Anhänge anzeigen (Anzahl: 1)
Vielen Dank für eure Tipps. Das Erkennen ob sich ein Dokument fange ich nun im Event OnDocumentBeforeSave mit Doc.Saved ab. Das klappt soweit.
Das Problem ist, dass dieser Event nach dem Einblenden und Anwählen des "Speichern"- oder "Nicht speichern"-Buttons aktiv wird. https://www.delphipraxis.net/attachm...1&d=1726046361 Gibt es eine Möglichkeit zu erkennen, ob der "Speichern"- oder "Nicht speichern"-Button angewählt wurde? In der Beschreibung zum Event ![]() |
AW: TWordApplication - wie beim Schliessen erkennen ob ein Dokument verändert wurde?
Klar, BeforeSave kommt vor dem Speichern,
also nachdem man gesagt hat, dass gespeichert werde soll. (in dem Dialog) Aber vermutlich nicht, wenn dort jemand Nein oder Abbrechen sagt. Im BeforeSave das Save zu sagen ist etwas unnötig, da es gerade dabei ist, wenn, dann vorher Save aufrufen, um es "selbst" zu speichern. |
AW: TWordApplication - wie beim Schliessen erkennen ob ein Dokument verändert wurde?
> Aber vermutlich nicht, wenn dort jemand Nein oder Abbrechen sagt.
Leider eben doch und daher wärs von Interesse, ob der Benutzer "Speichern" oder "Nicht speichern" gewählt hat. |
AW: TWordApplication - wie beim Schliessen erkennen ob ein Dokument verändert wurde?
Hilft Dir (sinngemäß) sowas?
Delphi-Quellcode:
procedure TForm1.WordDocumentBeforeSave(ASender: TObject; const Doc: WordDocument; SaveAsUI: WordBool; var Cancel: WordBool);
begin SaveAsUI := False; // Verhindert das Anzeigen des Speicherdialogs Doc.Save; // Speichert das Dokument end; procedure TForm1.SaveDocument; begin WordApp := TWordApplication.Create(nil); try WordApp.Connect; WordApp.Documents.Open('C:\Pfad\zum\Dokument.docx'); WordApp.OnDocumentBeforeSave := WordDocumentBeforeSave; // Weitere Bearbeitungen am Dokument // Irgendwas mit dem Dokument machen if not WordApp.ActiveDocument.Saved then begin WordApp.ActiveDocument.Save; // Speichert das Dokument end; finally WordApp.Disconnect; WordApp.Free; end; end; |
AW: TWordApplication - wie beim Schliessen erkennen ob ein Dokument verändert wurde?
Hallo
Zitat:
Dank eurer tollen Hilfe habe ich mittlerweile eine doch schon brauchbar Lösung beisammen. Und zwar verwende ich hierzu den OnDocumentBeforeClose-Event, da dieser vor dem Einblenden des Speicher-Dialogs aktiv wird. Untenstehend der aktuelle Code. Wenn der Benutzer Word schliesst, wird zuerst Word ausgeblendet und die aufrufende Applikation zeigt den eigenen Speicher-Dialog an. Schön wäre es aber, wenn man den eigenen Speicher-Dialog noch im nicht ausgeblendeten Word anzeigen lassen könnte. Würde dies allenfalls mit dem Word-Handle (übergeben an die Messagebox) funktionieren und falls ja, wie kann man das Word-Handle ermitteln?
Code:
procedure TForm31.WordBeforeClose(ASender: TObject; const Doc: WordDocument; var Cancel: WordBool);
var resSaveMsg: integer; begin resSaveMsg := mrNone; wordApp.Application.Visible := false; if not Doc.Saved then // Worddokoment wurde verändert resSaveMsg := MessageBox(Handle, PWideChar('Möchten Sie die Änderungen im Dokument speichern?'), PWideChar('Microsoft Word'), MB_ICONQUESTION or MB_YESNOCANCEL or MB_DEFBUTTON3); case resSaveMsg of mrYes, mrNo: begin if resSaveMsg = mrYes then begin wordApp.Documents.Save(true, true); end; Cancel := true; wordApp.OnDocumentBeforeClose := nil; wordApp.Disconnect; wordApp.Quit(resSaveMsg = mrYes); end; mrCancel: begin Cancel := true; wordApp.Application.Visible := true; wordApp.Application.Activate; end; else Cancel := true; wordApp.OnDocumentBeforeClose := nil; wordApp.Disconnect; wordApp.Quit(false); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:13 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 by Thomas Breitkreuz