【问题标题】:OLE automation: How to check if a variant references an automation objectOLE 自动化:如何检查变量是否引用自动化对象
【发布时间】:2013-11-29 11:54:47
【问题描述】:

我想知道如何确定变体是否引用了 OLE 自动化对象。

我正在将一些 Excel 图表导出到 Powerpoint。

我有这个代码:

var PptFile: Variant;

....

// PptFile _might_ be initialized:

PptFile:=pptApp.Presentations.Open(pptFilename);

// It depends on whether the export has items which need to be exported to 
// Powerpoint or not

....

// I would like to determine if PptFile does reference an OLE automated object or not
PptFile.SaveAs(excelFileName+'.pptx');

我知道,可以通过将代码的最后一行(带有 saveAs)放在try...except...end 之间来完成,但我觉得这种方法不够好。

我正在阅读有关VarIsEmptyVarIsEmptyParamNothingthis question 的信息,但对此我不确定。

【问题讨论】:

    标签: delphi powerpoint ole delphi-5 ole-automation


    【解决方案1】:

    您应该使用VarIsClear 进行此测试。

    指示指定的变体是否具有未定义的值。 如果给定变体的值未定义,则 VarIsClear 返回 true。这 value 可能由于以下几种原因中的任何一个而未定义:

    • Variant 的值可能已设置为 Unassigned。
    • Variant 的值可能是已设置为 nil (Delphi) 或 NULL (C++) 的接口类型。
    • Variant 可能是从 IsClear 方法返回 true 的自定义变体。

    在所有其他情况下,函数结果为假。

    注意:不要将未分配的变体与 Null 变体混淆。仍会分配 Null 变体,但具有 Null 值。不像 未分配的变体,Null 变体可以在表达式中使用并且可以 转换为其他类型的变体。


    但是,我怀疑它是否需要。怎么可能PptFile没有分配?只有当对pptApp.Presentations.Open() 的调用失败时才会发生这种情况,并且会引发异常。还是我误解了这一点?我目前看不到任何情况下您可以拨打PptFile.SaveAs()PptFile 尚未分配。

    【讨论】:

    • 我的Delphi 5好像没有VarIsClear函数。
    • 那你就可以自己动手了。代码如下所示:Result := (VType = varEmpty) or (((VType = varDispatch) or (VType = varUnknown)) and (VDispatch = nil)) 现在,我的最后一段呢?您真的需要执行此检查吗?
    • 谢谢。我会接受这个答案,因为它拥有我需要的一切(甚至更多)。没有要导出的图表时,不会分配 PptFile。我知道,这是草率的编码(不是我写的,我只需要添加一些东西,这个问题就一直困扰着我)。我最终可能会计算导出的图表,如果计数为零,请跳过此PptFile.SaveAs(...)。感谢您的努力。
    • 如果您只是想检测您从未分配过值,请使用 VarIsEmpty。肯定是在 D5 中。
    • 我从 FPC 运行时库中获取了 VarIsClear,它开箱即用。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 2011-08-18
    相关资源
    最近更新 更多