Manfred - Mi 02.11.11 19:38
Titel: OLE Word Mergefelder ersetzen
Hallo Delphi-Gemeinde,
ich habe folgendes Problem:
Über OLE wird ein Word-Dokument erzeugt und ggf. Mergefelder ausgefüllt.
Delphi-Quelltext
1: 2:
| ole.activeDocument.Sections.Item(sc).Headers.Item(hd).Range.Fields.Item(fd).Result.Text := s ; |
Das klappt soweit gut, aber die Datenquelle steht nicht permanent zur Verfügung, weshalb die Mergefields ihren Inhalt verlieren, wenn das Dokument erneut angefasst wird.
Also müssen die Mergefields nicht ausgefüllt, sondern gegen den Text ersetzt werden.
In Word Basic habe ich mangels tiefere Kenntnisse folgenden Ablauf realisiert:
Quelltext
1: 2: 3:
| // m, o und n entspringen aus einer Schleife; s$ ist der einzufügende Text ActiveDocument.Sections(m).Headers(o).Range.Fields(n).Delete WordBasic.Insert s$ |
Das arbeitet perfekt.
Nun will ich den Vorgang in OLE umsetzen:
Delphi-Quelltext
1: 2:
| ole.activeDocument.Sections.Item(sc).Headers.Item(hd).Range.Fields.Item(fd).Delete ; ole.WordBasic.Insert(s); |
Ergebnis: Das angeforderte Element (wohl WordBasic) ist nicht in der Sammlung enthalten.
Ich habs schon mit TypeText versucht, konnte den korrekten Syntax aber nicht herausfinden. Aber das müsste doch ein Ansatz sein?
Dann habe ich mir überlegt, ob man das Mergefield einfach markiert, entfernt und den Text schreibt:
Delphi-Quelltext
1: 2:
| ole.activeDocument.Sections.Item(sc).Headers.Item(hd).Range.Fields.Item(fd).Select ; ole.Selection.Text := s ; |
Ergebnis: Die Methode Selection wird vom Automatisierungsobjekt nicht unterstützt
Auch ole.activeDocument.Selection geht nicht
Ich hatte auch schon die Meldung das dies nur im Seiten-Layout möglich sei etc.
Offenbar komme ich mit der objektorientierten MS-Welt nicht so richtig klar, kann mir jemand einen Tipp geben?
Danke.
Manfred - Do 10.11.11 23:03
Also nach einiger Recherche habe ich es nun selbst herausgefunden.
Falls mal jemand ein ähnliches Problem hat, hier also die Lösung:
Zunächst wird wie bereits vermutet das Mergefield mit Inhalt bestückt:
Delphi-Quelltext
1: 2:
| ole.activeDocument.Sections.Item(sc).Headers.Item(hd).Range.Fields.Item(fd).Result.Text := s ; |
Nun wird das Mergefield entfernt, wobei der vorher gesetzte Inhalt als Text erhalten bleibt:
Delphi-Quelltext
1:
| ole.activeDocument.Sections.Item(sc).Headers.Item(hd).Range.Fields.Item(fd).Unlink ; |
Das war's schon.
Edit:
Noch ein Nachtrag: Um Laufzeitfehler zu vermeiden, muss die Schleife über fd rückwärts, also mit downto erfolgen!