在Visio VBA(或COM API)
中如果找不到形状名称,如何在不期待异常的情况下获得形状?
...在我的visio页面中,可能有也可能没有名为“DraftText”的矩形形状。
我想检查它是否存在,如果是,请做smth。
我的代码似乎是:
Shape waterMarkRect = page.Shapes["DraftText"];
if (waterMarkRect == null)
{
waterMarkRect = page.DrawRectangle(0, 0, 50, 15);
waterMarkRect.Name = "DraftText";
waterMarkRect.NameU = waterMarkRect.Name;
waterMarkRect.Text = "INCONSISTANT";
Layer wMarkLayer = page.Layers["WMark"] ?? page.Layers.Add("WMark");
wMarkLayer.Add(waterMarkRect, 0);
}
...
...
问题是,如果形状“DraftText”不存在,我会得到COM异常。
因为我反对使用try catch block作为编码实用程序,
我正在寻找一种检查形状存在的方法,比如IDictionary.TryGetValue(,out);
或if(page.Shapes.Contain(“DraftText”))...
任何想法?
答案 0 :(得分:1)
通过VBA执行此操作,我只是在尝试按名称获取形状之前执行“on next resume next”,并在出错时转到PROC_ERR以便以后恢复错误处理。
如果您无法禁用该异常,则可以遍历每个形状并根据您要查找的形状检查其名称。但是,与内置的名称查找相比,这需要花费更长的时间。
答案 1 :(得分:0)
使用try catch块
Shape waterMarkRect = null;
try {
waterMarkRect = page.Shapes["DraftText"];
}
catch (Exception){
}
if (waterMarkRect == null)
{
waterMarkRect = page.DrawRectangle(0, 0, 50, 15);
waterMarkRect.Name = "DraftText";
waterMarkRect.NameU = waterMarkRect.Name;
waterMarkRect.Text = "INCONSISTANT";
Layer wMarkLayer = page.Layers["WMark"] ?? page.Layers.Add("WMark");
wMarkLayer.Add(waterMarkRect, 0);
}