Zitat:
-die hinterlegten Dokumente sind Originale und dienen nur als "Vorlage" (sollen also nicht unter dem Dateinamen geändert werden können)
Dafür nimmt man Vorlagen (.dotx), die können nicht versehentlich verändert und gespeichert werden.
Man erstellt ein neues Dokument unter Nutzung der Vorlage: Damit fällt dann schonmal das SaveAs und das Close des "Originals" unter Sicherstellung, dass es nicht verändert wurde, weg.
Zitat:
-der User füllt da drinne Text aus und setzt hier und da in einer Tabelle ein paar Haken
-Hinweis: jedes Word Dokument sieht anders aus, kein fester Aufbau
Das heißt noch lange nicht, dass man das nicht trotzdem aus Delphi heraus per Word fernsteuern könnte. (Formularfelder, Sprungmarken, ...)
Zitat:
-der User bestätigt in meiner Anwendung, dass er fertig ist
Wenn er vorher das Dokument gespeichert hat und dann Word beendet, existiert die Datei trotzdem. Das sollte mit wenig Aufwand zu prüfen sein.
Frei nach dem Motto:
User sagt im Programm "Fertig", Programm merkt, das Word weg ist, dann schaut es halt nach der Datei und nimmt die zur weiteren Verarbeitung.
Zitat:
-die Original-Datei bleibt wie sie war und der geänderte Inhalt wird unter einem festen Dateinamen (den meine Anwendung vergibt) irgendwo auf der Platte gespeichert
Wie oben schon gesagt: Vorlagen verwenden (.docx in .dotx umbenennen) und aus diesen jeweils ein neues Dokument erstellen.
Wenn das schon zu aufwändig ist, dann eben zuerst mit Delphimitteln von der Originaldatei eine Kopie erstellen (und nicht mit ferngesteuertem Word aus Delphi heraus). Dann hat die in Word zu öffnende Datei bereits den richtigen Namen (den von Deinem Programm zu vergebenden). Der User kann dann machen was er will. Wenn der den regulären Weg nimmt, dann kannst Du aus Deinem Programm heraus nochmal das Speichern und Schließen der Datei via Word veranlassen und die Datei weiterverarbeiten.
Hat der User Word beendet und meldet erst dann in Deinem Programm, dass er fertig ist, so merkst Du das in Deinem Programm ja durch geschickte Fehlerbehandlung und da der Name der Datei bekannt ist, kannst Du sie von der Festplatte aus weiterverarbeiten.
Hat der User vor dem Beenden von Word und der Fertigmeldung im Programm seine Änderungen nicht gespeichert, dann haben Du und der User schlicht und einfach Pech gehabt.
Wenn das neue Dokument via Word aus einer Vorlage erstellt wurde, so merkst Du bei einem ungespeicherten Beenden von Word vor der Fertigmeldung des Users im Programm, dass die Datei fehlt. Dann muss der User halt nochmal ran (nach entsprechender Fehlermeldung ...)
Hast Du das neue Dokument vorher per Copy aus Delphi heraus erstellt, kannst Du anhand des Erstelldatums oder des Datums der letzten Änderung im Programm prüfen, ob der User die Datei vorm Beenden von Word bearbeitet und gespeichert hat. Im Zweifelsfalle könnte man das auch über 'nen MD5-Checksummenvergleich (o. ä.) von Originaldatei und Userkopie überprüfen.
Gegen Fehlbedienung, Nichteinhaltung der vorgesehene Verarbeitungsschritte, Nutzung "Deiner" Wordinstanz und deren Weiterverwendung für andere Dokumente, deren vorzeitiges Beenden, ... hast Du keine realistische Chance.
Ist die Einhaltung der Verarbeitungsschritte zwingend erforderlich, dann muss der User halt dann, wenn er das Dokument und / oder Word vorzeitig beendet, aus Deinem Programm via Fehlermeldung darauf hingewiesen werden, dass er sich gefälligst an den vorgegeben Arbeitsablauf zu halten hat und muss den Verarbeitungsschritt solange wiederholen, bis er es in der richtigen Reihenfolge schafft.
Glaubst garnicht, wie schnell die User dann lernfähig werden und sich an die vorgegebene Abfolge halten. Arbeit doppelt (oder nochmehrfach) machen, ist äußerst unbeliebt, da hält man sich dann doch eher an die Vorgaben, wenn deren Einhaltung im Endeffekt mit weniger Aufwand verbunden ist
Und nein: Eine absolut (User)sichere Implementierung der von Dir aufgezeigten Verarbeitungsschritte, halte ich nicht für möglich.
Neues Dokument anhand einer Vorlage erstellen:
Delphi-Quellcode:
var
vDOT : OleVariant;
vNewDOT : OleVariant;
vDocType : OleVariant;
vVisible : OleVariant;
begin
vDOT := 'Name der Vorlage.dotx'; // Mal ausprobieren, ob das auch mit 'nem .docx geht.
vNewDOT := False;
vVisible := True;
vDocType := EmptyParam;
WordApp.Documents.Add(vDOT, vNewDOT, vDocType, vVisible);
// Weiterer Zugriff auf dieses neue Dokument dann per WordApp.ActiveDocument
...
Vorteil:
Das neue Worddokument hat noch keinen Namen. Wenn der User nun die Datei speichert, weiß er (hoffentlich) den zu vergebenden Namen nicht und scheitert daran, mit der Folge, dass er Word auch nicht ohne Datenverlust beenden kann.
Eventuell ein gangbarer Weg?