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
darkhell

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

Word OLE -> Kopfzeile Textmarke

  Alt 20. Jul 2011, 15:41
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.

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

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

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

  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
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: Word OLE -> Kopfzeile Textmarke

  Alt 20. Jul 2011, 16:14
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
darkhell

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

AW: Word OLE -> Kopfzeile Textmarke

  Alt 20. Jul 2011, 16:30
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
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: Word OLE -> Kopfzeile Textmarke

  Alt 20. Jul 2011, 17:39
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.
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 (20. Jul 2011 um 17:43 Uhr)
  Mit Zitat antworten Zitat
darkhell

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

AW: Word OLE -> Kopfzeile Textmarke

  Alt 21. Jul 2011, 08:02
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 ^^

Geändert von darkhell (21. Jul 2011 um 08:35 Uhr)
  Mit Zitat antworten Zitat
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
darkhell

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

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
 
#8

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
 
#9

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 21:58 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