什么是" .1。"在bstrProgId的末尾作为字符串mean / do?

时间:2017-01-02 16:49:12

标签: excel vba syntax controls

在动态创建用户表单布局时,在添加控件时,我发现语法需要" .1"在bstrProgId的末尾,作为以下代码中的字符串:

For loopthroughsteps = 0 To 0
    For foodgroup_id = 0 To 6
        'For vit = 2 To 18
        For vit = 2 To 3
            Dim listbox As Object
            Set listbox = UserForm3.Controls.Add("Forms.Listbox.1", foodgroup_id & "-" & vit & "-" & loopthroughsteps, True)                
            With listbox
                .Left = 35 * (vit - 1) + 205 * (vit - 2)
                .Top = 25 + (foodgroup_id) * 50
                .Height = 50
                .Width = 205
            End With
        Next vit
    Next foodgroup_id
Next loopthroughsteps

" .1"在Controls.Add("Forms.Listbox之后做什么或意味着什么?

我在文档中找不到它,但我很好奇;

  • 它是控件表单的索引,但为什么它(总是)1? 为什么它会成为字符串中的数字?

  • 或者它是某种形式的指示,如果是这样的话?

2 个答案:

答案 0 :(得分:1)

Add(ProgID, Name, Visible)

第一个参数progID只是一个字符串,COM工厂解析并决定要创建的对象。它没有被指定为类的编程名称(即typename),而是指定对象工厂映射到给定类的字符串。

为什么"Forms.Listbox.1"而不是Forms.Listbox? “.1”背后的原因与实施有关,很可能是由于开发和维护VBA的开发团队中的“版本控制”。开发人员只需使用UserForm.Add方法中记录的指定字符串“progID”。

答案 1 :(得分:1)

除了其他好的答案之外还有一些文件(评论太多了)......

如果您使用Regedit.exe专门针对CLASSES_ROOT \ CLSID配置单元在注册表中查找,那么您将看到类似这样的内容

[HKEY_CLASSES_ROOT\CLSID\{884e2013-217d-11da-b2a4-000e7bbb2b09}]


[HKEY_CLASSES_ROOT\CLSID\{884e2013-217d-11da-b2a4-000e7bbb2b09}\ProgID]
         @="X509Enrollment.CAlternativeName.1"

[HKEY_CLASSES_ROOT\CLSID\{884e2013-217d-11da-b2a4-000e7bbb2b09}\VersionIndependentProgID]
         @="X509Enrollment.CAlternativeName"

因此,人们可以看到ProgIDVersionIndependentProgID。有了这个,就可以控制想要实例化的控件的版本。

这是Microsoft文档链接 VersionIndependentProgID