powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как в поле Tag разместить структуру
25 сообщений из 26, страница 1 из 2
Как в поле Tag разместить структуру
    #37862274
Cyrax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как в поле типа Variant поместить структуру ?

Работаю на VBA с TreeView. У всех узлов есть свойство .Tag типа Variant:

Код: vbnet
1.
Property Tag As Variant



В коде описал структуру:

Код: vbnet
1.
2.
3.
4.
5.
Type NodeInfo
    name As String
    unitCount As Long
    liquidated As Boolean
End Type



Как мне эту структуру поместить в Tag ?

----------------
Вообще, возможны 3 варианта:
1. Использование класса: на лету создаём экзепляр класса и закидываем ссылку на него в поле Tag. Но в этом случае придётся всё время следить за удалением узлов (при удалении любого узла придётся вручную освобождать память)
2. Использовать строку, в которой хранить параметры в строковом виде (с использованием какого-нибудь разделителя). Но в этом случае процесс обработки узлов заметно "потяжелеет" из-за постоянного парсинга строк.
3. Использовать статическую структуру.
...
Рейтинг: 0 / 0
Как в поле Tag разместить структуру
    #37862317
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. Не придется. Динамический объект типа экземпляра класса существует, пока ссылка на него хранится в какой-либо переменной. Если переменной присвоить другое значение, объект уничтожается.
...
Рейтинг: 0 / 0
Как в поле Tag разместить структуру
    #37862350
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Храните в таге только айди а параллельно где-то в памяти - коллекцию, рекордсет, в общем нечто, позволяющее по айди мгновенно вытаскивать все атрибуты объекта. Судя по вашей статистике VBA означает MS Access, стало быть рекордсет у вас где-то обязан быть.
...
Рейтинг: 0 / 0
Как в поле Tag разместить структуру
    #37862521
Cyrax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор1. Не придется. Динамический объект типа экземпляра класса существует, пока ссылка на него хранится в какой-либо переменной. Если переменной присвоить другое значение, объект уничтожается.
Т.е. при выполнении, скажем, команды TreeView.Clear либо Node.Remove экземпляр класса, ссылка на который хранится в поле Tag, будет деструктурирован ? У меня Access 2003 и VB 6.3.
Работал на C++ - приходилось следить за освобождением памяти самому...

авторСудя по вашей статистике VBA означает MS Access, стало быть рекордсет у вас где-то обязан быть.
recordset у меня создаётся статически в процедуре построения дерева (существует только в этой процедуре). Только при чём здесь он ?

авторХраните в таге только айди а параллельно где-то в памяти - коллекцию, рекордсет, в общем нечто, позволяющее по айди мгновенно вытаскивать все атрибуты объекта.
Да, можно создать глобальную коллекцию структур. Но здесь есть 2 минуса:
1. Придётся эту коллекцию дополнительно обрабатывать параллельно с перестройкой дерева, удалением узлов. В случае, когда данные (либо ссылка на объект с данными) хранятся непосредственно в поле Tag, при удалении узла данные (объект с данными) удаляются автоматически.
2. Для каждого нового узла придётся генерировать уникальный для коллекции идентификатор.
С другой стороны, в качестве такого ключа можно взять ключ узла. Тогда и в поле Tag необходимость вообще отпадает.
...
Рейтинг: 0 / 0
Как в поле Tag разместить структуру
    #37862575
Fantomny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax,
У всех узлов есть свойство .Tag типа Variant:
Вроде Tag он int, а не как не вариант
Так что храним структуру отдельно, а на нее только ссылаемся в таге.
...
Рейтинг: 0 / 0
Как в поле Tag разместить структуру
    #37862597
Cyrax1. Использование класса: на лету создаём экзепляр класса и закидываем ссылку на него в поле Tag. Но в этом случае придётся всё время следить за удалением узлов (при удалении любого узла придётся вручную освобождать память) Откуда такие опасения? Плюсовый бэкграунд? Не бойтесь, попробуйте, минутное ведь дело.
...
Рейтинг: 0 / 0
Как в поле Tag разместить структуру
    #37863071
Cyrax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторВроде Tag он int, а не как не вариант
У меня Variant (Access 2003, VB 6.3).
Вот его объявление:
Код: vbnet
1.
Property Tag As Variant


Посему есть возможность хранить данные непосредственно там.

авторОткуда такие опасения? Плюсовый бэкграунд? Не бойтесь, попробуйте, минутное ведь дело.
Что такое "плюсовый бэкграунд" ?
Так будет экземпляр класса уничтожаться при обнулении счётчика ссылок или нет ?
...
Рейтинг: 0 / 0
Как в поле Tag разместить структуру
    #37863238
