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

我已经搜索了几个站点,不幸的是,没有一个站点接近我的需要。所以我想知道是否有人可以帮助我解决这个问题?

4

1 回答 1

3

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

组件应该被注册;但如果不是,请使用regsvr32.exe tlbinf32.dll. 它应该出现在您的参考列表中TypeLib Information,并且具有库名称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
于 2014-05-22T09:04:35.160 回答