AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Word OLE -> Kopfzeile Textmarke

Ein Thema von darkhell · begonnen am 20. Jul 2011 · letzter Beitrag vom 22. Jul 2011
Antwort Antwort
Benutzerbild von p80286
p80286

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

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, 30x aufgerufen)
Dateityp: zip word_bookm_test_dot.zip (2,8 KB, 22x 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
darkhell

Registriert seit: 17. Nov 2008
30 Beiträge
 
#2

AW: Word OLE -> Kopfzeile Textmarke

  Alt 21. Jul 2011, 16:36
Wah K-H,

vielen Dank du bist ja der Hammer

bis auf die Free die er bei mir nicht mag passt es Perfekt (ok und ich habe kein Word Komponente irgendwie, aber mit nem Anlegen einer OLEVariant passt das dann auch =)
---------------------------
Project1
---------------------------
Die Methode 'free' wird vom Automatisierungsobjekt nicht unterstützt.
---------------------------
OK
---------------------------


Perfekt das genau das was ich machen wollte =) vielen dank ,

ich bin noch verrückt geworden mit der Kopfzeile ^^


p.s. geht übrigends so auch mit meiner Word2000 =). Danke
  Mit Zitat antworten Zitat
ASM

Registriert seit: 15. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: Word OLE -> Kopfzeile Textmarke

  Alt 21. Jul 2011, 17:41
Hiermit sollte es aber gehen:
Da sind aber noch 2 nicht unbedeutende Fehler im Code:

Zum einen, da Winword im Hintergrund geladen wird, also ohne offen sichtbar zu sein, muss es am Ende des aufrufenden Codes geschlossen werden mit
Code:
msword.Quit;
Sonst bleibt das Winword ohne sichtbares Fenster als Prozess im Speicher und wird bei jedem Neuaufruf mit einer zusätzlichen Programmkopie in den Speicher geladen.

Zum zweiten: das Oleobject (also msword) kann nicht mittels Free freigegeben werden, sondern es muss unbedingt verwendet werden:
Code:
msword := UnAssigned;

Ausserdem sollte das aus bekanntem Grund unbedingt korrekt gekapselt werden:
Code:
  try
    msword:=CreateOleObject('WORD.APPLICATION');
  except
    showmessage('Word kann nicht gestartet werden!');
    exit;
  end;
  try
   {.. übriger Code ..}
  finally
    msword.Quit;
    msword := UnAssigned;
  end;
  Mit Zitat antworten Zitat
darkhell

Registriert seit: 17. Nov 2008
30 Beiträge
 
#4

AW: Word OLE -> Kopfzeile Textmarke

  Alt 22. Jul 2011, 05:46
Hi ASM =),

hehe vielen Dank für deinen Nachtrag, aber mir gings eher um den Teil "zwischen den Zeilen" ^^ also genau das mit den Textmarken zudem K-H ja tippte ..


Edith:
Jo, die Fehlerbehandlung ist rudimentär!
das passt schon , dennoch Danke für deine Tips

€dit ... das was hier Stand von mir kann ich nicht mehr nachvollziehen von daher einfach mal weg damit .

bzw mit dem unassigned .. seh ich jetzt erst ^^ .. war es nicht so, dass die OLE die Pointer Ref selbst verwaltet ?

bzw habs mal hinzugefügt (ich trau euch da mehr als mir ^^) aber nun bekomm ich eine Exception der Klasse EOleSysError "Das aufgerufene Objekt wurde von den Clients getrennt" also beim msword.unassigned.

hmmz

Gruß,
Manuel

Geändert von darkhell (22. Jul 2011 um 06:14 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz