如何确定控件(或对象)的类型?

use*_*332 0 vb6 vba

有三种方法,在互联网上讨论,特别是在这个论坛上讨论
如何检查VB 6中的对象类型 - 除了'TypeName'之外是否有任何方法
如何在VB 6中检查对象的类型?- 我不想使用'TypeOf'方法
如何检查VB 6中的对象类型 - 是否有除'TypeName'以外的任何方法

即:
- 字符串方法TypeName
- 笨拙TypeOf
- 按控件名称,以特定表示法定义

我是对的,没有内置工具来获得正常的数字常量,比如MsoControlType
.

Mat*_*don 8

直接回答

我是对的,没有内置工具来获得正常的数字常量,比如MsoControlType?

对,那是正确的.除非您使用您列出的技术实现自己的.

好吧,排除VarType,将返回vbObject给定任何对象引用.


迂腐的答案

你所指的"正常数字常量"与控件的类型完全无关- 这些MsoControlType常量只是API用于确定要求创建控件时要创建的控件类型Enum值.CommandBar

MsoControlType.msoControlButton不是一种控件,它是一个值为1的常量.没有更多,没有更少 - 控件的类型是一个类,而不是一个数字常量:

?TypeName(Application.VBE.CommandBars(1).Controls(1))
CommandBarPopup
Run Code Online (Sandbox Code Playgroud)

CommandBarPopup是类(因此是控件的类型),不是msoControlPopup,而不是10:

对象浏览器中的CommandBarPopup

是你给什么TypeOf [variable] Is [*type*],或者Dim [variable] As [*type*]:它是指一类/接口标识符(在对象的情况下,当然-一个类型也有可能是原语,例如一个IntegerBoolean).并且考虑到VB6/VBA中反射功能的弱点,因为缺少类似.net的类型系统,其中类型本身是可以使用的抽象,自定义Enum类型和带有对象的函数,具有Select Case带有TypeOf检查的块,是这个函数返回一个你最好的选择正常的数字常量代表所提供的对象的类型.

  • 值得注意的是,这个抽象是一个*特征*,因为它允许实现甚至控件的类在幕后变化*.另请注意,`MsoControlType.msoControlActiveX`控件实际上将其ClassInfo存储在FRX文件中(在`f`流中的`ClassTable`中),因此VBA始终知道如何持久化和恢复控件. (2认同)