OLE Worddokument speichern dot > doc

Antworten
gtmind
Beiträge: 5
Registriert: Mo 1. Sep 2014, 15:43

OLE Worddokument speichern dot > doc

Beitrag von gtmind »

Hallo zusammen,

ich öffne ein Wordvorlage mit
vMSWord := CreateOleObject('Word.Application');
usw. ..

Anschliessend ersetze ich Textmarken.
Nun soll der Benutzer des Programms die Datei ändern und drucken. Dabei soll beim speichern die Wordvorlage aber nicht gändert werden.
In Delphi 6 wird automatisch beim speichern name.doc angegeben, so das die Vorlgage nicht geändert wird.
Eine von Lazarus geöffnete Vorlage kann ich aber ausversehen überschreiben, ändern.

Meine Frage, gibt es eine Möglichkeit in Lazarus automatisch von geöffneter dot auf doc (docx) zu wechseln?

Besten Gruß
Gerald

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: OLE Worddokument speichern dot > doc

Beitrag von theo »

Das hat mMn so gut wie nichts mit Lazarus zu tun.
Hat das OleObject keine "SaveAs" Methode?

gtmind
Beiträge: 5
Registriert: Mo 1. Sep 2014, 15:43

Re: OLE Worddokument speichern dot > doc

Beitrag von gtmind »

Der user soll entscheiden ob er speichert wo und mit welchem Namen. Er soll nur nicht die Vorlage ausversehen ändern können.

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: OLE Worddokument speichern dot > doc

Beitrag von hde »

und was spricht da gegen "SaveAs" ?

gtmind
Beiträge: 5
Registriert: Mo 1. Sep 2014, 15:43

Re: OLE Worddokument speichern dot > doc

Beitrag von gtmind »

Einfaches speichern überschreibt die Vorlage. Und das bei mehreren Benutzern über einen längeren Zeitraum.

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: OLE Worddokument speichern dot > doc

Beitrag von hde »

"SaveAs" überschreibt nur, wenn der Benutzer das eindeutig will.
Wenn du das absolut verhindern willst, dann musst du die Vorlage von Word im ReadOnlyMode lesen lassen.
Das geht aber nur mit MS-Word97 bis MS-Word 2010, Office 2013 liest zwar noch im Readonlymode, aber man kann dann das gelesene Dokument nicht ändern.

VB_Lazarus
Beiträge: 90
Registriert: Do 23. Dez 2010, 19:10
OS, Lazarus, FPC: Windows 10/11 32/64bit, L 2.2.0 32bit, FPC 3.2.2 32bit
CPU-Target: 32Bit

Re: OLE Worddokument speichern dot > doc

Beitrag von VB_Lazarus »

Hallo,

könntest du uns etwas mehr von deinem Quellcode zeigen.
Normalerweise erstellst du in Word ein Dokument (doc) und gibst diesem ein Parameter mit,
auf welcher Dokumentenvorlage (dot) dieses Dokument basiert.

Gruß

Patito
Beiträge: 203
Registriert: Di 22. Sep 2009, 13:08
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: OLE Worddokument speichern dot > doc

Beitrag von Patito »

gtmind hat geschrieben:Eine von Lazarus geöffnete Vorlage kann ich aber ausversehen überschreiben, ändern.


Versuch mal die Vorlage auf schreibgeschützt zu setzen... Als ich Vorlagen automatisch
ausgefüllt habe, habe ich immer die Vorlagen geschützt (ggf. im Code direkt vor dem öffnen).
In Word hatte ich dann beim öffnen ein ausfüllbares *.doc.

Um etwas Lazarus ins Spiel zu bringen:
Was ist der Stand an Libraries in FreePascal für *.doc oder *odt?
Oder kann jemand eine bezahlbare Library (*.dll) empfehlen? (Für Excel nehme ich LibXL.dll)
Bearbeiten von Dokumenten über OLE war immer eine Quälerei. Es ist elend langsam und
bei JEDER neuen Word-Version gibt es irgendwelche Kompatibilitätsprobleme..

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: OLE Worddokument speichern dot > doc

