0

我正在使用 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(1st,3rd,5th.... time call)。对于偶数调用(我将形状再次放在页面上并调用 -2nd、4th 6th 等),varResult 返回“null”,表示失败。现在我需要了解偶数呼叫出了什么问题。Visio 自动化框架中是否有某种日志记录工具可以记录失败的原因?

4

1 回答 1

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();
于 2015-07-02T15:19:41.010 回答