找到并设置UDT成员VB6的值

找到并设置UDT成员VB6的值,vb6,user-defined-types,user-defined-fields,tlbinf32,Vb6,User Defined Types,User Defined Fields,Tlbinf32,我正在寻找一些帮助来解决UDT成员的动态集值问题。我正在尝试做一些类似前面的伪代码的事情: Public sub UDTMemberSetValue(ByRef pvUDTValue As Variant, _ ByVal psMemberName As String, _ pvMemberValue As Variant) Dim mMember as Member

我正在寻找一些帮助来解决UDT成员的动态集值问题。我正在尝试做一些类似前面的伪代码的事情:

Public sub UDTMemberSetValue(ByRef pvUDTValue As Variant, _
                             ByVal psMemberName As String, _
                             pvMemberValue As Variant)
    Dim mMember as Member

    For each mMember in pvUDTValue.Members
        if mMember.Name = psMemberName then
            if isObject(pvMemberValue) then
                Set mMember.Value = pvMemberValue
            else
                mMember.Value = pvMemberValue
            End if
        End If
    Next
End Sub
我已经搜索了好几个网站,不幸的是没有一个是我需要的。
所以我想知道是否有人能帮我做这件事?

你不能直接在VB6中做这件事。但是,您可以使用
tlbinf32.dll
ActiveX组件,该组件作为Windows的一部分安装,至少从Windows XP开始。这可用于从类型库中提取有关类、接口和记录(即UDT)的信息。缺点是,如果您想将其用于VB UDT,则只有在公开的VB类或UserControl中将UDT声明为Public时,它才会起作用

组件应进行注册;但如果不是,请使用
regsvr32.exe tlbinf32.dll
。它应该以
TypeLib Information
的形式出现在引用列表中,并具有库名
TLI

我已经修改了您的伪代码以包含库。这个的原始版本非常像你的代码,我想知道你是否已经知道了

但是有一种更简单的方法可以遍历成员信息,并设置正确的value属性:使用
RecordField
属性。不幸的是,至少在我的机器上,我无法将pvUDTValue直接传递到此属性。但经过反复试验,我发现它与变体的副本一起工作。您只需记住在更新字段后用副本替换原始变量

Public Sub UDTMemberSetValue(ByRef pvUDTValue As Variant, _
                             ByVal psMemberName As String, _
                             ByRef pvMemberValue As Variant)
    Dim oApp            As TLI.TLIApplication
    Dim vTemp           As Variant

    Set oApp = New TLI.TLIApplication

    vTemp = CVar(pvUDTValue)
    oApp.RecordField(vTemp, psMemberName) = pvMemberValue
    pvUDTValue = vTemp

End Sub

+1一些链接:(从2000年开始,但仍然相关),如果您将UDT转换为类,则可以使用CallByName