Autor Beitrag
Manfred
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 90



BeitragVerfasst: Mi 02.11.11 19:38 
Hallo Delphi-Gemeinde,

ich habe folgendes Problem:

Über OLE wird ein Word-Dokument erzeugt und ggf. Mergefelder ausgefüllt.
ausblenden Delphi-Quelltext
1:
2:
//sc, sc und hd entspringen einer Schleife, s ist einzufügender Text
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:
ausblenden 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:
ausblenden 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:
ausblenden 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.

_________________
Computer können schneller rechnen als wir, deshalb machen sie auch mehr Fehler
Manfred Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 90



BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
//sc, sc und hd entspringen einer Schleife, s ist einzufügender Text
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:
ausblenden 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!

_________________
Computer können schneller rechnen als wir, deshalb machen sie auch mehr Fehler