请求的集合成员不存在

时间:2013-10-04 11:19:26

标签: delphi ms-word ole-automation

感谢有人在这里,我终于有一个工作循环......差不多:) 它大部分时间都可以工作,但在某些情况下会出现此错误。

代码:

procedure TLetters.ReplaceDate(NewDate: String);
var I : Integer;
    ARegion : OleVariant;
    FieldType : Integer;
    FieldCount : Integer;
begin
    FieldCount := WordApp.ActiveDocument.Fields.Count;
    For I := 1 to FieldCount do
    Begin
         FieldType := WordApp.ActiveDocument.Fields.Item( I ).type;
         If FieldType IN [ 31,32 ] Then
         Begin
               ARegion := WordApp.ActiveDocument.Fields.Item( I ).Code;
               WordApp.ActiveDocument.Fields.Item( I ).Cut;
               ARegion.Text := NewDate;
         End;
    End;
end;

上面代码的问题在于,有时,Count会返回2,但是当我尝试检查第二个条目时,它会在主题中输出异常。

难道只是我必须做一个Count -1而不是Count?

1 个答案:

答案 0 :(得分:0)

你是对的。 Office中的所有计数从1到计数。

错误在您的代码中:

procedure TLetters.ReplaceDate(NewDate: String);
var I : Integer;
  ARegion : OleVariant;
  FieldType : Integer;
  FieldCount : Integer;
begin
  FieldCount := WordApp.ActiveDocument.Fields.Count;
  for I := 1 to FieldCount do begin
    FieldType := WordApp.ActiveDocument.Fields.Item( I ).type;
    If FieldType IN [ 31,32 ] then begin
      ARegion := WordApp.ActiveDocument.Fields.Item( I ).Code;
      WordApp.ActiveDocument.Fields.Item( I ).Cut;  <<--- here !!
      ARegion.Text := NewDate;
    end;
  end;
end;

当您cut某个项目时,将其从列表中删除,您应该将count减少一个。

重写代码如下:

begin
  FieldCount := WordApp.ActiveDocument.Fields.Count;
  i:= 1;
  while (i <= fieldCount) do begin
    FieldType := WordApp.ActiveDocument.Fields.Item( i ).type;
    if FieldType in [ 31,32 ] then begin
      ARegion := WordApp.ActiveDocument.Fields.Item( i ).Code;
      WordApp.ActiveDocument.Fields.Item( i ).Cut; 
      Dec(FieldCount);
      ARegion.Text := NewDate;
    end 
    else Inc(i);
  end; {while}
end;