Страница Visio Поиск формы по имени без исключений - PullRequest
0 голосов
/ 03 апреля 2012

В 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")) ...

Есть идеи?

Ответы [ 2 ]

1 голос
/ 04 апреля 2012

Делая это через VBA, я просто делаю «при возобновлении ошибки далее», прежде чем пытаться получить фигуру по имени, и при ошибке перехожу к PROC_ERR, чтобы возобновить обработку ошибок позже.

Если вы не можете отключить исключение, вы можете перебрать каждую фигуру и сравнить ее имя с тем, которое вы ищете. Это займет гораздо больше времени по сравнению со встроенным поиском по имени.

0 голосов
/ 31 июля 2012

Использование блока 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);
}
...