CyraxЧто такое "плюсовый бэкграунд" ?Опыт программирования на C++, как на основном средстве разработки.CyraxТак будет экземпляр класса уничтожаться при обнулении счётчика ссылок или нет ?Будет.
...
Рейтинг: 0 / 0
Как в поле Tag разместить структуру
    #37863311
Cyrax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно, структуру сохранить в Tag'е никак не получится ? Без сериализации ?
...
Рейтинг: 0 / 0
Как в поле Tag разместить структуру
    #37863343
Cyrax,

незачем хранить именно структуру.

Но если интересует формальная сторона дела, то, в конечном итоге, можно. Через большие тернии. На vbstreets.ru была тема.
...
Рейтинг: 0 / 0
Как в поле Tag разместить структуру
    #37863527
Cyrax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем, 2 варианта:
1. Создаём глобальную коллекцию структур или объектов, ключ узла используется в качестве ключа этой коллекции.
Поле Tag остаётся свободным (незадействованным).
2. В поле Tag хранится ссылка на объект с данными.

Проблема 1-го варианта : при удалении узла командой Remove все его подузлы удаляются автоматически. В случае с глобальной коллекцией для синхронизации придётся вручную удалять элементы этой коллекции, соответствующие всем подузлам удаляемого узла. Имхо, неприемлемый вариант.

P.S. Во - вспомнил как это называется в .NET: Gabage collector (сборщик мусора):
http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=844017&msg=10526978
авторЕсть у VB6 уборка мусора, есть. Но в VB6 она срабатывает сразу как только объект становится не нужным.
...
Рейтинг: 0 / 0
Как в поле Tag разместить структуру
    #37863616
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Ерунда. Структуры не хранятся в коллекции, а в случае объектов нет нужды в коллекции — достаточно второго способа.

3) Массив структур. В Tag хранится индекс массива.
...
Рейтинг: 0 / 0
Как в поле Tag разместить структуру
    #37863651
Cyrax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор1) Ерунда. Структуры не хранятся в коллекции,
Ну, если в Tag структуру можно запихнуть , то думаю, и в коллекцию проблем не составит.

автора в случае объектов нет нужды в коллекции — достаточно второго способа.
Почему же. В случае с коллекцией объектов можно вообще обойтись без поля Tag (это поле можно будет использовать для семантически иных данных/целей)

автор3) Массив структур. В Tag хранится индекс массива.
Недостатки:
1. Длина массива ограничена размерностью типа Integer. Дерево (БД) может содержать гораздо больше узлов (записей).
2. Удаление элемента из массива очень трудоёмко (перекладывание + ReDim)
...
Рейтинг: 0 / 0
Как в поле Tag разместить структуру
    #37863689
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyraxНу, если в Tag структуру можно запихнуть , то думаю, и в коллекцию проблем не составит.Если практика извращений для вас не составляет проблем, флаг в руки.

CyraxПочему же. В случае с коллекцией объектов можно вообще обойтись без поля Tag (это поле можно будет использовать для семантически иных данных/целей) То есть вы еще даже с целями не определились?

Cyrax1. Длина массива ограничена размерностью типа Integer. Дерево (БД) может содержать гораздо больше узлов (записей).Дерево, содержащее такое количество узлов, само по себе является недостатком. Единственное ему применение — реестр. Но в regedit и узлы подгружаются динамически.
Cyrax2. Удаление элемента из массива очень трудоёмко (перекладывание + ReDim)Зависит от структуры. Если там нет строк нефиксированной длины и массивов, то CopyMemory за раз все сдвинет, а redim необязателен, можно запоминать максимальный индекс и не ходить дальше по массиву.
...
Рейтинг: 0 / 0
Как в поле Tag разместить структуру
    #37863736
структуру нельзя засунуть в Variant

вместо структуры надо использовать класс
те класс модуль а в него запихать переменные
public Name as string
public UnitCount as long
и тд
...
Рейтинг: 0 / 0
Как в поле Tag разместить структуру
    #37864050
Cyrax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторТо есть вы еще даже с целями не определились?Ну зачем же так грубо ? Речь о способах реализации, их плюсах и минусах.
Что касается меня, то с целями и задачами определился. Но при этом не исключаю, что в процессе реализации этих задач может понадобиться хранение семантически отличных от NodeType данных.

