Вопрос по Пользовательскому типу данных (VB6)

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 28.04.2012 (Сб) 21:38

Хакер писал(а):Мне кажется я выложил 3 примера, и TLB фигурирует только в одном...

Ну так я как раз про StandartEXE. В нём-то нельзя, получается.

Хакер писал(а):Остальное — уже пошёл оффтопик.

Удобно :(

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение Хакер » 28.04.2012 (Сб) 21:47

Qwertiy писал(а):Ну так я как раз про StandartEXE. В нём-то нельзя, получается.

В Standard EXE нет публичных сущностей (классов, структур) и нет TLB. Он именно стандартный в том плане, что мало чем отличается от EXE, сделанного например при помощи чистого Си.

По вашему нужно было сделать так, чтобы в Standard EXE могли бы быть публичные сущности и была бы хранимая в ресурсах TLB? И чтобы тогда было два типа проекта (Standard EXE и ActiveX EXE), абсолютно ни чем друг-от-друга не отличающихся?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение Хакер » 28.04.2012 (Сб) 21:48

Qwertiy писал(а):Удобно :(

Я привёл невозможность объявить одну функцию внутри другой как пример одной из тысячи вещей, которые сделать нельзя. Я могу часами говорить о разных языках и парадигмах, но, пожалуйста... ты из моего жалкого примера хочешь развить целую подветвь дискуссии с обсуждением других языков и лямда-функций. Не надо этого делать.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение arthur2 » 28.04.2012 (Сб) 21:52

Хакер писал(а):нельзя, чтобы UDT, который покидает границы нашего приложения, был объявлен как приватный.
Понятно :) Ну а как же твоя предполагаемая CreateNewUDT, которая будет делать udt на лету, не то что приватно, вообще нигде не объявленную? это не будет нарушать данный принцип?

ger_kar писал(а):Это что объявленная внутри будет локальной процедурой, которую можно вызвать только из родительской процедуры?
Ага. В джаваскрипте, кажется. Хотя уже много лет не пользовался, может и путаю.
Артур
 
   

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 28.04.2012 (Сб) 21:58

Хакер писал(а):По вашему нужно было сделать так, чтобы в Standard EXE могли бы быть публичные сущности и была бы хранимая в ресурсах TLB? И чтобы тогда было два типа проекта (Standard EXE и ActiveX EXE), абсолютно ни чем друг-от-друга не отличающихся?

Кажется, идею понял.
Я не настолько хорошо разбираюсь в VB6 и COM...

Хакер писал(а):Я привёл невозможность объявить одну функцию внутри другой как пример одной из тысячи вещей, которые сделать нельзя.

Несовсем так. Ты написал, что в языках того же уровня, что VB6 этого сделать нельзя. Я привёл конкретный пример, как это обойти в Си.

Хакер писал(а):ты из моего жалкого примера хочешь развить целую подветвь дискуссии с обсуждением других языков и лямда-функций. Не надо этого делать.

Ok.

Я так и не понял, что там про переменные между функциями...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение Хакер » 28.04.2012 (Сб) 22:04

arthur2 писал(а):Понятно :) Ну а как же твоя предполагаемая CreateNewUDT, которая будет делать udt на лету, не то что приватно, вообще нигде не объявленную? это не будет нарушать данный принцип?

Это чёрная магия в привычном для меня стиле.
Microsoft говорит, что программист не должен реализовывать IRecordInfo сам, а должен использовать встроенную (в COM) реализацию, которая берёт данные из TLB.

Иными словами, взяли ITypeInfo для UDT и попросили у COM на основе этого сгенерировать реализацию IRecordInfo. Конечно, новая уникальная реализация не генерируется, просто имеющаяся универсальная реализация обращается к ITypeInfo для получения данных о структуре структуры.

Microsoft пишет, что программисту никогда не потребуется самому реализовывать IRecordInfo, потому что можно делать так, как написано выше.

С другой стороны, Microsoft прямо не запрещает самому реализовывать IRecordInfo, и, более того, это неотъемлемая природа интерфейсов — вызывающая и вызываемая сторона абсолютно ничего не знают друг о друге и не должны полагаться на какие-то аспекты функционирования друг-друга, окромя тех, что прямо предписываются самим COM-интерфейсом.

