Передача переменной неизвестного типа

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
anian
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 116
Зарегистрирован: 02.10.2002 (Ср) 12:05
Откуда: /dev/null

Передача переменной неизвестного типа

Сообщение anian » 24.07.2004 (Сб) 17:10

Есть 2 пользовательских типа: myType1 и myType2, например...
Количество полей в них разное, но тип полей везде один - string.
Есть класс, в ем есть процедурка, которая должна принять переменную Х и чего-нить с ней сделать...но...переменная может быть любого из этих типов, заранее не известно...
Пример:

Код: Выделить всё
вызов:
Dim tcMI as tMInfo либо Dim tcСI as tСInfo

aXML.SaveNewItem "Managers", "Manager", tcMI 'либо tcСI


процедурка:
Friend Sub SaveNewItem(sGroup$, sSubGroup$, ByRef tVI)   
   
    Select Case sSubGroup
        Case "Manager"
                tVI.ManName
        Case "Client"
                 tVI.ClientName
    End Select
   
End Sub



Пробовал передавать указатель, потом по указателю находить переменную через CopyMemory - либо виснет, либо ничего не копирует...
Трез-вы-ми мы не сда-дим-сииии!!! Ураааааа!!!

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Re: Передача переменной неизвестного типа

Сообщение Approximator » 25.07.2004 (Вс) 2:51

anian писал(а):Есть 2 пользовательских типа: myType1 и myType2, например...
Количество полей в них разное, но тип полей везде один - string.
Есть класс, в ем есть процедурка, которая должна принять переменную Х и чего-нить с ней сделать...но...переменная может быть любого из этих типов, заранее не известно...
Пример:

Код: Выделить всё
вызов:
Dim tcMI as tMInfo либо Dim tcСI as tСInfo

aXML.SaveNewItem "Managers", "Manager", tcMI 'либо tcСI


процедурка:
Friend Sub SaveNewItem(sGroup$, sSubGroup$, ByRef tVI)   
   
    Select Case sSubGroup
        Case "Manager"
                tVI.ManName
        Case "Client"
                 tVI.ClientName
    End Select
   
End Sub



Пробовал передавать указатель, потом по указателю находить переменную через CopyMemory - либо виснет, либо ничего не копирует...

Усё очень просто. Добавляешь тип:
Код: Выделить всё
Public Type UVar
UVarType as Long
UVarPtr as Long
End Type

Dim tcMI as tMInfo либо Dim tcСI as tСInfo,lUV as UVar

aXML.SaveNewItem "Managers", "Manager", tcMI 'либо tcСI


процедурка:
Friend Sub SaveNewItem(sGroup$, byref sSubGroup$ as UVar, ByRef tVI)   
   
    Select Case sSubGroup.UVarType
        Case 1 '"Manager"
                tVI.ManName
        Case 2 '"Client"
                 tVI.ClientName
    End Select
   
End Sub

обращаемся:
lUV.UVarType=1
lUV.UVarPtr=VarPtr(tcMI)
SaveNewItem ..., lUV, ...

lUV.UVarType=2
lUV.UVarPtr=VarPtr(tcCI)
SaveNewItem ..., lUV, ...


Иного не дано... Можно, конечно добавить в оба пользовательских типа в самом начале для идентификации один байт... Кстати, чтобы обращаться к данным в структуре по указателю необходимо сначала соблюсти выравнивание, см. подробнее http://bbs.vbstreets.ru/viewtopic.php?t=8760
С уважением, Approximator.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20

    TopList