Microsoft Visio OLE自动化错误日志记录

时间:2015-07-02 13:56:22

标签: java swt visio ole-automation

我正在使用SWT(标准窗口小部件工具包)提供的OleAutomation Java API来操作Visio文档。我们使用OleAutomation调用在自动化API上生成了Java包装器。例如:(形状删除)

/**
 * COM Id: 11
 */

public void Delete() {
    //Invoke
    Variant varInputArray[] = new Variant[0];
    Variant varResult = oleAutomation.invoke(11, varInputArray);
    for (Variant _varItr : varInputArray) {
        _varItr.dispose();
    }
    if(varResult !=null)
    {
        varResult.dispose();
    }
}

从应用程序逻辑中的某个位置调用此删除时,我遇到了一个特殊问题。在页面上我放置一个形状并调用删除。对于奇数编号的调用,删除成功,varResult返回VT_EMPTY(第1,第3,第5 ......时间调用)。对于偶数编号的调用(我将形状再次放在页面上并调用-2nd,4th 6th等),varResult返回“null”,表示失败。现在我需要了解偶数编号的调用出了什么问题。 Visio Automation框架中是否有某种日志记录工具可以记录失败的原因?

1 个答案:

答案 0 :(得分:0)

尝试向后删除形状。即删除形状时向后迭代集合。 这意味着,而不是:

shapes = Page.Shapes;
foreach (shape : shapes)
{
    if (xxx)
        shape.Delete()
}

试试这个

shapes = Page.Shapes;
for (int i = shapes.Count; i > 0; --i)
{
    if (xxx)
        shapes[i].Delete()
}

意思是,Visio有一点天真"集合管理,所以在迭代过程中从集合中删除项目可能会给你带来麻烦,应该小心处理,就像对阵列一样。

或者,您可以先选择要删除的所有形状,然后一次删除它们:

shapes = Page.shapes;
sel = Page.CreateSelection(visSelTypeEmpty);

foreach (shape : shapes)
{
    if (xxx)
        sel.Select(shape, visSelect);
}

sel.Delete();