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

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

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

Сообщение Хакер » 11.05.2012 (Пт) 17:04

ger_kar писал(а):А в варианте Standart EXE + TLB возможна упаковка TLB в файл ресурсов и если да, то как это все можно проделать.

Положить в ресурсы.
При запуске Standard EXE должен определять, зарегистрирована ли уже хранимая внутри него библиотека типов, и если нет, регистрировать её до того, как она понадобится для запаковывания UDT в Variant.
—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 » 11.05.2012 (Пт) 17:19

Хакер писал(а):При запуске Standard EXE должен определять, зарегистрирована ли уже хранимая внутри него библиотека типов, и если нет, регистрировать её
И как это правильно делается? Посредством RegisterTypeLib?
Тогда что передавать этой функции первым и вторым параметром, если она находится в ресурсах? Особенно второй параметр, в нем что нужно указать путь к исполняемому файлу? Может я и глупости спрашиваю, но я чет сам никак не догоню, как это правильно делается.
Бороться и искать, найти и перепрятать

migor69
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 05.06.2012 (Вт) 6:36

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

Сообщение migor69 » 05.06.2012 (Вт) 7:31

Что то я не понял эту кашу...а чем плохо вот это?..Только если это ДЛЛ, то такой же тип должен быть объявлен и в вызывающей эту функцию программе
В ВАСИКЕ всё просто

Код: Выделить всё
Public Type Point2d
x As Single
y As Single
End Type

' 3D Point
Public Type Point3d
x As Single
y As Single
Z As Single
End Type

Public function Set2D(dd as Point2d) as Point2d
---------------
Set2d.x=dd.x
Set2d.y=dd.y
end function

Public function Set3D(dd as Point3d)as Point3d
---------------
Set3d.x=dd.x
Set3d.y=dd.y
Set3d.z=dd.z
end function


[Хакер]:: За неиспользование тега [code] с следующий раз будешь наказан.

С.Т.
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 10.03.2010 (Ср) 19:49

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

Сообщение С.Т. » 17.04.2023 (Пн) 16:44

С удовольствием прочитал всю тему, заполнив много пробелов. Опробовал коды по внедрению UDT в Variant. В общем-то, в таком виде они не шибко применимы, ибо при написании кода программы, когда ставишь точку после имени варианта, содержащего UDT, списка его переменных не выплывает, ориентироваться всё равно приходится вручную, а в сложных структурах всего не упомнишь. Вот если бы можно было сделать нечто вроде
Код: Выделить всё
Dim UDT1 as MyType, UDT2 as MyType
Set UDT1 = UDT2
(по аналогии с экземплярами класса, вместо Set конечно другое слово, но принцип тот же), чтобы не копировать все данные UDT, а только направить на них из одного типа в другой того же типа, сохраняя структуру и удобство в IDE, вот это было бы мощно! Тогда можно будет в сложной структуре массивов UDT с множеством вложений сделать указатель на фрагмент структуры, как в With (но в блоке With мы имеем доступ только к одному фрагменту одной структуры, а если нужно производить сравнение с другим фрагментом или другой структурой тоже множественной вложенности, приходится при каждом упоминании второй структуры писать её с самого начала со всеми индексами, например: Карта.Разворот(№разв).Страница(№стр).Строка(№строки).Такт(№такта). Аккорд(№аккорда).Нота(№ноты).Высота = <то же самое......> + 1
Ужас ведь! Даже в строку не влезло. А это одна переменная! Приходится её копировать простып присвоением во временную вроде <Нота.Высота>, но тогда она будет доступна только для чтения, т.к. код <<Нота.Высота = Нота.Высота + 1>> не поменяет реальной высоты в Карте, а только внутри этой временной переменной.

Знаю, что можно для этого передать UDT в другую функцию как ByRef аргумент того же типа (но тогда им пользоваться можно только внутри функции, а иногда очень удобно объявить такую переменную-указатель ГЛОБАЛЬНОЙ, тогда трюк с ByRef не прокатывает).

Кстати, множеством проб нашёл, что передавать UDT в другую функцию в виде аргумента как неявный указатель можно и в Standard EXE даже внутри простой Form1.frm, просто объявив функцию-приёмник как Friend Sub (UDT as MyType). Не Public и не Private, а именно Friend. Тогда ошибка "Only public user types ...." и дальше на три строки - не появляется. Меняешь поля UDT напрямую - меняются и по указателю, всё нормально. Без GetMem-PutMem, без TLB, без ActiveX.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

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

Сообщение The trick » 17.04.2023 (Пн) 23:41

С.Т. писал(а):Кстати, множеством проб нашёл, что передавать UDT в другую функцию в виде аргумента как неявный указатель можно и в Standard EXE даже внутри простой Form1.frm, просто объявив функцию-приёмник как Friend Sub (UDT as MyType). Не Public и не Private, а именно Friend. Тогда ошибка "Only public user types ...." и дальше на три строки - не появляется. Меняешь поля UDT напрямую - меняются и по указателю, всё нормально. Без GetMem-PutMem, без TLB, без ActiveX.

Friend методы не видны извне проекта, поэтому для них не нужно использовать маршалинг.

Я кстати недавно делал такие Variant'ы с динамическими полями https://www.vbforums.com/showthread.php ... e-Advanced .
UA6527P

Пред.

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

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

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

    TopList  
cron