我有一种感觉,答案是“不可能”,但我会试一试...... 我处于一个令人尴尬的位置,即通过一些增强修改传统的VB6应用程序。转换为更智能的语言不是一种选择。 该应用程序依赖于大量用户定义的类型来移动数据。我想定义一个公共函数,它可以引用任何这些类型并提取包含的数据 在伪代码中,这是我正在寻找的东西:
Public Sub PrintUDT ( vData As Variant )
for each vDataMember in vData
print vDataMember.Name & ": " & vDataMember.value
next vDataMember
End Sub
似乎这个信息需要在某个地方提供给COM ......那里有任何VB6大师小心翼翼地拍摄?
谢谢,
丹
答案 0 :(得分:38)
答案 1 :(得分:1)
如果您将所有类型更改为类。你有选择。从类型转换为类的重大缺陷是你必须使用新的keyworld。每次声明类型变量时都会添加新的。
然后您可以使用variant关键字或CallByName。 VB6没有任何反射类型,但您可以制作有效字段列表并测试它们是否存在,例如
班级考试有以下
Public Key As String
Public Data As String
然后您可以执行以下操作
Private Sub Command1_Click()
Dim T As New Test 'This is NOT A MISTAKE read on as to why I did this.
T.Key = "Key"
T.Data = "One"
DoTest T
End Sub
Private Sub DoTest(V As Variant)
On Error Resume Next
Print V.Key
Print V.Data
Print V.DoesNotExist
If Err.Number = 438 Then Print "Does Not Exist"
Print CallByName(V, "Key", VbGet)
Print CallByName(V, "Data", VbGet)
Print CallByName(V, "DoesNotExist", VbGet)
If Err.Number = 438 Then Print "Does Not Exist"
End Sub
如果您尝试使用不存在的字段,则会引发错误438。 CallByName允许您使用字符串来调用类的字段和方法。
当您将Dim声明为New时,VB6会做什么非常有趣,并且会极大地减少此转换中的错误。你看这个
Dim T as New Test
与
的处理方式完全不同Dim T as Test
Set T = new Test
例如,这将起作用
Dim T as New Test
T.Key = "A Key"
Set T = Nothing
T.Key = "A New Key"
这会产生错误
Dim T as Test
Set T = New Test
T.Key = "A Key"
Set T = Nothing
T.Key = "A New Key"
这样做的原因是,在第一个例子中,VB6标记T,这样无论何时访问某个成员,它都会检查T是否为空。如果是,它将自动创建测试类的新实例,然后分配变量。
在第二个示例中,VB不会添加此行为。
在大多数项目中,我们严格确保我们将Dim T作为测试,设置T =新测试。但在你的情况下,因为你想使用Dim T将类型转换为具有最少副作用的类,因为新测试是要走的路。这是因为Dim as New会使变量模仿类型的工作方式。
答案 2 :(得分:1)
@丹,
看起来您正在尝试使用UDT的RTTI。我不认为你可以在不知道运行时之前的UDT的情况下获得那些信息。 为了帮助您入门,请尝试:
Understanding UDTs
因为没有这种反射能力。我会为我的UDT创建自己的RTTI。
为您提供基线。试试这个:
Type test
RTTI as String
a as Long
b as Long
c as Long
d as Integer
end type
您可以编写一个实用程序来打开每个源文件,并将带有类型名称的RTTI添加到UDT。将所有UDT放在一个公共文件中可能会更好。
RTTI将是这样的:
“的字符串:长:长:长:整数”
使用UDT的内存,您可以提取值。