我正在寻找一些帮助来解决 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 XP 开始作为 Windows 的一部分安装。这可用于从类型库中提取有关类、接口(interface)和记录(即 UDT)的信息。不利的一面是,如果您想将其与 VB UDT 一起使用,则只有当您的 UDT 在公开公开的 VB 类或 UserControl 中被声明为 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

关于vb6 - 找到并将值设置为 UDT 成员 VB6,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23797038/

10-13 06:51