【问题标题】:Late binding issue with Enums枚举的后期绑定问题
【发布时间】:2013-12-03 19:35:01
【问题描述】:

在开发过程中一切都很好,早期绑定很有效,但现在我已经转向后期绑定进行生产,而且我遇到了 Visio Enums 问题。如下:

 Set AppVisio = CreateObject("visio.application")
 Set vsoSelection = AppVisio.ActiveWindow.Selection
 Call vsoSelection.GetIDs(lngShapeIDs)

 With .Shapes.ItemFromID(lngShapeIDs(0))
    .CellsSRC(visSectionObject, visRowXFormOut, visXFormPinX).FormulaU = sngShapeHCenter
    .CellsSRC(visSectionObject, visRowXFormOut, visXFormPinY).FormulaU = sngShapeVCenter
    .CellsSRC(visSectionObject, visRowXFormOut, visXFormWidth).FormulaU = sngShapeWidth
    .CellsSRC(visSectionObject, visRowXFormOut, visXFormHeight).FormulaU = sngShapeHeight
 End With

在早期绑定中

visSectionObject, visRowXFormOut, visXFormPinX etc.

全部解决,但我无法让它们在后期绑定中解决。

我已尝试添加 AppVisio。前缀参数无济于事,任何人都可以帮助并告诉我引用枚举的正确方法吗?

我尝试使用 Visio VBA 记录器查看它提供的内容,但它并不像我希望的那样冗长(是的,我知道,它是如此冗长,但这次不是)。

这需要适用于 Visio 2010 和 2013 等。

【问题讨论】:

    标签: vba visio


    【解决方案1】:

    这是后期绑定的权衡之一,或者更准确地说,是不在工具>参考中设置显式参考。然后,预定义的枚举不再可用。

    您必须将枚举替换为其数值 (see e.g. this list)。

    例如visRowXFormOut的数值为1,您可以在即时窗口中自行查看:

    ?visRowXFormOut
    1
    

    因此,您可以将所有visRowXFormOut 实例替换为1s,或者将visRowXFormOut 声明为常量:

    Const visRowXFormOut As Integer = 1
    

    并保持其余代码不变。

    【讨论】:

    • 嗨,谢谢你 - 是的,这似乎是惩罚......我还找到了以下link,它描述了你所描述的内容。很高兴他们还提供了一个“枚举页面”来复制和使用。我已经接受了这个想法并为 Visio 2013 重新生成,让我的代码在 2010 年和 2013 年都能正常工作。
    【解决方案2】:

    自己定义所有枚举器或在某些情况下用纯数字替换代码可能有点太具有挑战性了。还有另一种方式。

    如果您在 Windows 中使用脚本(语言看起来像 .vbs),那么您仍然可以通过将文件包装到 .WSF (Windows Script) 文件中来使用这些常量。

    在 .wsf 文件中,您有一个“引用”项,允许您使用类型库中的常量。

    <job id='my script'>
    
        <!-- this imports enumerators from Visio typelib -->
        <reference guid="{00021A98-0000-0000-C000-000000000046}" version="4.14" />
    
        <script language="vbscript">
            ... 
            your code here which uses constants from Visio type library here, like:
            ...
            WScript.Echo visRowXFormOut ' prints 1
            ...
        </script>
    
    </job>
    

    不是 100% 确定您是否必须在项目中明确指定版本,但无论如何,Visio 2010 版本是 4.14,Visio 2013 是 4.15。它也可以在没有明确的版本规范的情况下工作(请参阅 wsf 文档)

    您还可以考虑包装整个 .vbs 文件而不进行如下更改:

    <job id='my script>
    
        <reference guid="{00021A98-0000-0000-C000-000000000046}" version="4.14"/>
    
        <!-- you can use enumerators in that script -->
        <script language="vbscript" src="code.vbs" />
    
    </job>
    

    【讨论】:

      猜你喜欢
      • 2011-06-28
      • 1970-01-01
      • 2016-03-26
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多