2012-04-03 13 views
-1

없이 이름으로 Shape를 찾기의 Visio 페이지의 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 예외를 얻을 수 있다는 것입니다 : 같은

내 코드 보인다. 난 종래 예 IDictionary.TryGetValue (아웃)으로 복용 형태에 존재하지 않는지 체크하는 방법을 검색하고

제가 코딩 유틸리티로서 사용해 캐치 블록을 사용 대하여 생각대로

;

또는 (page.Shapes.Contain ("DraftText"))의 경우 ...

어떤 아이디어가?

답변

0

오류에 시도의 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

이게 가능할 가능성이 가장 높습니다. Exception이 잡히는 것에 대한 체크를 추가 할 수 있습니다. catch (COMException ex) {if (ex.ErrorCode! = 0x00000) throw;}'그래서 당신은 사실을 놓치지 않을 것입니다. 예외 –

1

VBA를 통해이 작업을 수행 할 때 이름을 사용하여 모양을 얻으려고하기 전에 "다음에 오류 재개"를 수행하고 나중에 오류 처리로 PROC_ERR로 이동하여 오류 처리를 다시 시작합니다.

예외를 사용 중지 할 수없는 경우 모든 도형을 반복하고 원하는 이름과 비교하여 이름을 확인할 수 있습니다. 이 기능은 내장 룩업과 비교하여 수행하는 데 시간이 오래 걸립니다.

+0

를 사용하여 시도 {} 캐치과 동일() {} 그것은 나쁜 관행 내가 어떤 수단의 necessery을 피하려고한다. itterating은 선택 사항입니다. 저는 그다지 좋지 않을 수도 있습니다. 답을 쓸 수 없다면 지금 +1하겠습니다. 나는 주셔서 감사합니다. –