Entwickler-Ecke

Sonstiges (Delphi) - Word Datei via COM als neues Dokunment öffnen


matze - So 11.01.09 11:45
Titel: Word Datei via COM als neues Dokunment öffnen
Hallo.

Ich habe folgendes Problem:
Ich möchte für eine Art Report-Ausgabe Werte an Word übergeben. Das ganze geht auch recht gut mit folgendem Code:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
var
  FileName: OleVariant;
  vWhat, vBookmark, Marke: OleVariant;
begin
  FileName := ExtractFilePath(paramstr(0)) + 'marke.dot';
  WordApplication1.Connect;
  WordApplication1.Documents.OpenOld(FileName, EmptyParam, EmptyParam,
    EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
    EmptyParam, EmptyParam);
  WordDocument1.ConnectTo(WordApplication1.ActiveDocument);
  WordApplication1.Visible := True;
  vWhat:=wdGoToBookmark;
  vBookmark:='adresse';
  //WordDocument1.Bookmarks.Item(vBookmark).Range.InsertAfter('test');

  if WordDocument1.Bookmarks.Exists(vBookmark) then
  begin
    Marke := WordDocument1.Bookmarks.Item(vBookmark).Range;
    Marke.InsertAfter(memAdresse.Text);
  end;
end;
Sorry, dass der Code so gruslig ist, aber das ist nur zum Testen.
Mein Problem ist nun, dass Word diese Dot-Datei öffnet und nicht ein neues, ungespeichertes Dokument draus macht. Wenn also jetzt der Anwender auf Speichern klickt, überschreibt er die Dot-Datei.
Wie kann ich das umgehen? Ich würde mir irgendwas vorstellen, dass eine Word-Datei geöffnet wird, aber wie eine neue Datei behandelt wird.
Geht das?

Danke,
Matze


matze - Mi 14.01.09 10:13

*push* Ist mein Problem unverständlich, oder weiß niemand eine Lösung?


Nersgatt - Mi 14.01.09 10:19
Titel: Re: Word Datei via COM als neues Dokunment öffnen

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var
  FileName: OleVariant;
  vWhat, vBookmark, Marke: OleVariant;
begin
  FileName := ExtractFilePath(paramstr(0)) + 'marke.dot';
  WordApplication1.Connect;
  WordApplication1.Documents.OpenOld(FileName, EmptyParam, EmptyParam,
    EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
    EmptyParam, EmptyParam);

{Ich vermute hier liegt der Hund begraben. Statt Documents.OpenOld musst Du vermutlich Document.AddOld verwenden}
[snip]


Edit: Vermutlich ist es besser, Documents.add zu verwenden.
Siehe auch hier:
http://msdn.microsoft.com/de-de/library/microsoft.office.interop.word.documents.add(VS.80).aspx

Gruß,
Jens


matze - Mi 14.01.09 10:22

Hui. Das ging ja flott! :zustimm:
Nur leider habe ich jetzt kein Delphi da um es zu testen :-( Aber ich denke ich komme heute Abend noch dazu!


matze - Sa 17.01.09 14:54

SO jetzt bin ich mal dazu gekommen das zu testen.
Wie muss ich denn AddOld aufrufen, damit das funktioniert? Mein Delphi meckert, dass die Parameter nicht stimmen, ich kann aber auch keine Doku finden, wie das richtig sein muss...


MSCH - Sa 17.01.09 16:45

das funktioniert bei mir so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
// Open document with template
function TStartWordDocument.fnStartDocument: Boolean;
var
  vTemp: OleVariant;
  vTemp1: OleVariant;
  vDocType: OleVariant;
begin
  try
    vTemp:= stTemplateName; // template name, e.g. normal.dot
    vTemp1:= true;
    vDocType:= wdTypeDocument;
    WordApplication.Connect;
    WordApplication.Documents.Add(vTemp,emptyParam,vDocType,vTemp1);
    WordDocument.ConnectTo(WordApplication.ActiveDocument);
    WordDocument.PageSetup.Orientation:= wdOrientPortrait;
    WordDocument.ActiveWindow.ActivePane.View.Zoom.Percentage:= 100;
    Result:= True;
  except
    Result:= False;
  end;
end;


:-)Msch


Chemiker - Sa 17.01.09 18:09

Hallo matze,

Zitat:
Mein Delphi meckert, dass die Parameter nicht stimmen, ich kann aber auch keine Doku finden, wie das richtig sein muss...

Ich vermute, dass Nersgatt eine andere Word-Version benutzt als Du. Dann meckert Delphi die unterschiedlichen Parameter an.
Wenn Du die Hilfe von Word aufrufst und die Befehle nachschaust die Du einsetzt, so müssen die Parameter angepasst werden.

Bis bald Chemiker


MSCH - Sa 17.01.09 18:14

du kannst in D zwei Versionen von Word verwenden: Word2000.pas und WordXP.pas
Je nach dem was du in der Installation angegeben hast.

Die Aufrufkonventionen sind zwischen beiden Versionen unterschiedlich. Das o.g. verwendet
WordXP.pas.

Ab D2009 musst du dann var Parameter übergeben.

:-)Msch


matze - So 18.01.09 15:13

Hallo ihr alle!

Vielen vielen Dank für eure Hilfe. Der Code von user profile iconMSCH war goldrichtig. Es funktioniert. Das mit den unterschiedlichen Wordversionen wusste ich schon. Da habe ich auch die richtige installiert.

Für die die es interessiert und für dich Nachwelt hier mein Code, der eine .dot Datei startet und darin einen Text bei einer Marke einfügt:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
var
  vTemp: OleVariant;
  vTemp1: OleVariant;
  vDocType: OleVariant;
  vWhat: OleVariant;
  vBookmark: OleVariant;
  Marke: OleVariant;
begin
  try
    vTemp:= ExtractFilePath(paramstr(0)) + 'marke.dot'// template name, e.g. normal.dot
    vTemp1:= true;
    vDocType:= wdTypeDocument;
    WordApplication.Connect;
    WordApplication.Documents.Add(vTemp,emptyParam,vDocType,vTemp1);
    WordDocument.ConnectTo(WordApplication.ActiveDocument);
    WordApplication.Visible := true;
    WordDocument.ActiveWindow.ActivePane.View.Zoom.Percentage:= 100

    // Jetzt die Bookmarks ersetzen:
    vWhat:=wdGoToBookmark;
    vBookmark:='adresse';
    if WordDocument.Bookmarks.Exists(vBookmark) then
    begin
      Marke := WordDocument.Bookmarks.Item(vBookmark).Range;
      Marke.InsertAfter(memAdresse.Text);
    end;
    Result:= True;
  except
    Result:= False;
  end;
end;


Eine Frage bleibt aber noch:
user profile iconMSCH hat folgendes geschrieben Zum zitierten Posting springen:
Ab D2009 musst du dann var Parameter übergeben.

Kannst du bitte mal ausführlich erklären, was du meinst... Denn ich werde mir demnächst D2009 zulegen, da ist das nicht ganz uninteressant!

Nochmal: Vielen Dank an alle!

Euer Matze