0

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

编码:

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,但是当我尝试检查第二个条目时,它会在 subject 中输出异常。

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

4

1 回答 1

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;
于 2013-10-04T12:27:28.150 回答