-1

在 Visio VBA(或 COM API)中

当找不到形状名称时,如何在不期望异常的情况下获得形状?

...在我的 visio 页面中,可能有也可能没有名为“DraftText”的矩形形状。

我想检查它是否在那里,如果是的话,做某事。

我的代码看起来像:

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 块作为编码工具,

我正在寻找一种在使用之前检查形状存在的方法,例如 IDictionary.TryGetValue(, out);

或 if(page.Shapes.Contain("DraftText"))...

有任何想法吗?

4

2 回答 2

1

通过 VBA 执行此操作,我只是在尝试按名称获取形状之前执行“下一个错误恢复”,然后在错误时转到 PROC_ERR 以恢复错误处理。

如果您无法禁用该异常,您可以遍历每个形状并根据您要查找的形状检查其名称。不过,与按名称进行的内置查找相比,这将花费更长的时间。

于 2012-04-03T21:48:38.263 回答
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);
}
于 2012-07-30T21:00:26.593 回答