Dim X as Variant
...
If TypeOf X Is Point2d Then ...
Именно. Вариант не может содержать пользовательского типа.Qwertiy писал(а):Вариант из области извращений
arthur2 писал(а):Вариант не может содержать пользовательского типа.
Итак, может ли вариант содержать пользовательский тип?Хакер писал(а):Может, не надо распространять лжеинформацию.
arthur2 писал(а):Итак, может ли вариант содержать пользовательский тип?Хакер писал(а):Может, не надо распространять лжеинформацию.
Хакер писал(а):Может, не надо распространять лжеинформацию.
Option Explicit
Private Type a
b As Integer
c As Integer
End Type
Public Sub test()
Dim a As a, b
b = a
End Sub
---------------------------
Microsoft Visual Basic
---------------------------
Compile Error:
Only user-defined types defined in public object modules can be coerced to or from a variant or passed to late-bound functions
---------------------------
ОК Справка
---------------------------
arthur2 писал(а):Итак, как поместить в вариант пользовательский тип?
Хакер писал(а):В приведённой тобой цитате ошибки уже содержится ответ на этот вопрос.
Только определяемые пользователем типы, определенные в общественных объектных модулях, могут быть принуждены к или от варианта или переданы к последним направляющимся функциям.
CyberPunk писал(а):Вопрос в следующем.
Можно ли, и если можно, то как, создать функцию, которая на входе может получать любой из этих типов (Variant ?) и в зависимости от типа данных на входе, выполняющую разные действия.
Т.е. по сути тут два вопроса.
1.Как передать эти типы в одну переменную.
2. Как определить, какого типа переменная пришла на вход функции.
Заранее спасибо.
Public Type Point_d
fPoint As Point2d
sPoint As Point3d
End Type
ger_kar писал(а):Из чего можно сделать вывод, что для того чтобы передать UDT в вариант, объявить его в модуле класса, потому что под "общественными объектными модулями" я понял именно модуль класса, другого на ум ничего не пришло.
ger_kar писал(а):огда по сути вариант будет содержать просто объектную ссылку.
Почему бред? Если обернуть UDT в класс, то к UDT можно обратиться соответственно через экземпляр этого класса, ссылку на этот класс можно присвоить вариантной переменной объявленной как Object. Перечитал еще раз свой ответ, там все логично, потому что речь идет об оборачивании UDT в класс, соответственно в переменную типа объест (по сути вариантную) можно поместить ссылку на экземпляр этого класса. Если рассмотреть это глубже, то конкретно в ней будет содержаться ссылка на интерфейс IDispath. Если все сделать через класс, то все вполне будет работать.Хакер писал(а):Логика — зашибись. Если объявить UDT внутри класса, то при присвоении этого UDT варианту в варианте с какого-то перепугу окажется объектная ссылка на класс? Да что это за бред?!
Твое мышление (позволю себе высказаться за всех) тоже порой непостижимо. Я имею ввиду сам процесс мышления, а не готовые высказывания, которые являются его результатом. Т.е. когда читаешь понятно, но например мой мозг такое бы сам не сгенерировал. Хотя теперь уже да! Вобщем логика на то она и логика, что у всех она может быть разной, но вполне логичной. Отсюда масса анекдотов про логику. Потому что порой иная логика, что сам анекдот.Хакер писал(а):Объясните мне вашу логику, пожалуйста — это единственная непостижимая для меня вещь.
Dim v as variant
Dim r as SOME_RECORD
v = r
#Compile Exe
#Dim All
Type SOME_RECORD
x As Long
z As Long
End Type
Function PBMain () As Long
Dim v As Variant
Dim r As SOME_RECORD
r.x=1
r.z=2
Let v = r As String
Dim r2 As SOME_RECORD
Let r2 = Variant$(Byte, v)
MsgBox Str$(r2.x)
MsgBox Str$(r2.z)
End Function
Тут все понятно. Идем дальшеХакер писал(а):либо UDT объявлена не в нашем проекте (значит в какой-то чужой неизвестно-какой TLB). И, соответственно, это описание из TLB используется при необходимости запихивания UDT в Variant.
Тут тоже все ясно, но почемуХакер писал(а):С точки зрения голого типа COM, чтобы засунуть UDT в Variant, нужно чтобы кто-нибудь (не особо важно кто) реализовывал IRecordInfo для данного типа. Единственная причина того, что IRecordInfo существует — это для того, чтобы можно было засовывать UDT в Variant.
Идет просто присвоение, где здесь использование IRecordInfo? Ладно с этим еще можно разобраться, если это не реализуется самим программером, то оно может быть реализовано компилятором непосредственно в коде и скрыто от программиста. Ну раз так все просто, почему бы и не провести эксперимент и закрепить вновь полученное знание на практике.Хакер писал(а):Dim v as variant
Dim r as SOME_RECORD
v = r
Option Explicit
'Private v As Variant
'Private r As WIN32_FIND_DATA
Public v As Variant
Public r As WIN32_FIND_DATA
Sub main()
Test
End Sub
Sub Test()
' Dim v As Variant
' Dim r As WIN32_FIND_DATA
v = r
End Sub
jangle писал(а):Only user-defined types defined in public object modules can be coerced to or from a variant or passed to late-bound functions
Я тоже теперь уже не понимаю, ибо на практике получается облом. Как еще обявлять то? Выходит со вторым способом облом, остается только первый.Хакер писал(а):Это говорит только о том, что ты имел храбрость объявить тип SOME_RECORD, но объявил его неправильно. Сам-себе-злобный-буратино.jangle, nы троллишь, или ты действительно испытываешь проблемы с пониманием и не понимаешь всего того, что написано выше, а именно того, где и как надо объявить UDT, чтобы ошибки, которую ты привёл, не было?
Посмотрел код, собственно основная функция там UDT_Get_Info, которая просто извлекает информация из варианта, что касается упаковки UDT в вариант и обратно, то там это собственно и не реализовано, точнее оно реализовано именно через первый способ, который описал Хакер, там идет обычное присвоение v = udt. Поэтому нужна либо ActiveX.Dll, либо ActiveX.EXE. Кроме основной функции идут вспомогательные для реализации вызова ф-ций по указателю с любым количеством аргументов. Поэтому этот код, а точнее его идею, можно использовать совместно с волшебшными указателями Хакера и написать пару своих ф-ций для упаковки распаковки, что бы работали в обычном модуле и стандартном приложении. Там собственно большая часть кода относится к реализации вызова по указателю нежели к самой работе с интерфейсом IRecordInfo.jangle писал(а):Нашел исходник для упаковки UDT в вариант и обратно. UDT должно быть в ActiveX Dll, отстой короче
ger_kar писал(а):Идет просто присвоение, где здесь использование IRecordInfo?
ger_kar писал(а):Вобщем объявлял по разному как видно из кода, но в любом случае получается, как писал
jangle писал(а):Нашел исходник для упаковки UDT в вариант и обратно. UDT должно быть в ActiveX Dll, отстой короче
foo = {'field_a' : 123, 'field_b' : 'hello!', 'field_c' : some_var};
$foo = array('aaa' => 123, 'bbb' => 'hello!', 'ccc' => $some_var);
zoo = CreateNewUDT("Type ABSOLUTELY_NEW_UDT: a as long: b as integer: c as double: End Type", 44, 55, 66)
MsgBox TypeName(zoo) ' Даст ABSOLUTELY_NEW_UDT
Msgbox TypeName(zoo.a) ' Даст Long
MsgBox TypeName(zoo.b) ' Даст Integer
MsgBox TypeName(zoo.c) ' Даст Double
MsgBox zoo.a ' Даст 44
MsgBox zoo.b ' Даст 55
MsgBox zoo.c ' Даст 66
zoo.c = (zoo.a + zoo.b) / 2 ' поле «с» станет равно значению 49.5
Мы не трудные, мы обыкновенные и откуда нам обыкновенным это было знать? Имеется ввиду информация по UDT и Variant. В Толстенной книженции по VB, которую я прочитал, а равно как и в других ничего подобного нет даже в помине. Ты телепат, мы нет! И та информацию которую я читал по COM, тоже ничего подобного не содержала. Что касается использования IRecordInfo в фоне, то тут худо-бедно, но на меня снизошло озарение, ибо я писал следующее: "Ладно с этим еще можно разобраться, если это не реализуется самим программером, то оно может быть реализовано компилятором непосредственно в коде и скрыто от программиста." Вот собственно, как раз про фон.Хакер писал(а):В фоне, блин, в фоне! Вы издеваетесь или оба такие трудные?
Тут уж извините, не догадался, ибо ТЛБ шка в остальных случаях вполне себе хорошо работает.Хакер писал(а):Это ты заюзал кривую TLB.
Коды всякие нужны! Коды всякие важны!Хакер писал(а):Ох как же ты любишь находить чужой фекальный код и копаться с ним. Желаю PSC чтобы на их серверы упал метеорит и уничтожил к чёрту все эти шизофреничные исходники, обладающие такой степенью извращённости, что впору давать антипримию.
А еще и для просто обыкновенных и даже для тех кто на бронепоездеХакер писал(а):Ещё раз, для трудных.
А вот это Совсем нехорошо. Просто очень нехорошо. Но очень хорошо, что ты об этом предупредил. Мы не телепаты, сами бы фиг догадались! Исходя из написанного, лучше сделать свою обработку UDT<->Variant используя IRecordInfo, если уж сильно понадобится. Ну или как вариант заюзать ActiveX.exe, это все лучше чем таскание с библиотекой.Хакер писал(а):Подчёркиваю: что эти три случая — те редкие случаи, когда проект, использующий TLB, становится зависимым от TLB, и TLB нужна после компиляции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 38