Но конечно это будет уже урезанный функционал. Например IRecordInfo задуман так, что если у вас есть IRecordInfo для некоей UDT, то через IRecordInfo можно выйти на ITypeInfo этого типа, и на ITypeLib той TLB-шки, в которой этот тип (UDT) объявлен. Естественно, что в моём варианте с CreateDynamicUdt если кто-то получит Variant-значение, хранящее структуры, извлечёт из этого Variant-значения ссылку на IRecordInfo, а у IRecordInfo попросит вернуть ему ссылку на TLB-шку, в которой описан хранимый в варианте UDT, то будет облом, потому что такой TLB-шки вообще не существует во вселенной.

Хорошо что хотя бы IRecordInfo::GetTypeInfo позволяет вежливо донести до вызывающей стороны, что до TLB ей (вызывающей стороне) достучаться не суждено, возвращая ей (вызывающей стороне) ошибку TYPE_E_INVALIDSTATE.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение arthur2 » 29.04.2012 (Вс) 6:54

Насколько я понимаю, тип вариант - это ведь не чисто бейсиковская фича, а комовская? А комовские возможности варианта шире, чем в бейсике, и ли те же?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение Хакер » 29.04.2012 (Вс) 17:06

arthur2 писал(а):Насколько я понимаю, тип вариант - это ведь не чисто бейсиковская фича, а комовская?

Вот именно! Variant — COM-овская фича, и VB вынужден играть по правилам COM-а. А правила COM-а такие: в Variant можно поместить рекорд (UDT), но рекорд должен быть описан в TLB.

arthur2 писал(а):А комовские возможности варианта шире, чем в бейсике, и ли те же?

По спецификации (то есть только на бумаге) — шире.
На практике (ибо реализовано не всё из спецификации) — чуть шире, засчёт поддержки таких типов UI2, UI4, UI8, I8.
Но эти типы не входят в установленный Microsoft'ом список «OLE Automation»-типов. Поэтому в VB они не поддерживаются не просто так, не из-за чьей-то лени или нежелания делать их поддержку, а чтобы не создавать проблем.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение arthur2 » 29.04.2012 (Вс) 17:24

Возник ещё такой вопрос.
Хакер писал(а):нельзя, чтобы UDT, который покидает границы нашего приложения, был объявлен как приватный.
В вариант вполне помещается приватный класс. То есть, класс, объявленный как приватный, может покидать границы нашего приложения. Почему же тогда такая дискриминация для структур?

И как именно структура помещается в вариант? видимо, как указатель? на что именно - на какой-то интерфейс (IRecordInfo)?
Артур
 
   

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение burik » 29.04.2012 (Вс) 18:28

В вариант вполне помещается приватный класс. То есть, класс, объявленный как приватный, может покидать границы нашего приложения. Почему же тогда такая дискриминация для структур?

По-моему, различия между классами и структурами уже описывались тут.
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение Хакер » 29.04.2012 (Вс) 18:43

arthur2 писал(а):В вариант вполне помещается приватный класс. То есть, класс, объявленный как приватный, может покидать границы нашего приложения. Почему же тогда такая дискриминация для структур?

Не могу терпеть, когда говорят «класс», а имеют в виду объект (то есть экземпляр класса).
В вариант помещается не класс. И в вариант помещается даже не экземпляр класса.
В вариант помещается ссылка на интерфейс IUnknown (или на интерфейс IDispatch, но разницы никакой) какого-то объекта (возможно — экземпляра класса, а возможно — единственного объекта в своём роде, для которого даже и класса не существует).

Есть колоссальная разница между структурой и ссылкой на объект.
Ссылка на IUnknown — это просто 4-байтный указатель. Именно 4 байтный указатель и хранится в варианте.
Структура — это структура, совокупность байтов заведомо неизвестной (отдельно взятому пользователю вариант-переменной) длины, с неизвестными полями, с неизвестными правилам копирования.

Когда есть
Код: Выделить всё
Dim a as Variant, b as Variant
a = b

и b содержит ссылку на IUnknown, единственное, что сделается при копировании ссылки: скопируется 4-байтный указатель и вызовется IUnknown::AddRef (ибо была одна ссылка, а стало две).

Когда есть
Код: Выделить всё
Dim a As Variant, b As Variant
a = b

