VB6 UDT的自检

时间:2009-02-13 22:13:22

标签: vb6 user-defined-types tlbinf32

我有一种感觉,答案是“不可能”,但我会试一试...... 我处于一个令人尴尬的位置,即通过一些增强修改传统的VB6应用程序。转换为更智能的语言不是一种选择。 该应用程序依赖于大量用户定义的类型来移动数据。我想定义一个公共函数,它可以引用任何这些类型并提取包含的数据 在伪代码中,这是我正在寻找的东西:

Public Sub PrintUDT ( vData As Variant )
  for each vDataMember in vData
    print vDataMember.Name & ": " & vDataMember.value 
  next vDataMember 
End Sub

似乎这个信息需要在某个地方提供给COM ......那里有任何VB6大师小心翼翼地拍摄?

谢谢,

3 个答案:

答案 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的内存,您可以提取值。