2012-04-03 79 views
-1

在Visio VBA(或COM API)Visio頁面按名稱查找形狀無例外

如何在沒有找到形狀名稱時沒有預料到異常的形狀?

...在我的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(,出)之前,檢查該形狀所有腦幹;

,或者(page.Shapes.Contain( 「DraftText」))...

什麼想法?

回答

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); 
} 
+1

我猜這最有可能是可能的,你可能想要添加一個檢查異常是否被捕獲'catch(COMException ex){if(ex.ErrorCode!= 0x00000)throw;}'所以你不會錯過一個真正的例外 – 2012-07-31 06:48:37

1

通過VBA做到這一點,我只是在嘗試按名稱獲取形狀之前執行「錯誤恢復」,然後錯誤地返回PROC_ERR以恢復錯誤處理。

如果您無法禁用該異常,則可以遍歷每個形狀並檢查其名稱與您正在查找的名稱。儘管如此,與內置的名稱查找相比,這需要花費更長的時間。

+0

上的錯誤是一樣的try {}趕上(){} 這是不好的做法,我儘量避免任何手段necessery。 巡迴是一個選項,我不喜歡,但可能是如果什麼都不可能。 我現在會+1,如果沒有答案將適用,我會V :) 感謝您的重播。 – 2012-04-04 15:54:31