0

Visio ドキュメントを操作するために、SWT (Standard Widget Toolkit) によって提供される OleAutomation Java API を使用しています。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();
    }
}

アプリケーション ロジックの特定の場所からこの削除を呼び出すと、特有の問題に直面しています。ページに図形を配置し、delete を呼び出します。奇数番号の呼び出しの場合、削除は成功し、varResult は VT_EMPTY(1 回目、3 回目、5 回目....時間の呼び出し) を返します。偶数番号の呼び出し (ページに形状を再度配置し、-2nd、4th、6th などを呼び出します) の場合、varResult は失敗を示す「null」を返します。ここで、偶数番号の呼び出しで何が問題になっているのかを理解する必要があります。Visio Automation フレームワークには、失敗の理由をログに記録できるログ機能がありますか?

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 に答える