Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi CreateOleObject('Word.Application') - Dotx öffnen aber docx bekommen, wie? (https://www.delphipraxis.net/198743-createoleobject-word-application-dotx-oeffnen-aber-docx-bekommen-wie.html)

Piro 27. Nov 2018 13:01

CreateOleObject('Word.Application') - Dotx öffnen aber docx bekommen, wie?
 
Moin zusammen,

ich habe ein Datei vorlage.dotx, welche ich öffne und mit Daten fülle.
Diese Vorlage ist schreibgeschützt. Der Schreibschutz wird deaktiviert, beim Füllen der Daten.

Das klappt auch alles super. Hier der Code
Delphi-Quellcode:
const
 wdAllowOnlyFormFields = $00000002; // http://www.delphigroups.info/2/d4/455196.html
..
try
   {Verbindung aufbauen}
   Word:=CreateOleObject('Word.Application');
 except
   {Schlägt sie fehl (Word nicht installiert), gibt es eine Fehlermeldung}
   ShowMessage('Microsoft Word kann nicht starten.');
   Screen.Cursor:=crDefault;
   Exit;
 end;

 word.visible:=true;
 word.Documents.Open(doc); // doc = vorlagen.dotx

try
   word.ActiveDocument.Unprotect;

   if word.ActiveDocument.Bookmarks.Exists('Titel') then
   begin
     r := word.ActiveDocument.Bookmarks.Item('Titel').Range;
     r.InsertAfter(lbl_titel.Caption);
   end;

   if word.ActiveDocument.Bookmarks.Exists('Beschreibung') then
   begin
     r := word.ActiveDocument.Bookmarks.Item('Beschreibung').Range;
     r.InsertAfter(edt_beschreibung.Text);
   end;

   word.ActiveDocument.Protect(wdAllowOnlyFormFields);
 finally
   word:=unassigned;
 end;
Leider wird nicht ein docx Dokument geöffnet sondern, dass dotx Dokument und wenn man nicht aufpasst und speichert, werden die Änderungen übernommen.

Starte ich aber das dotx Dokument, macht Word ein docx Dokument auf.

Welcher Schalter fehlt mir, damit das Öffnen aus Delphi mit meinem Code aus der vorlagen.dotx ein document.docx macht?

Danke im Voraus.
Sven

Jumpy 27. Nov 2018 13:11

AW: CreateOleObject('Word.Application') - Dotx öffnen aber docx bekommen, wie?
 
Müsste das nicht Documents.Add sein, mit dem Namen der Vorlage als Paramter?
Denn du willst ja nicht die Vorlage öffnen sondern ein neues Dokument auf Basis der Vorlage erstellen.

Piro 27. Nov 2018 16:07

AW: CreateOleObject('Word.Application') - Dotx öffnen aber docx bekommen, wie?
 
Vielen vielen Dank.

Das war es. :-D:thumb:

Einen habe ich dann doch noch. Mit folgendem Code, öffnet Word sich mit dem dotx Dokument.
Delphi-Quellcode:
var
 doc : String;
begin
 doc := frm_main.AppPath + 'data\formulare\vorlage.dotx';
 if FileExists(doc) then
 begin
   ShellExecute(0, 'open', PChar(doc), nil, nil, SW_NORMAL );
 end;
Gibt es hier auch eine Möglichkeit, dass ein docx Dokument geöfnnet wird?

Jumpy 27. Nov 2018 16:14

AW: CreateOleObject('Word.Application') - Dotx öffnen aber docx bekommen, wie?
 
C:\Programme\Microsoft Office\OFFICE11\winword.exe Word-Datei

Piro 27. Nov 2018 16:20

AW: CreateOleObject('Word.Application') - Dotx öffnen aber docx bekommen, wie?
 
Ah ok, damit würde ich aber die Office Version vorgeben.

Das schöne mit meiner Lösung ist, dass ich das das verlinkte Office nehme zum Dateityp. Bei einem Office Wechsel,
muss ich nicht den Pfad zum Office angeben.

Oder ich mache das auch mit CreateOleObject('Word.Application') wenn es keine einfache Lösung gibt.

Aus der Registry, dass Word auslesen, wollte ich eigentlich nicht.

Delphi.Narium 27. Nov 2018 16:22

AW: CreateOleObject('Word.Application') - Dotx öffnen aber docx bekommen, wie?
 
Delphi-Quellcode:
var
 doc : String;
begin
 doc := frm_main.AppPath + 'data\formulare\dokumentenname.docx';
 if FileExists(doc) then
 begin
   ShellExecute(0, 'open', PChar(doc), nil, nil, SW_NORMAL );
 end;

Piro 27. Nov 2018 16:25

AW: CreateOleObject('Word.Application') - Dotx öffnen aber docx bekommen, wie?
 
es gibt doch nur die vorlagen.dotx Datei.

Ich möchte das diese als Vorlage geöffnet wird und Word dann ein normale docx Datei öffnet, wie in meinem vorherigen Code.

Delphi.Narium 27. Nov 2018 16:55

AW: CreateOleObject('Word.Application') - Dotx öffnen aber docx bekommen, wie?
 
Du willst also weder eine Vorlage öffnen, noch ein Dokument, sondern ein neues Dokument (anhand einer Vorlage) erstellen.

Das solltest Du auch so schreiben und Dir auch darüber klar werden, dass Du genau das möchtest.

Also ungefähr sowas:
Delphi-Quellcode:
function NeuesDokument(aWordApp : TWordApplication; aWordDoc : TWordDocument; aDot : String; aVisible : Boolean = false) : Boolean;
var
  vDOT        : OleVariant;
  vNewDOT     : OleVariant;
  vDocType    : OleVariant;
  vVisible    : OleVariant;
begin
  vDOT    := aDot; // Das ist die Vorlage, anhand der ein neues Doukment erstellt werden soll.
  vNewDOT := False; // Wir wollen keine neue Vorlage erstellen, deshalb False.
  vVisible := aVisible; // Word soll das Ganze sichtbar machen.
  vDocType := EmptyParam; // Der Parameter muss angegeben werden, soll aber leer sein.
  try
    aWordApp.Documents.Add(vDOT, vNewDOT, vDocType, vVisible);
    aWordDoc.ConnectTo(aWordApp.ActiveDocument);
    aWordApp.ActiveWindow.ActivePane.View.type_ := wdOutlineView;
    Result := True;
  except
    on e : Exception do begin
      Result := False;
      MessageDlg(e.Message,mtError,[mbOk],0);
    end;
  end;
end;
Wenn es unbedingt ShellExcecute sein muss, schau Dir mal die Kommandozeilenparameter an: https://support.office.com/en-us/art...5-441737deb3a6

Und dann hoffe darauf, dass sie bei anderen Officeversionen (OpenOffice ...) entsprechend implementiert sind.

Denn ShellExecute und Open startet das Officepaket, dass in der Registry (für den übergebenen Dateityp) eingetragen ist (und das muss nicht das Office von MS sein).
Bei unterschiedlichen Officeversionen von MS mag das problemlos gehen, bei der Unterstützung unterschiedlicher Officepakete unterschiedlicher Hersteller, könnte es sportlich werden.

Delphi-Quellcode:
CreateOleObject('Word.Application')
nimmt das MS-Officepaket, das installiert ist. Das ist beim Wechsel der Officeversion für Dein Programm transparent. Solange an der Schnittstelle (MS-seitig) nix geändert wird, kann Dir die Officeversion auf dem "Zielrechner" (beim Kunden ...) egal sein.

Piro 27. Nov 2018 23:27

AW: CreateOleObject('Word.Application') - Dotx öffnen aber docx bekommen, wie?
 
Vielen vielen Dank.

Super Erklärung.

Ich werde auf ShellExecute verzichten.

@ Delphi.Narium
Mein Code funktioniert auch. Bin mir nur nicht sicher, ob ich lieber
deinen nehmen soll. Die Parameter beim Starten von Word sind eindeutiger.

Danke für einen kurzen Hinweis

Jumpy 28. Nov 2018 08:50

AW: CreateOleObject('Word.Application') - Dotx öffnen aber docx bekommen, wie?
 
Ich würde an deiner Stelle dann auch auf ShellExecute verzichten, denn das (Neues Dokument basierend auf Template) geht nur so, wie ich es eben gezeigt habe und dazu müsstest du immer die Office-Version wissen, wie du das ja auch angemerkt hast.

Also ist der Weg über Ole wohl der bessere, wenn wir mal davon ausgehen, dass du nur MS-Word benutzt, kein OpenOffice o.ä.

Dann kannst du es so machen, wie Delphi.Narium, wobei ich immer nie weiß, wie diese Early-Binding Varianten funktionieren, wenn ich mal eine neue oder ältere Office-Version ansprechen will, als die, womit ich das kompiliert habe. Da kann vllt. jemand anders mehr zu sagen.

Daher nehm ich da meist Late-Binding (so wie in deinem Beispiel), auch wenn das ggf. etwas lansamer ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:37 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz