代码之家  ›  专栏  ›  技术社区  ›  Edwin Yip

Delphi OLE-如何避免诸如“请求的集合成员不存在”之类的错误?

  •  0
  • Edwin Yip  · 技术社区  · 15 年前

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

    被请求的集合成员 不存在

    Item 委员会成员 Styles 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
    
    4 回复  |  直到 15 年前
        1
  •  0
  •   Marco van de Voort    15 年前

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

    然后,您将大致执行编译器所做的操作,除非如果某个元素不存在,编译器会抛出异常。(如果异常来自COM,可能稍微不同的代码路径可以测试更多)。

    很抱歉没有现成的代码。

        2
  •  0
  •   Leslie    15 年前

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

    procedure MergeData(strBookMark, strData : string);
    begin
      if WinWord.ActiveDocument.Bookmarks.Exists(strBookMark) = True then
        WinWord.ActiveDocument.FormFields.Item(strBookMark).Result := strData;
    end;
    
        3
  •  0
  •   The_Fox    15 年前

    这与Item函数不在那里无关。Item函数确实存在,但您提供的索引似乎有误。

    msdn article .

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

    我能想到的唯一合理的解释是,当你在你的循环中时 风格。计数 改变了,你就越界了。您是否正在删除循环中的样式?尝试从 风格。计数 降到1或尝试While循环,评估 风格。计数

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

    • 分配时 I ovI ,它将转换为OleString,因此Word将搜索名为“”的样式 “,而不是当时的风格
    • 分配时 ,转换中出现了一些错误,它的范围为$FFFFFFA5-$FFFFFFFF,这是内置样式的常量。
        4
  •  -1
  •   Jonathan D    15 年前

    尝试使用if语句检查它是否为null