Найдено и установлено значение члена UDT VB6

Мне нужна помощь в решении проблемы с динамическими заданными значениями членов 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

Я обыскал несколько сайтов, к сожалению, ни один из них не подошел близко к моей необходимости. Поэтому я хотел бы знать, может ли кто-нибудь помочь мне с этим?


person user3663173    schedule 22.05.2014    source источник
comment
Если вы преобразуете UDT в класс, вы можете использовать CallByName   -  person Alex K.    schedule 22.05.2014


Ответы (1)


Вы не можете сделать это в прямом VB6. Однако вы можете использовать компонент tlbinf32.dll ActiveX, который устанавливается как часть Windows, по крайней мере, с Windows XP. Это можно использовать для извлечения информации о классах, интерфейсах и записях (т. е. UDT) из библиотек типов. Недостатком является то, что если вы хотите использовать это с VB UDT, это будет работать только в том случае, если ваш UDT объявлен общедоступным в общедоступном классе VB или UserControl.

Компонент должен быть зарегистрирован; но если это не так, используйте 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
person Mark Bertenshaw    schedule 22.05.2014
comment
+1 Несколько ссылок: статья в журнале MSDN (от 2000 г., но до сих пор актуальна ), связанный вопрос - person MarkJ; 22.05.2014