и b содержит UDT-шку, то должно произойти копирование структур. И чтобы скопировать структуру, нужно знать кучу вещей: какой у UDT-шки размер в байтах, сколько у неё полей, какие у неё поля, и правило клонирования значения для каждого отдельного взятого поля этой структуры. То есть нужно нечто, по функциональности аналогичное тому, что в С++ называется конструктором копирования (или конструктором клонирования).

Так что, как я уже сказал, разница колоссально.
Чтобы скопировать Variant-значения подтипа VT_UNKNOWN (которое является ссылкой на объект), об объекте не нужно знать абсолютно ничего.
Чтобы скопировать Variant-значение подтипа VT_USERDEFINED (которое является хранимой UDT-шкой), об UDT нужно знать абсолютно всё.

Объекты всегда адресуются по ссылке, и всегда происходит манипуляция ссылками (указателями), которая предельно проста.
Структуры никогда не адресуются указателями (кроме случаев с ByRef-параметрами функций), и всегда происходит манипуляция непосредственно самими структурами, которая требует знания правил инициализации нового значения обрабатываемого пользовательского типа, правил уничтожения старого значения обрабатываемого пользовательского типа, правил создании копии значения обрабатываемого пользовательского типа.

___________


arthur2 писал(а):Почему же тогда такая дискриминация для структур?

Как видишь, это не дискриминация, а естественная необходимость, проистекающая из концептуального различия между COM-объектами и плоскими структурами.

________________

arthur2 писал(а):И как именно структура помещается в вариант? видимо, как указатель? на что именно - на какой-то интерфейс (IRecordInfo)?

Неужели так трудно посмотреть в MSDN?
Variant, который внешне выгдялит как вариант, хранящий UDT, изнутри выглядит так.
Первое поле VARIANT-структуры содержит идентификатор субтипа VT_USERDEFINED.
Второе поле VARIANT-структуры содержит указатель на сам хранимый UDT, то есть на блок байтов, являющихся полями UDT (подразумевается экземпляр)
Третье поле VARIANT-структуры содержит ссылку на интерфейс IRecordInfo, ответственный за UDT (подразумевается сам тип)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение arthur2 » 29.04.2012 (Вс) 18:59

Хакер писал(а):Первое поле VARIANT-структуры содержит идентификатор субтипа VT_USERDEFINED.
Второе поле VARIANT-структуры содержит указатель на сам хранимый UDT, то есть на блок байтов, являющихся полями UDT (подразумевается экземпляр)
Третье поле VARIANT-структуры содержит ссылку на интерфейс IRecordInfo, ответственный за UDT (подразумевается сам тип)
хм... прикольно :) А если я сам заполню все эти поля и сам реализую IRecordInfo, получается, смогу впихивать в вариант любой пользовательский тип? или я чего-то недопонял?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение Хакер » 29.04.2012 (Вс) 19:11

arthur2 писал(а):хм... прикольно :) А если я сам заполню все эти поля и сам реализую IRecordInfo, получается, смогу впихивать в вариант любой пользовательский тип? или я чего-то недопонял?

Именно так. IRecordInfo может вешать любую лапшу, придумывая формат (в смысле количества и типа полей) UDT-шки на ходу. На этом и основывалась идея о CreateDynamicUdt.

Собственно, можно все мои три примера, которые все требует регистрацию TLB (так или иначе), модифицировать так, чтобы хост перехватывал GetRecordInfoFromGuids, и подсовывал свою реализацию IRecordInfo для заведомо известных UUID-ов нужных типов. TLB тогда станет не нужна, но это будет хак, и могут быть последствия. Я предполагаю теоретическую возможность появления таких последствий: вариант с UDT не сможет отмаршаллиться в апартамент чужого процесса того же самого компьютера (как максимум), или в удалённый апартамент (как минимум).

Я думаю, что маршаллинг Variant-а устроен по умному, и ссылка на IRecordInfo не маршаллится как обычная ссылка, а «перезапрашивается» на удалённой стороне на основе UUID-а типа.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение arthur2 » 29.04.2012 (Вс) 19:22

Собственно, если наружу такую переменную передавать не предполагается, то можно об этом вообще не заморачиваться?

Я так понимаю, что когда в коде идет обращение к полю структуры внутри варианта, бейсик сначала смотрит, VT_USERDEFINED ли это, а затем по названию структуры вызывает соответствующий метод у IRecordInfo? то есть, я сам могу сообщить бейсику, что за тип у этого поля? Всё правильно?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение Хакер » 29.04.2012 (Вс) 19:28