авторЗависит от структуры. Если там нет строк нефиксированной длины и массивов, то CopyMemory за раз все сдвинет, а redim необязателен, можно запоминать максимальный индекс и не ходить дальше по массиву.1. У меня как раз и используется строка переменной длины
2. Имхо, использование CopyMemory при работе с массивами - явный признак ошибочного выбора структур данных
3. Даже если элементы массива структур будут иметь фиксированную длину, то логично будет предусмотреть возможность работы с массивом и в том случае, если в структуру будут добавлены строки переменной длины либо ссылки на объекты. Такая необходимость запросто может возникнуть в ходе изменения/расширения требований к проекту.
...
Рейтинг: 0 / 0
Как в поле Tag разместить структуру
    #37864193
надо класс использоватьструктуру нельзя засунуть в VariantМожно.

Cyrax,
чтобы не быть голословным, прикладываю библиотеку типов (исходник .odl и откомпилированную .tlb) с описанием структуры NodeInfo. Библиотеку типов надо зарегистрировать перед использованием (например, утилитой с vbaccelerator; может понадобиться запуск от имени администратора). После регистрации в диалоге References... IDE VB/VBA должна появиться строчка "Variant compatible struct definition for VB(A) requested by Cyrax". Надо поставить на ней галочку (подключить в проект), после чего тип NodeInfo можно совать в Variant, в т. ч. в Collection, в Node.Tag и т. д.
...
Рейтинг: 0 / 0
Как в поле Tag разместить структуру
    #37864274
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так чем вариант с классом не устроил? Так и не попробовали?
На форме TreeView и две кнопки. Выделение и освобождение памяти можно наблюдать в диспетчере задач.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
'Код класса Class1

Dim arr&(1000000) '4 МБ, задайте исходя из возможностей машины

'Код формы

Private Sub CommandButton1_Click() 'добавление узла
With TreeView1
    With .Nodes.Add(Text:="node" & .Nodes.Count + 1)
        Set .Tag = New Class1
    End With
End With
End Sub

Private Sub CommandButton2_Click() 'удаление узла
With TreeView1.Nodes
    If .Count Then .Remove 1 '.Count - последний
End With
End Sub
...
Рейтинг: 0 / 0
Как в поле Tag разместить структуру
    #37864331
Казанский,

+1
...
Рейтинг: 0 / 0
Как в поле Tag разместить структуру
    #37864344
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax2. Имхо, использование CopyMemory при работе с массивами - явный признак ошибочного выбора структур данныхЭто явный признак того, что скорость работы критична.

Cyrax3. Даже если элементы массива структур будут иметь фиксированную длину , то логично будет предусмотреть возможность работы с массивом и в том случае, если в структуру будут добавлены строки переменной длины либо ссылки на объекты. Такая необходимость запросто может возникнуть в ходе изменения/расширения требований к проекту.Это взаимоисключающие параграфы. Либо жестко ограничиваем структуру в целях повышения скорости, либо закладываем хоть песни с плясками на будущее, но работаем штатно, медленно.

А ссылки на объекты это Long, поля постоянной длинны.
...
Рейтинг: 0 / 0
Как в поле Tag разместить структуру
    #37864993
Cyrax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Antonariy]Cyrax2. Имхо, использование CopyMemory при работе с массивами - явный признак ошибочного выбора структур данныхЭто явный признак того, что скорость работы критична.
Как по мне, если критична скорость работы, то целесообразно в данном случае выбрать иные структуры данных, где можно удалять элементы без сдвигов и иных операций, не свойственных массивам. Вы как-то говорили про извращения. Так вот, "запихивание" структур в Variant - это не большее извращение, чем использование CopyMemory при работе с массивами.

авторЭто взаимоисключающие параграфы.
Именно поэтому массивы и не пригодны для таких целей. Одно с другим несовместимо, как Вы сами подметили.

авторЛибо жестко ограничиваем структуру в целях повышения скорости, либо закладываем хоть песни с плясками на будущее, но работаем штатно, медленно.
Выигрышь в скорости будет незначительный, к тому же можно реализовать динамическую подгрузку узлов. А вот проблемы расширяемости, рефакторинга и прочие умные категории всегда будут иметь большое значение в программировании.
...
Рейтинг: 0 / 0
Как в поле Tag разместить структуру
    #37864998
Cyrax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторCyrax,
чтобы не быть голословным, прикладываю библиотеку типов
Да... Лучше, конечно, с объектами. Особенно, когда мусор есть кому выметать.

