Einzelnen Beitrag anzeigen

Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Word OLE -> Kopfzeile Textmarke

  Alt 21. Jul 2011, 14:58
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
Angehängte Dateien
Dateityp: zip word_bookm_test.zip (3,0 KB, 29x aufgerufen)
Dateityp: zip word_bookm_test_dot.zip (2,8 KB, 20x aufgerufen)
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 (21. Jul 2011 um 17:05 Uhr)
  Mit Zitat antworten Zitat