Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Word OLE -> Kopfzeile Textmarke (https://www.delphipraxis.net/161781-word-ole-kopfzeile-textmarke.html)

darkhell 20. Jul 2011 15:41

Word OLE -> Kopfzeile Textmarke
 
Hi @ll,

hoffe ich bin im Richtigen Unterforum gelandet.

Verwende :
WinXP Pro
Word 2000
Delphi 2009

Prinzipiell ich hab heute den ganzen Tag schon irgendwie nach Hilfestellungen gegoogelt und verzweilfe, ev. hat mir einer von euch eine Idee.

Delphi-Quellcode:
WordApp.ActiveWindow.ActivePane.View.SeekView := wdSeekCurrentPageHeader;
So ich gehe in den Header ...

Delphi-Quellcode:
WordApp.Selection.TypeText(Text:= 'blubbtest');
Einfach mal zum testen .. klappt auch hier wird einfach in die Kopfzeile blubbtest geschrieben ..

Delphi-Quellcode:
if WordApp.ActiveDocument.Bookmarks.Exists('Überschrift_Block_1') then BEGIN
So dann Frag ich ob die Textmarke "Überschrift_Block_1" vorhanden ist ...
da geht er mir mit True weiter ...

Delphi-Quellcode:
  WordApp.Selection.GoTo(wdGoToBookmark,emptyParam,emptyParam,'Überschrift_Block_1');
Nur jetzt sagt er mir "Überschrift_Block_1" gibts nicht ...

Wenn die Textmarke im normalen Text ist und nicht in der Kopfeile .. klappt es wunderbar ...


hoffe einer von euch hat mir ne idee,

Danke schon mal :)

Gruß,
Manuel

p80286 20. Jul 2011 16:14

AW: Word OLE -> Kopfzeile Textmarke
 
Zunächst solltest Du die Finger von "Überschrift.." lassen, "Ueberschrift kommt im Zweifel besser.
Das stimmt, aus irgendwelchen Gründen werden Bookmarks in Kopf und Fußzeilen nicht erkannt.
pack das Bookmark irgendwo in den Text (und lösch es nach Gebrauch) und hol Dir die Daten über {REF ...}

das funktioniert.

Gruß
K-H

darkhell 20. Jul 2011 16:30

AW: Word OLE -> Kopfzeile Textmarke
 
Hi K-H,

danke erst mal für die Fixe Antwort,

ah okee ja das ist ne gute Idee mit dem Ü ;).

Nur wenn ich das ganze über eine REF wieder hole und die Textmarke im Text lösche dann fehlt sie mir doch und sobald ich nun eine Seitenansicht machewars das doch mit den Daten oder ?
Alla "Fehler! Verweisquelle konnte nicht gefunden werden."

Ich will eben nicht nur ein PDF draus machen sondern das Word nur Vorausfüllen für Dokuarbeiten, wobei ich eben dann so n paar default stellen vor ausfüllen möchte.

Da meine Kopfzeile in Tabellen Aufgeteilt ist ist es für mich zumindest (bin OLE Anfänger ^^) arg schwierig da Vernünfgite Daten reinzubekommen.

Zudem nutze ich die Textmarken in meinem WordDokument im moment auch noch dazu bei einer neuen Seite dann eben die Kopfzeile Automatisch zu füllen (Seite1 hat eine Andere Kopfzeile wie Seite2...)


Hast du mir dazu noch eine Idee oder denke ich gerade falsch ?

Vielen Dank :)

Manuel

p80286 20. Jul 2011 17:39

AW: Word OLE -> Kopfzeile Textmarke
 
Also ich mache es so, daß ich eine .DOT habe mit allen Bookmarks und Feldern.
Aus dieser wird das das Ausgabedokument erstellt. Das kann ich dann Drucken, Speichern Editieren ....

Ich nutze Word als Word-File-Generator.

Du kannst ja auch problemlos in der zweiten Kopfzeile andere Bookmarks anziehen, wenn Du dort andere Daten benötigst.

Auch spricht ja nichts dagegen, das erstellte Dokument noch einmal zu editieren.

Gruß
K-H

Edith:
Ich hatte es übersehen da gibts so etwas wie "Felder aktualisieren" das sollte man natürlich ausführen bevor die Bookmarks im Orkus verschwinden. (und danach nicht mehr)
Ich komme heute nicht mehr an mein Word heran, kann aber morgen gerne noch einmal nachschauen.

darkhell 21. Jul 2011 08:02

AW: Word OLE -> Kopfzeile Textmarke
 
Hi,

uhm ^^ also genau das hab ich ja eigentlich auch vor. Also das teil als Word File Generator zu nutzen so Dinge wie "Erstellungs Datum" die Überschrift um was es geht .. das einfach schon mal vor Auszufüllen...

Wieso verwendest du eine .dot (einfach weils ne Vorlage ist oder, ists damit schneller ?)

Also ich habs gerade Probiert (rein in Word) wenn ich eine Referenz habe auf ne Textmarke die ich dann lösche und nun das Dokument Speichere kommt mir wieder "Fehler! Verweisquelle konnte nicht gefunden werden."

hmmz ich dreh noch durch ^^

p80286 21. Jul 2011 14:58

AW: Word OLE -> Kopfzeile Textmarke
 
Liste der Anhänge anzeigen (Anzahl: 2)
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 ;-)

darkhell 21. Jul 2011 16:36

AW: Word OLE -> Kopfzeile Textmarke
 
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 :thumb:

ASM 21. Jul 2011 17:41

AW: Word OLE -> Kopfzeile Textmarke
 
Zitat:

Zitat von p80286 (Beitrag 1112898)
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;

darkhell 22. Jul 2011 05:46

AW: Word OLE -> Kopfzeile Textmarke
 
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 ..

Zitat:

Zitat von p80286 (Beitrag 1112898)

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 :oops: .

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:40 Uhr.

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