авторТак чем вариант с классом не устроил? Так и не попробовали?
А я Вам и так верю ))
Остановился на варианте со ссылкой на объект в поле Tag. Имхо, оптимальный вариант.
...
Рейтинг: 0 / 0
Как в поле Tag разместить структуру
    #37865026
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyraxКак по мне, если критична скорость работы, то целесообразно в данном случае выбрать иные структуры данных,Мы вроде негласно договорились называть структурами Public Type. Здесь уместно сказать "хранилища".
Cyrax где можно удалять элементы без сдвигов и иных операций, не свойственных массивам.Это зависит от задачи. Если 99% нагрузки программы на процессор заключается в поиске по индексу, а удаление/добавление происходит эпизодически, то коллекции безнадежно сливают массивам. А если 99% это перетряхивание его содержимого, то... нужно замерять. В реализации быстрых массивов гораздо больше букв, а скорость в 9 случаях из 10 не критична, поэтому коллекции удобнее.
CyraxТак вот, "запихивание" структур в Variant - это не большее извращение, чем использование CopyMemory при работе с массивами.Использование CopyMemory это не извращение, а признак того, что человек наконец-то разобрался, что представляет из себя память компьютера и данные в ней. И от этого получает бонус в виде более шустрых процедур. А "запихивание" структур в Variant это извращение чистой воды. Во-первых, лишняя писанина, во-вторых проигрыш в скорости. Кто-то может объяснить, зачем это надо?
CyraxВыигрышь в скорости будет незначительный, к тому же можно реализовать динамическую подгрузку узлов.Если заменить цикл на CopyMemory, выигрыш в скорости будет потрясающий. Я говорю о том, что видел и делал.
CyraxИменно поэтому массивы и не пригодны для таких целей.Каких целей конкретно? Вы все говорите о каких-то целях, но мне не удается угадать ваше ТЗ.
...
Рейтинг: 0 / 0
Как в поле Tag разместить структуру
    #37865070
Cyrax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторКаких целей конкретно? Вы все говорите о каких-то целях, но мне не удается угадать ваше ТЗ.
Для целей хранения данных непостоянной длины. Например, динамических строк.

авторЕсли заменить цикл на CopyMemory, выигрыш в скорости будет потрясающий. Я говорю о том, что видел и делал.
Какой ещё цикл ? Мы сравниваем скорость работы с массивом структур и с иными "хранилищами" (так уж и быть), позволяющими удалять элементы без несвойственных этим хранилищам операций, т.е. штатными средствами. Например, с коллекцией ссылок на объекты. Вот и сравнивайте, что будет выполняться быстрее - Remove или CopyMemory.

авторЕсли 99% нагрузки программы на процессор заключается в поиске по индексу, а удаление/добавление происходит эпизодически, то коллекции безнадежно сливают массивам.
Слишком много "если". Основная нагрузка на процессор идёт при построении дерева. А там нечего искать по индексу. Обращение к БД, создание узлов. Да и вообще, скорость обработки данных критична прежде всего в системах реального времени.

авторИспользование CopyMemory это не извращение, а признак того, что человек наконец-то разобрался, что представляет из себя память компьютера и данные в ней.
А если не использовать CopyMemory, это значит, что человек лопух ? )))
...
Рейтинг: 0 / 0
Как в поле Tag разместить структуру
    #37865120
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyraxДля целей хранения данных непостоянной длины. Например, динамических строк.Это не цель. Цель это то, что достигается путем хранения динамических строк.
CyraxКакой ещё цикл ? Мы сравниваем скорость работы с массивом структур и с иными "хранилищами" (так уж и быть), позволяющими удалять элементы без несвойственных этим хранилищам операций, т.е. штатными средствами.Попробуйте удалить 100 элементов без цикла.
Удаление одного элемента из коллекции будет быстрее, чем сдвиг массива через CopyMemory. И то не факт. Удаление ста элементов — медленнее.
Если не будет очень лень, напишу таки тест.
CyraxСлишком много "если". А вы как думали? Лишь скурпулезный учет всех условий, в которых придется работать коду, даст наиболее производительный алгоритм.
CyraxОсновная нагрузка на процессор идёт при построении дерева.Я рассматривал массивы и коллекции в отрыве от всяких деревьев. Конечно, в таких условиях дерево является главным тормозом, и тут разница в скорости работы массивов и коллекций уходит на десятый план.
CyraxДа и вообще, скорость обработки данных критична прежде всего в системах реального времени.Расскажите это хардкорным геймерам и тем, кто часто кодирует видео.
авторА если не использовать CopyMemory, это значит, что человек лопух ? )))Это значит, что у него еще все впереди.
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как в поле Tag разместить структуру
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]