Beitrag von theo »


gtmind
Beiträge: 5
Registriert: Mo 1. Sep 2014, 15:43

Re: OLE Worddokument speichern dot > doc

Beitrag von gtmind »

Das Problem ist wenn die Wordvorlage einmal geöffnet ist kann der Benutzer dies durch "Datei->Speichern" bzw. Strg.+S überschreiben. Diese Vorlagen sollen aber im Originalzustand bleiben.
In Delphi wird die Vorglage geöffnet und wenn der Benutzer im Menü auf "Datei->Speichern" geht bekommt dieser die Frage unter welchen Dateinamen also wie bei Speicerhn unter.
Meiner Meinung nach muss ich bei Lazarus irgendwo angeben das dies genaus so geschehen soll.

Code: Alles auswählen

procedure TfrmMain.OpenDocument(FileName: String);
const
  // 1. Parameter (Quit)
  wdDoNotSaveChanges = $00000000;
  wdSaveChanges = $FFFFFFFF;
  wdPromptToSaveChanges = $FFFFFFFE;
  // 2. Parameter (Quit)
  wdWordDocument = $00000000;
  wdOriginalDocumentFormat = $00000001;
  wdPromptUser = $00000002;
var
  varWdApp    : oleVariant;
  varDokument : oleVariant;
  varBookmark : oleVariant;
  varFileName : oleVariant;
  varTmp      : oleVariant;
  SaveChanges : OleVariant;
  FileExt     : String;
  i           : Integer;
begin
  FileExt:=ExtractFileExt(FileName);
  if (FileExt = '.xls') or
     (FileExt = '.xlsx')
  then
  begin
    ShowMessage('Excel');
  end else
  if (FileExt = '.doc' ) or
     (FileExt = '.docx') or
     (FileExt = '.dot' ) or
     (FileExt = '.dotx')
  then
  begin
    try
      varWdApp := CreateOleObject('Word.Application'); // erstellt das Wordobjekt
      varWdApp.Visible := True;
    except
      WriteLn('MS Word kann nicht gestartet werden.'); // Fehlerbehandlung
      Exit;
    end;
    varFileName := FileName;
    varDokument := varWdApp.Documents.Open(varFileName);
 
    for i := 1 to sgSet.RowCount -1 do
    begin
      varBookmark := sgSet.Cells[0,i];
 
      if varDokument.Bookmarks.Exists(varBookmark) then
      begin
        varBookmark            := varDokument.Bookmarks.Item(varBookmark);
        varTmp                 := UTF8ToUTF16(sgSet.Cells[1,i]); // Umlaute
        varBookmark.Range.Text := varTmp;
      end;
    end;
 
    varWdApp := Unassigned;
  end;
end;

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: OLE Worddokument speichern dot > doc

Beitrag von hde »

gtmind hat geschrieben:In Delphi wird die Vorglage geöffnet und wenn der Benutzer im Menü auf "Datei->Speichern" geht bekommt dieser die Frage unter welchen Dateinamen also wie bei Speicerhn unter.

Das hat aber AFAIK gar nichts mit Delphi oder Lazarus zu tun, sondern mit der MS-Word-Version.
gtmind hat geschrieben:varDokument := varWdApp.Documents.Open(varFileName);

da kannst du im ReadOnlyMode lesen, sofern es nicht Office 2013 betrifft.

gtmind
Beiträge: 5
Registriert: Mo 1. Sep 2014, 15:43

Re: OLE Worddokument speichern dot > doc

Beitrag von gtmind »

Die Lösung ist eigentlich ganz einfach wenn man es weiss ...
die Zeile:

Code: Alles auswählen

varDokument := varWdApp.Documents.Open(varFileName);

ändern in

Code: Alles auswählen

varDokument := varWdApp.Documents.Add(varFileName);

Antworten