Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何确定控件(或对象)的类型?_Vba_Vb6 - Fatal编程技术网

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

Vba 如何确定控件(或对象)的类型?,vba,vb6,Vba,Vb6,只有三种方式可以在互联网上讨论,特别是在这个论坛上 即: -字符串方法TypeName -笨拙的类型 -按控件名称,以特定符号定义 我说得对吗,没有内置工具可以获取正常的数值常量,比如MsoControlType? .直接回答 我说得对吗,没有内置工具可以获取正常的数值常量,比如MsoControlType 是的,没错。除非您使用列出的技术实现自己的 不包括VarType,它将在给定任何对象引用的情况下返回vbObject 迂腐的回答 您所指的普通数值常量与控件的类型完全无关-这些MsoCon

只有三种方式可以在互联网上讨论,特别是在这个论坛上

即: -字符串方法TypeName -笨拙的类型 -按控件名称,以特定符号定义

我说得对吗,没有内置工具可以获取正常的数值常量,比如MsoControlType? .

直接回答 我说得对吗,没有内置工具可以获取正常的数值常量,比如MsoControlType

是的,没错。除非您使用列出的技术实现自己的

不包括VarType,它将在给定任何对象引用的情况下返回vbObject

迂腐的回答 您所指的普通数值常量与控件的类型完全无关-这些MsoControlType常量只是枚举值,CommandBar API在您请求创建控件时使用这些枚举值来确定要创建的控件的类型

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

?TypeName(Application.VBE.CommandBars(1).Controls(1))
CommandBarPopup
CommandBarPopup是类,因此是控件的类型,而不是msoControlPopup,也不是10:


类型是指您赋予TypeOf[variable]的值是[*type*],或Dim[variable]的值是[*type*]:它是一个标识符,在对象的情况下引用类/接口,当然-类型也可以是基本类型之一,例如整数或布尔值。鉴于VB6/VBA中反射功能的弱点,缺乏类似.net的类型系统,其中类型本身是可以使用的抽象、自定义枚举类型和接受对象的函数,具有带TypeOf检查的Select Case块,是该函数返回表示所提供对象类型的正常数值常量的最佳选择。

用例是什么?您指的是ActiveX控件还是VBA文档宿主控件,即不是MsoControlType.msoControlActiveX。你认为Windows API内置工具吗?@共产国际RoFrand!我的意思是内置的as,没有任何特殊的调整,比如特殊格式的控件名、第三方工具等,使我的VB6项目保持默认引用。在我今天的例子中,我处理的是一个标准控件CommandButton、CheckBox等,通常是VB6表单……我认为区分控件会有问题。由于枚举值重叠,例如,通常默认值为1,2,3。。。这对你正在尝试做的事情有问题吗?如果愿意,您可以创建自己的枚举。您可以使用ole32.dll API获得唯一的编号,这些API对于VB6来说几乎是不可分割的,因此外部主要是语义。VB不需要父dll和类字符串以外的任何东西来检索CLSID或ProgID。这是COM关心的唯一两个标识符。除了定位IClassFactory接口之外,它甚至不关心CoClass的其他功能—它只关心接口。类的枚举是库的一个实现细节。comctl32.dll不是VB6的一部分,那么为什么希望VB6提供枚举呢?我想我们对第三方有不同的定义。对我来说,第三方意味着包含与VBA中已经包含的代码不同的代码。如果有人感兴趣,下面介绍如何使用Enum变量类型。值得注意的是,这种抽象是一种特性,因为它允许实现甚至控件的类在幕后发生变化。还要注意的是,MsoControlType.msoControlActiveX控件实际上将其ClassInfo存储在f流中ClassTable中的FRX文件中,因此VBA始终知道如何保存和还原该控件。@Mat的杯子非常感谢您简短而清晰的回答,并感谢您对该问题的详细和有用的解释。