Ведение журнала ошибок Microsoft Visio OLE Automation
Я работаю с API-интерфейсами OleAutomation Java, предоставляемыми SWT(Standard Widget Toolkit), для управления документами Visio. Мы создали оболочки Java для API автоматизации с помощью вызовов OleAutomation. например:(удалить форму)
/**
* 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-й.... время вызова). Для вызовов с четными номерами (я снова помещаю фигуру на страницу и вызываю -2-й,4-й, 6-й и т. Д.) VarResult возвращает значение "ноль", что указывает на ошибку. Теперь мне нужно понять, что не так с четным звонком. Есть ли какая-либо возможность ведения журнала в среде Visio Automation, которая может регистрировать причину сбоя?
1 ответ
Попробуйте удалить фигуры в обратном направлении. Т.е. повторять коллекцию в обратном порядке при удалении фигур. Это означает, что вместо:
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();