arthur2 писал(а):а затем по названию структуры вызывает соответствующий метод у IRecordInfo?

Почему по названию структуры?

Код: Выделить всё
Dim v as Variant
v.foo = 2

VB смотрит, что содержит v. Если это не VT_DISPATCH или VT_USERDEFINED, генерируется ошибка «Object required».
Если это VT_DISPATCH, то используется IDispatch::Invoke, чтобы выполнить присвоение свойству foo значения 2.
Если это VT_USERDEFINED, то используется IRecordInfo::PutField, чтобы присвоить полю foo значение 2.

Так делает VB, VBA, VBScript, JavaScript в рамках Script-контрола, и т.д.

_____

Кстати, рекомендую ещё прочитать вот это, чтобы проникнуться идеей о хитрости VB.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение arthur2 » 29.04.2012 (Вс) 19:34

Хакер писал(а):Почему по названию структуры?
б-р-р... по названию поля, хотел сказать :oops: В общем, кажется, понятно, как будет работать CreateDynamicUdt :)
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение Хакер » 29.04.2012 (Вс) 19:37

arthur2 писал(а):В общем, кажется, понятно, как будет работать CreateDynamicUdt :)

Да. Вся прелесть в том, что при этом в памяти будет реальная структура, которую можно передать куда-нибудь в сишныю библиотеку. А сама структурка может управляться из без-типового VBScript-а.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение arthur2 » 29.04.2012 (Вс) 19:39

Хакер писал(а):Кстати, рекомендую ещё прочитать вот это, чтобы проникнуться идеей о хитрости VB.
О!!! Как раз только-только собирался спросить, как работает тёмичевский же кирпич
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение Хакер » 29.04.2012 (Вс) 19:42

Опять оффтопик.
Он использует Variant-тип с субтипом VT_BYREF. Переменная притворяется ByRef-аргументом функции, хотя она при этом ею не является.
То же, что и это, только более приятно синтаксически, но с учётом медленности варианта-а.
Я не использую тёмычевские прозрачные указатели, мне нравится больше мой быстрый вариант: вместо замаппливания Variant-переменной на нужный мне адрес, я замаппливаю SafeArray-массив на нужный мне адрес. Имею при этом быстроту обычных указателей и возможность написать pointer(10), подобному тому, как я могу в сях написать pointer[10] как аналог *(pointer + 10)

Пример можно посмотреть в любом из моих последних кирпичей. Смотреть функции SaMap/SaUnmap например здесь. Возможность использовать UDT в качестве типа указателя — прилагается, и не требует объявления UDT в TLB в отличие от того же тёмычевского варианта.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение arthur2 » 29.04.2012 (Вс) 19:56

Во чё нашел :) Читаю... http://www.rsdn.ru/article/com/varsafearr.xml
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение arthur2 » 30.04.2012 (Пн) 20:46

Хакер писал(а):Смотреть функции SaMap/SaUnmap
Кстати, здоровский способ! Почему бы тебе не добавить его в свой топик об указателях?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение Хакер » 30.04.2012 (Пн) 20:48

Потому что я хочу сделать классный кирпич, в котором вместо SaMap — какая-нибудь функция с другим более понятным называнием, а вызывать SaUnmap (про вызов которого если забыть — будт утечка памяти) будет вообще не нужно, потому что SaUnmap будет вызываться автоматически при выходе из процедуры, и в котором не нужно будет вызывать AryPtr.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение arthur2 » 30.04.2012 (Пн) 21:34

Кстати, а чем отличается статический массив от динамического? Я имею ввиду изнутри - SAFEARRAY. Это я к тому. что где тебе нужен указатель на одну структуру, ты объявляешь статические массивы из одного члена, а где нужно двигать указатель, объявляешь его как динамический массив и редимишь.
Артур
 
   

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение ger_kar » 30.04.2012 (Пн) 21:53

