在VB6中找到并设置UDT成员的值

3

我需要帮助解决关于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

我已经搜索了几个网站,但不幸的是,没有一个网站能满足我的需求。所以我想知道是否有人可以帮助我?


1
如果您将UDT转换为类,就可以使用CallByName。 - Alex K.
1个回答

3
你不能在 VB6 中直接完成此操作。但是,你可以使用 tlbinf32.dll ActiveX 组件,该组件自至少 Windows XP 以来作为 Windows 的一部分安装。这可用于从类型库中提取有关类、接口和记录(即 UDT)的信息。缺点是,如果要将其与 VB UDT 一起使用,则仅当 UDT 在公开的 VB 类或 UserControl 中声明为 Public 时才能正常工作。
应该注册该组件;但如果未注册,请使用 regsvr32.exe tlbinf32.dll。它应该出现在引用列表中,并具有库名称 TLI
我已修改了你的伪代码以包括该库。原始版本与你的代码非常相似,我想知道你是否已经知道这一点。
但是,还有一种更简单的方法,不需要遍历成员信息并设置正确值的属性:使用 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

一些链接:MSDN杂志文章(虽然是2000年的,但仍然相关),相关问题 - MarkJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接