2012-04-03 6 views
-1

In Visio VBA (oder COM API)Visio Seite Shapes suchen nach Namen, ohne Ausnahmen

Wie kann ich eine Form erhalten, ohne eine Ausnahme zu erwarten, wenn die Form Name nicht gefunden wird?

... in meiner Visio-Seite möglicherweise eine Rechteckform mit dem Namen "DraftText".

Ich möchte überprüfen, ob es da ist und wenn ja, mach etw.

mein Code scheint wie:

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); 
} 
... 
... 

Das Problem ist, dass, wenn die Form "DraftText" nicht da ist, ich eine COM-Ausnahme erhalten.

wie ich bin gegen die Verwendung von try catch-Block als Codierungs Dienstprogramm,

i für eine Art und Weise bin für die Form existance zu überprüfen, bevor es zu nehmen, wie IDictionary.TryGetValue (, out);

oder wenn (page.Shapes.Contain ("DraftText")) ...

Irgendwelche Ideen?

Antwort

0

Mit try catch-Block

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

Ich vermute, dass dies am wahrscheinlichsten ist, was möglich ist. Vielleicht möchten Sie eine Überprüfung hinzufügen, welche Exception gefangen wurde? Catch (COMException ex) {if (ex.ErrorCode! = 0x00000) throw;} 'damit Sie kein True verpassen Ausnahme –

1

Wenn ich es über VBA mache, mache ich einfach einen "Fehler bei der nächsten Folge", bevor ich versuche, die Form nach Namen zu bekommen, und bei einem Fehler auf PROC_ERR, um die Fehlerbehandlung danach fortzusetzen.

Wenn Sie die Ausnahme nicht deaktivieren können, können Sie jede Form durchlaufen und ihren Namen mit dem Namen vergleichen, den Sie suchen. Dies würde jedoch viel länger dauern, verglichen mit der integrierten Suche nach Namen.

+0

On Error ist die gleiche wie try {} catch() {} Es ist eine schlechte Praxis ich versuche, jede Mittel necessery zu vermeiden. iterating ist eine Option, die ich nicht mag, aber möglicherweise, wenn nichts möglich ist. Ich werde für jetzt +1, wenn keine Antwort anwendbar ist, werde ich V it :) Vielen Dank für Ihre Wiederholung. –