【问题标题】:Delphi OLE - How to avoid errors like "The requested member of the collection does not exist"?Delphi OLE - 如何避免“请求的集合成员不存在”之类的错误?
【发布时间】:2010-05-26 14:53:56
【问题描述】:

我正在使用 Delphi 自动化 Word,但有时我收到一条错误消息:

请求的集合成员 不存在

似乎Styles 集合类的Item 成员并不总是存在,并且有时会导致上述错误。我的解决方法是捕获异常并跳过它,但无论如何要检测它而不是使用try...except 块? try...except 块的问题在于,在调试引发的异常时很烦人......

我的代码示例:

var
  aWordDoc: _WordDocument
  i: Integer;
  ovI: OleVariant;
  wordStyle: Style;
begin
  for i := 1 to aWordDoc.Styles.Count do
  begin
    ovI := i;
    try
      wordStyle := aWordDoc.Styles.Item(ovI);
    except
      Continue;//skip if any error occurred.
    end;

    //do something with wordStyle
  end;
end

【问题讨论】:

    标签: delphi ole


    【解决方案1】:

    如果编译器接受它,但它有时不可能存在,它可能是基于 IDispatch 的后期绑定。可以查询 IDispatch 对象。也许仔细地在树上查询每个对象的下一个对象会起作用。

    然后,您将大致执行编译器所做的工作,除非如果某些东西不存在,则会引发异常。 (如果异常来自 COM,也许稍微不同的代码路径可以测试更多)。

    很抱歉没有现成的代码。

    【讨论】:

    • 他使用的是早期绑定,Styles属性和Styles.Item属性应该存在。这些都是自 Word97 以来的。发生错误是因为在索引 ovI 处请求的 Item 不存在,这很奇怪,因为他做了一个从 1 到 Styles.Count 的 for 循环。
    • 是的,我在使用早期绑定,这很奇怪...可能是来自 MICROSOFT WORD 内部,我们无能为力...
    【解决方案2】:

    当我试图从 Word 中填充的书签不存在时,我会收到该消息,因此我有一个首先检查的过程,但我不确定相同的方法是否适合您。

    procedure MergeData(strBookMark, strData : string);
    begin
      if WinWord.ActiveDocument.Bookmarks.Exists(strBookMark) = True then
        WinWord.ActiveDocument.FormFields.Item(strBookMark).Result := strData;
    end;
    

    【讨论】:

      【解决方案3】:

      这与不存在 Item 功能无关。 Item 函数确实存在,但您给出的索引似乎是错误的。

      看到这个msdn article

      无效索引看起来很奇怪,因为您正在执行从 1 到 Styles.Count 的 for 循环。所以如果没有Style,就不应该进入循环。

      我能想到的唯一合理的解释是,当你在你的循环中时,Styles.Count 发生了变化,你正在越界。您是否正在删除循环中的样式?尝试从 Styles.Count 向下到 1 的循环或尝试 While 循环,在每次迭代时评估 Styles.Count

      其他我能想到但不太可能的事情:

      • 在将I 分配给ovI 时,它会转换为OleString,因此Word 会搜索名为“I”的样式,而不是I 的样式
      • 在将I 分配给ovI 时,转换中出现问题,它在$FFFFFFA5 - $FFFFFFFF 的范围内,这是内置样式的常量。

      【讨论】:

      • 我没有删除循环中的样式,只是复制样式。
      • 您可以尝试在ovI := I语句之后打印Styles的数量,以检查Styles的数量是否没有变化。
      【解决方案4】:

      尝试使用 IF 语句检查它是否为空

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-22
        • 1970-01-01
        • 2010-10-27
        • 2016-07-23
        相关资源
        最近更新 更多