5

我有一个小方法试图枚举 Word 文档中的字段。自从我不得不做这种事情以来已经过去了很多时间,现在我不记得如何正确地做这件事了。

下面的代码使用的是 OleVariants,我已经尝试了一段时间,谷歌搜索没有找到 Delphi 解决方案。任何人都可以建议如何解决这个问题?

代码的最终目标是识别特定类型的字段并使用该信息删除该字段。

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;

顺便说一句,我知道这段代码让 Word 处于打开状态等等。

暂时这很好,我目前主要关心的是让事情正常工作。

我也尝试将循环更改为:

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

但没用,告诉我“项目”不是收藏的一部分。

我已经没有想法了。

4

1 回答 1

7

似乎Item集合的基本索引是 1(不是 0)。所以你需要从1迭代到WordDocument.Fields.Count例如:

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; 

尝试访问WordDocument.Fields.Item(0)结果错误:
The requested member of the collection does not exist.

我从这里得到了提示

于 2013-10-03T10:11:54.413 回答