С удовольствием прочитал всю тему, заполнив много пробелов. Опробовал коды по внедрению 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.