2013-10-03 26 views
5

Mam małą metodę, która próbuje wyliczyć pola w dokumencie programu Word. Minęło dużo czasu, odkąd musiałem robić takie rzeczy, a teraz nie mogę pamiętać, jak to zrobić poprawnie.Dostęp do kolekcji pól w programie Word przy użyciu Delphi

Poniższy kod używa OleVariants, próbowałem przez chwilę i googling nie wymyślił rozwiązania Delphi. Ktoś może sugerować, jak to naprawić?

Ostatecznym celem kodu jest zidentyfikowanie określonego rodzaju pola i użycie tej informacji do usunięcia tego pola.

procedure TForm2.Button1Click(Sender: TObject); 
var 
    I: Integer; 
begin 
    If OpenDialog1.Execute Then 
    Begin 
      WordApp := CreateOLEObject('Word.Application'); 
      WordDocument := WordApp.Documents.Open(OpenDialog1.FileName, EmptyParam, 
                EmptyParam, EmptyParam, 
                EmptyParam, EmptyParam, 
                EmptyParam, EmptyParam, 
                EmptyParam, EmptyParam, 
                EmptyParam, EmptyParam, 
                EmptyParam, EmptyParam, 
                EmptyParam); 
      for I := 0 to WordDocument.Fields.Count - 1 do 
      begin 
       ShowMessage(WordDocument.Fields[ I ].Code); 
      end; 
     End; 
end; 

Przy okazji, wiem, że ten kod pozostawia Słowo otwarte i tak dalej.

To jest w porządku na razie, moim głównym zmartwieniem w tej chwili jest sprawienie, żeby to zadziałało.

Próbowałem również zmienić pętlę do tego:

for I := 0 to WordDocument.Fields.Count -1 do 
begin 
    ShowMessage(WordDocument.Fields.Item(I).Code); 
end; 

Ale nie działa, powiedział mi, że „Item” nie jest częścią kolekcji.

Skończyły mi się pomysły.

Odpowiedz

7

Wygląda na to, że podstawowy indeks kolekcji Item to 1 (nie 0). Więc trzeba iteracyjne od 1 do WordDocument.Fields.Count np .:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    WordApp, WordDocument, Field: OleVariant; 
    I: Integer; 
begin 
    WordApp := CreateOleObject('Word.Application'); 
    try 
    WordDocument := WordApp.Documents.Open('C:\MyDoc.doc'); 
    if WordDocument.Fields.Count >= 1 then 
     for I := 1 to WordDocument.Fields.Count do 
     begin 
     Field := WordDocument.Fields.Item(I); 
     ShowMessage(Field.Code); 
     end; 
    finally 
    WordApp.Quit; 
    end; 
end; 

próbuje uzyskać dostęp WordDocument.Fields.Item(0) wyniki błąd:
The requested member of the collection does not exist.

mam tę wskazówkę od here

+1

Dziękuję, że działa. –

Powiązane problemy