Es hat ein wenig gedauert weil es nicht so lief wie ich es im Kopf hatte.
Hiermit sollte es aber gehen:
Delphi-Quellcode:
var
i,j : integer;
sectcnt : integer;
bkmkcnt : integer;
bkmkrange : variant;
bkmkName : string;
headfootcnt:integer;
begin
msword:=0;
try
msword:=createoleobject('WORD.APPLICATION');
except
showmessage('Word kann nicht gestartet werden!');
exit;
end;
msword.Documents.Add('c:\temp\word_bookm_test.dot'); { mit Template!}
bkmkcnt:=msword.ActiveDocument.Bookmarks.count;
Memo1.Lines.Add(' Word-Dokument:'+msword.ActiveDocument.name);
Memo1.Lines.Add(' Anzahl Bookmarks:'+inttostr(bkmkcnt));
Memo1.Lines.Add('');
Memo1.Lines.Add('Index BookmarkName');
i:=1;
if bkmkcnt>0 then
repeat
Memo1.Lines.add(inttostr(i)+') '+msword.ActiveDocument.bookmarks.item(i).name);
inc(i,1);
until i>bkmkcnt;
Memo1.Lines.Add('');
Memo1.Lines.Add(' Bookmark.Text');
if bkmkcnt>0 then
for i:=bkmkcnt downto 1 do begin
try
{-- so werden die bookmarks gelöscht aber derr Text eingetragen -----}
//msword.ActiveDocument.bookmarks.item(i).select;
//Memo1.Lines.add(msword.selection.range.text);
//msword.selection.text:='wert ist '+inttostr(i);
{-- so bleiben die Bookmarks erhalten -------------------------------}
Memo1.Lines.add(msword.ActiveDocument.bookmarks.item(i).range.text);
bkmkName:=msword.ActiveDocument.bookmarks.item(i).Name;
bkmkRange:=msword.ActiveDocument.bookmarks.item(i).range;
bkmkRange.Text:='Rangetext '+inttostr(i);
msword.ActiveDocument.Bookmarks.Add(bkmkName,bkmkRange);
except
Memo1.Lines.add(inttostr(i)+'. Textmarke nicht gefunden!');
end;
end;
bkmkcnt:=msword.ActiveDocument.Bookmarks.Count;
Memo1.Lines.Add(' Nach Update vorhandene Bookmarks #'+inttostr(bkmkcnt));
{-- ALLE Felder aktualisieren ---------------------}
msword.ActiveDocument.select;
msword.Selection.wholeStory;
if not (msword.Selection.Fields.Update = 0) Then
memo1.lines.add(' Field Update fehlgeschlagen ');
sectcnt:=msword.ActiveDocument.Sections.count;
if sectcnt>0 then begin
for i:=1 to sectcnt do begin
headfootcnt:=msword.ActiveDocument.Sections.Item(i).Footers.count;
for j:=1 to headfootcnt do begin
msword.ActiveDocument.Sections.Item(i).Footers.Item(j).Range.select;
msword.Selection.wholeStory;
if not (msword.Selection.Fields.Update = 0) Then
memo1.lines.add(' Field Update fehlgeschlagen ');
end;
headfootcnt:=msword.ActiveDocument.sections.Item(i).Headers.count;
for j:=1 to headfootcnt do begin
msword.ActiveDocument.sections.Item(i).Headers.Item(j).Range.select;
msword.Selection.wholeStory;
if not (msword.Selection.Fields.Update = 0) Then
Memo1.Lines.Add(' Field Update fehlgeschlagen ');
end;
end;
end;
msword.ActiveDocument.Saveas('C:\temp\word_bookm_test.doc');
msword.ActiveDocument.close(0); {0=Keine Änderung sichern}
msword.quit;
msword:=unassigned;
end;
Unter Word2003 kann man damit auch Bookmarks im Header anspringen.
Die beiden Word.Dateien häng ich mal an.
Gruß
K-H
Edith:
Jo, die Fehlerbehandlung ist rudimentär!
Edith2:
So ist das Ende etwas besser