Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Problem mit Word OLE Automation (https://www.delphipraxis.net/159689-problem-mit-word-ole-automation.html)

tsteinmaurer 8. Apr 2011 07:59

Delphi-Version: 5

Problem mit Word OLE Automation
 
Hallo,

Delphi 2007. Habe ein Word 2000 Dokument mit 6 Textmarken. Diese möchte ich via Delphi befüllen. Im Beispiel unten ist document ein Variant auf das aktive/geöffnete Dokument

Delphi-Quellcode:
...
anzahl := document.Bookmarks.Count;
for k := 1 to anzahl do
begin
  bookmarkName := document.Bookmarks.Item(k).Name;
  ...
end;
In anzahl steht korrekt 6 drinnen, d.h. die Anzahl laut Dokument stimmt. Wenn ich jetzt aber in der Schleife per k-Index auf ein Bookmark zugreife, dann klappt das für die ersten vier und beim 5. kracht es mit folgender Fehlermeldung.

"Das angeforderte Element ist nicht in der Sammlung vorhanden."

Laut Debugger sieht man auch, dass es scheint, wie wenn zwei Textmarken "übersprungen" werden. z.B. gibt es laut Sorting nach Namen im Word-Dokument folgende Textmarken:

TM1
TM2
TM3
TM4
TM5
TM6

Wobei der k-index dann wie folgt zugreift:

k = 1 => TM1
k = 2 => TM3
k = 3 => TM5
k = 4 => TM6

Bei k = 5 kracht es dann. Wie man sieht, wurden TM2 und TM4 ausgelassen. Sehr seltsam.

Hat jemand eine Ahnung?

Danke und lg,
Thomas

jobo 8. Apr 2011 08:34

AW: Problem mit Word OLE Automation
 
Sind die Arrays hier 1-basiert?

Ich bin mir nicht ganz sicher, mglw. könnten die Bookmarks verschachtelt sein (oder überlappend).
Hast Du die Anzeige der Bookmarks unter Optionen aktiviert? Kannst Du sie sehen und unterscheiden oder hälst Du Dich (optisch) an die Inhalte?

Sind die Bookmarks "hand-made" oder generiert?
Im ersten Fall kann bei der Benennung etwas schief gehen. Im Namen können dann "Sonderzeichen" wie z.B. Zeilenumbruch, Leerzeichen, .. Sein. Die einen Zugriff per Name ins leere Laufen lassen.
Der Zugriff über Index müsste dann allerdings trotzdem funktionieren.
Wo genau "knallt" es? In der Zeile
Zitat:

bookmarkName := ..
?
Funktioniert es mit anderen Dokumenten?

Das Ganze mit neu erstellten Textmarken prüfen.

p80286 8. Apr 2011 11:59

AW: Problem mit Word OLE Automation
 
Soweit ich weiß kann man auch über
Code:
.bookmarks("TM1").
zugreifen.

Gruß
K-H

Edith:
ggf mit
Code:
.Bokkmarks.Exists("TM1")
vorher prüfen?

Lemmy 8. Apr 2011 12:06

AW: Problem mit Word OLE Automation
 
Hi,

wir erfolgt das setzen des eigentlichen Textes? Kann sein, dass die 5 Textmarken so nah aufeinander sitzen, dass der eingefügte Text diese überschreibt (überschreiben anstelle einfügen)?


ich setze den Text immer so:
Delphi-Quellcode:
vWhat:=wdGoToBookmark;
vBookmark:='Name';
WordApplication1.Selection.GoTo_(vWhat,emptyParam,emptyParam,vBookmark);
WordApplication1.Selection.TypeText('Max Mustermann'#13'Dorfstraße 100');
und hatte damit eigentlich noch nie Probleme...

GRüße


Nachtrag: Verändert sich denn document.Bookmarks.Count während des Schreibens?

tsteinmaurer 8. Apr 2011 12:29

AW: Problem mit Word OLE Automation
 
Es knallt beim Zugriff über den Schleifenindex in der ersten Anweisung in der FOR-Schleife.

@Lemmy. Das war ein guter Tipp. Count wird je Schleifendurchlauf kleiner, d.h. vermutlich hat es etwas mit dem Setzen des Textes für die Textmarke zu tun. Z.B. wird die Textmarke durch das Setzen überschreiben/gelöscht.

Das Setzen erfolgt durch:

Delphi-Quellcode:
document.Bookmarks.Item(bookmarkName).Range.Text := 'Text';


Zu allen anderen Fragen. Ja, Arrays/Listen beginnen hier mit 1. Ich habe es mit Dokumenten zu tun, wo ich die vorhandenen Textmarken als solches nicht kenne, d.h. muss mir erst den Namen der Textmarke über den Index in der Schleife ermittlen etc.

Danke und lg,
Thomas

Lemmy 8. Apr 2011 12:58

AW: Problem mit Word OLE Automation
 
Hallo,


Zitat:

Zitat von tsteinmaurer (Beitrag 1093903)
Das Setzen erfolgt durch:

Delphi-Quellcode:
document.Bookmarks.Item(bookmarkName).Range.Text := 'Text';



ich habe kein MSWord zur Hand... aber schau doch mal ob Rage noch eine SelStart und Selcoun oder was ähnliches hat - das dürfte dann das Problem sein, dass dein gesetzter Text eine Schreibmarke überschreibt. Wenn Du mal nur einen Text der ersten Textmarke übergibst und das dann speicherst, dann dürfte die 2. TExtmarke fehlen.

Grüße

p80286 8. Apr 2011 14:42

AW: Problem mit Word OLE Automation
 
Genau das sollte eigentlich nicht der Fall sein, da der Inhalt der Textmarke nur "zufällig" auch ausgegeben wird.
Ich würde vor dem Zugriff die vorhandenen Textmarken überprüfen (Count /Name) und hinterher wieder prüfen.
Ich möchte wetten, daß dann noch alle bookmarks vorhanden sind.

Gruß
K-H

jobo 8. Apr 2011 16:33

AW: Problem mit Word OLE Automation
 
Wie schon angedeutet: Textmarken können sowohl überlappen als auch verschachtelt sein.
Bei Verschachtelung ist definitiv die innere futsch, wenn die äußere überschrieben wird.
Erfahrungsgemäß gibt es individuelle Lernphasen, bis ein Neuling Word Textmarken zuverlässig in einem Dokument platziert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:14 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