我正在使用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框架中是否有某种日志记录工具可以记录失败的原因?
答案 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();