Хакер писал(а):и в котором не нужно будет вызывать AryPtr.
Можно применить Not(Not(pArray)), это имелось ввиду? Вроде бы баг, но какой замечательный, раньше тоже приходилось по всякому извращаться, пока здесь на форуме про эту фишку не прочитал :)
arthur2 писал(а):Кстати, а чем отличается статический массив от динамического? Я имею ввиду изнутри - SAFEARRAY.
Да собственно ничем не отличается. Разница только в том, что для статического массива память распределяется сразу, массив находится на одном месте SAFEARRAY сразу указывает на это место, а переменная массива сразу содержит указатель на SAFEARRAY.
Бороться и искать, найти и перепрятать

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение Хакер » 30.04.2012 (Пн) 21:58

ger_kar писал(а):Можно применить Not(Not(pArray)), это имелось ввиду?

Ни в коем случае не это. Просто сделать свойство
MapArray(тут_указывается_массив) = тут_указывается_адрес
То есть такое же модулярное свойство, каким является свойство FuncPtr в кирпиче MagicFuncPointer.

ger_kar писал(а):Разница только в том,

Нет, разница в другом, касательно того аспекта, какой подметил Артур.


Вы осознаёте, что это оффтопик и никак не относится к теме.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение ger_kar » 30.04.2012 (Пн) 22:15

Да занесло как всегда в оффтоп :)
Может с этого viewtopic.php?f=1&t=43928&p=6762834#p6762790 стоит перенести в другую тему, этот мой пост снести и все дальше пойдет правильно.
Бороться и искать, найти и перепрятать

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение arthur2 » 30.04.2012 (Пн) 23:54

Хакер писал(а):Вы осознаёте, что это оффтопик и никак не относится к теме

ну так давай перенесем куда-нибудь :)

Кстати, к теме это тоже вполне может иметь отношение:
CyberPunk писал(а):1.Как передать эти типы в одну переменную.
2. Как определить, какого типа переменная пришла на вход функции.
В функцию можно передавать указатель на структуру (можно byref as any - с помощью твоего кирпича и переопределения функции через declare). Вторым параметром - идентификатор того, какая именно структура передана. А внутри функции можно работать со структурой как раз через указателемассив.
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение Хакер » 01.05.2012 (Вт) 0:29

Без особых оговорок это просто плохой дизайн.
Если нужно передавать в одну функции нечто очень разное, и чтобы функция с этим что-то дело, то значит у разных сущностей всё равно есть что-то одинаковое. Значит надо использовать ООП-подход, несколько разных классов для разных сущностей, но чтобы все классы поддерживали один и тот же интерфейс. Интерфейс бы объединял те общие моменты, присущие разным сущностям, которые позволяют разным сущностям обрабатываться одной и той же функции. Или интерфейс возможно непосредственно отождествлял бы саму одинаковую задачу, производимую над принципиально разными сущностями.

Или, ладно, к чёрту ООП. Если это разные структуры, они могли бы включать в себя идентичную подструктуру, и аргумент функции должен бы был объявяться с типом этой самой подструктуры.

Я не думаю, что какие-либо из моих кирпичей или трюков тут нужны. Тут не тот случай. Нужна простая правильная архитектура.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение arthur2 » 01.05.2012 (Вт) 0:50

Хакер писал(а):Я не думаю, что какие-либо из моих кирпичей или трюков тут нужны.

Мне просто нравится пользоваться кирпичом с функциями-указателями как способом переопределить некую функцию. Например, всегда жалел, что в обычной процедуре нельзя объявить параметр as any. А теперь - можно :) Что, собственно, позволяет "разным сущностям обрабатываться в одной и той же функции"

Хакер писал(а):Если это разные структуры, они могли бы включать в себя идентичную подструктуру, и аргумент функции должен бы был объявяться с типом этой самой подструктуры.
А если, это разные, но конкретные структуры и вносить в них дополнительные поля просто нельзя?

Хакер писал(а):Нет, разница в другом, касательно того аспекта, какой подметил Артур.
Офтоп-неофтоп, но всё-таки интересно...
Артур
 
   

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Вопрос по Пользовательскому типу данных (VB6)

Сообщение ger_kar » 11.05.2012 (Пт) 15:52

А в варианте Standart EXE + TLB возможна упаковка TLB в файл ресурсов и если да, то как это все можно проделать. Саму TLB конечно засунуть в ресурсы можно как простой бинарный файл, но вот что делать с ним потом? Или такой вариант вообще не прокатит?
Бороться и искать, найти и перепрятать

Пред.След.

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

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

Сейчас этот форум просматривают: SemrushBot и гости: 28

    TopList