|
Как в поле Tag разместить структуру
|
|||
---|---|---|---|
#18+
Как в поле типа Variant поместить структуру ? Работаю на VBA с TreeView. У всех узлов есть свойство .Tag типа Variant: Код: vbnet 1.
В коде описал структуру: Код: vbnet 1. 2. 3. 4. 5.
Как мне эту структуру поместить в Tag ? ---------------- Вообще, возможны 3 варианта: 1. Использование класса: на лету создаём экзепляр класса и закидываем ссылку на него в поле Tag. Но в этом случае придётся всё время следить за удалением узлов (при удалении любого узла придётся вручную освобождать память) 2. Использовать строку, в которой хранить параметры в строковом виде (с использованием какого-нибудь разделителя). Но в этом случае процесс обработки узлов заметно "потяжелеет" из-за постоянного парсинга строк. 3. Использовать статическую структуру. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2012, 00:26 |
|
Как в поле Tag разместить структуру
|
|||
---|---|---|---|
#18+
1. Не придется. Динамический объект типа экземпляра класса существует, пока ссылка на него хранится в какой-либо переменной. Если переменной присвоить другое значение, объект уничтожается. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2012, 03:34 |
|
Как в поле Tag разместить структуру
|
|||
---|---|---|---|
#18+
Храните в таге только айди а параллельно где-то в памяти - коллекцию, рекордсет, в общем нечто, позволяющее по айди мгновенно вытаскивать все атрибуты объекта. Судя по вашей статистике VBA означает MS Access, стало быть рекордсет у вас где-то обязан быть. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2012, 08:05 |
|
Как в поле Tag разместить структуру
|
|||
---|---|---|---|
#18+
автор1. Не придется. Динамический объект типа экземпляра класса существует, пока ссылка на него хранится в какой-либо переменной. Если переменной присвоить другое значение, объект уничтожается. Т.е. при выполнении, скажем, команды TreeView.Clear либо Node.Remove экземпляр класса, ссылка на который хранится в поле Tag, будет деструктурирован ? У меня Access 2003 и VB 6.3. Работал на C++ - приходилось следить за освобождением памяти самому... авторСудя по вашей статистике VBA означает MS Access, стало быть рекордсет у вас где-то обязан быть. recordset у меня создаётся статически в процедуре построения дерева (существует только в этой процедуре). Только при чём здесь он ? авторХраните в таге только айди а параллельно где-то в памяти - коллекцию, рекордсет, в общем нечто, позволяющее по айди мгновенно вытаскивать все атрибуты объекта. Да, можно создать глобальную коллекцию структур. Но здесь есть 2 минуса: 1. Придётся эту коллекцию дополнительно обрабатывать параллельно с перестройкой дерева, удалением узлов. В случае, когда данные (либо ссылка на объект с данными) хранятся непосредственно в поле Tag, при удалении узла данные (объект с данными) удаляются автоматически. 2. Для каждого нового узла придётся генерировать уникальный для коллекции идентификатор. С другой стороны, в качестве такого ключа можно взять ключ узла. Тогда и в поле Tag необходимость вообще отпадает. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2012, 10:54 |
|
Как в поле Tag разместить структуру
|
|||
---|---|---|---|
#18+
Cyrax, У всех узлов есть свойство .Tag типа Variant: Вроде Tag он int, а не как не вариант Так что храним структуру отдельно, а на нее только ссылаемся в таге. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2012, 11:17 |
|
Как в поле Tag разместить структуру
|
|||
---|---|---|---|
#18+
Cyrax1. Использование класса: на лету создаём экзепляр класса и закидываем ссылку на него в поле Tag. Но в этом случае придётся всё время следить за удалением узлов (при удалении любого узла придётся вручную освобождать память) Откуда такие опасения? Плюсовый бэкграунд? Не бойтесь, попробуйте, минутное ведь дело. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2012, 11:28 |
|
Как в поле Tag разместить структуру
|
|||
---|---|---|---|
#18+
авторВроде Tag он int, а не как не вариант У меня Variant (Access 2003, VB 6.3). Вот его объявление: Код: vbnet 1.
Посему есть возможность хранить данные непосредственно там. авторОткуда такие опасения? Плюсовый бэкграунд? Не бойтесь, попробуйте, минутное ведь дело. Что такое "плюсовый бэкграунд" ? Так будет экземпляр класса уничтожаться при обнулении счётчика ссылок или нет ? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2012, 15:19 |
|
Как в поле Tag разместить структуру
|
|||
---|---|---|---|
#18+
CyraxЧто такое "плюсовый бэкграунд" ?Опыт программирования на C++, как на основном средстве разработки.CyraxТак будет экземпляр класса уничтожаться при обнулении счётчика ссылок или нет ?Будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2012, 16:29 |
|
Как в поле Tag разместить структуру
|
|||
---|---|---|---|
#18+
Собственно, структуру сохранить в Tag'е никак не получится ? Без сериализации ? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2012, 17:00 |
|
Как в поле Tag разместить структуру
|
|||
---|---|---|---|
#18+
Cyrax, незачем хранить именно структуру. Но если интересует формальная сторона дела, то, в конечном итоге, можно. Через большие тернии. На vbstreets.ru была тема. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2012, 17:18 |
|
Как в поле Tag разместить структуру
|
|||
---|---|---|---|
#18+
В общем, 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 она срабатывает сразу как только объект становится не нужным. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2012, 19:48 |
|
Как в поле Tag разместить структуру
|
|||
---|---|---|---|
#18+
1) Ерунда. Структуры не хранятся в коллекции, а в случае объектов нет нужды в коллекции — достаточно второго способа. 3) Массив структур. В Tag хранится индекс массива. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2012, 21:26 |
|
Как в поле Tag разместить структуру
|
|||
---|---|---|---|
#18+
автор1) Ерунда. Структуры не хранятся в коллекции, Ну, если в Tag структуру можно запихнуть , то думаю, и в коллекцию проблем не составит. автора в случае объектов нет нужды в коллекции — достаточно второго способа. Почему же. В случае с коллекцией объектов можно вообще обойтись без поля Tag (это поле можно будет использовать для семантически иных данных/целей) автор3) Массив структур. В Tag хранится индекс массива. Недостатки: 1. Длина массива ограничена размерностью типа Integer. Дерево (БД) может содержать гораздо больше узлов (записей). 2. Удаление элемента из массива очень трудоёмко (перекладывание + ReDim) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2012, 22:24 |
|
Как в поле Tag разместить структуру
|
|||
---|---|---|---|
#18+
CyraxНу, если в Tag структуру можно запихнуть , то думаю, и в коллекцию проблем не составит.Если практика извращений для вас не составляет проблем, флаг в руки. CyraxПочему же. В случае с коллекцией объектов можно вообще обойтись без поля Tag (это поле можно будет использовать для семантически иных данных/целей) То есть вы еще даже с целями не определились? Cyrax1. Длина массива ограничена размерностью типа Integer. Дерево (БД) может содержать гораздо больше узлов (записей).Дерево, содержащее такое количество узлов, само по себе является недостатком. Единственное ему применение — реестр. Но в regedit и узлы подгружаются динамически. Cyrax2. Удаление элемента из массива очень трудоёмко (перекладывание + ReDim)Зависит от структуры. Если там нет строк нефиксированной длины и массивов, то CopyMemory за раз все сдвинет, а redim необязателен, можно запоминать максимальный индекс и не ходить дальше по массиву. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2012, 23:14 |
|
Как в поле Tag разместить структуру
|
|||
---|---|---|---|
#18+
структуру нельзя засунуть в Variant вместо структуры надо использовать класс те класс модуль а в него запихать переменные public Name as string public UnitCount as long и тд ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2012, 23:56 |
|
Как в поле Tag разместить структуру
|
|||
---|---|---|---|
#18+
авторТо есть вы еще даже с целями не определились?Ну зачем же так грубо ? Речь о способах реализации, их плюсах и минусах. Что касается меня, то с целями и задачами определился. Но при этом не исключаю, что в процессе реализации этих задач может понадобиться хранение семантически отличных от NodeType данных. авторЗависит от структуры. Если там нет строк нефиксированной длины и массивов, то CopyMemory за раз все сдвинет, а redim необязателен, можно запоминать максимальный индекс и не ходить дальше по массиву.1. У меня как раз и используется строка переменной длины 2. Имхо, использование CopyMemory при работе с массивами - явный признак ошибочного выбора структур данных 3. Даже если элементы массива структур будут иметь фиксированную длину, то логично будет предусмотреть возможность работы с массивом и в том случае, если в структуру будут добавлены строки переменной длины либо ссылки на объекты. Такая необходимость запросто может возникнуть в ходе изменения/расширения требований к проекту. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2012, 10:57 |
|
Как в поле Tag разместить структуру
|
|||
---|---|---|---|
#18+
надо класс использоватьструктуру нельзя засунуть в 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 и т. д. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2012, 12:17 |
|
Как в поле Tag разместить структуру
|
|||
---|---|---|---|
#18+
Так чем вариант с классом не устроил? Так и не попробовали? На форме TreeView и две кнопки. Выделение и освобождение памяти можно наблюдать в диспетчере задач. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2012, 12:56 |
|
Как в поле Tag разместить структуру
|
|||
---|---|---|---|
#18+
Казанский, +1 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2012, 13:29 |
|
Как в поле Tag разместить структуру
|
|||
---|---|---|---|
#18+
Cyrax2. Имхо, использование CopyMemory при работе с массивами - явный признак ошибочного выбора структур данныхЭто явный признак того, что скорость работы критична. Cyrax3. Даже если элементы массива структур будут иметь фиксированную длину , то логично будет предусмотреть возможность работы с массивом и в том случае, если в структуру будут добавлены строки переменной длины либо ссылки на объекты. Такая необходимость запросто может возникнуть в ходе изменения/расширения требований к проекту.Это взаимоисключающие параграфы. Либо жестко ограничиваем структуру в целях повышения скорости, либо закладываем хоть песни с плясками на будущее, но работаем штатно, медленно. А ссылки на объекты это Long, поля постоянной длинны. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2012, 13:33 |
|
Как в поле Tag разместить структуру
|
|||
---|---|---|---|
#18+
[quot Antonariy]Cyrax2. Имхо, использование CopyMemory при работе с массивами - явный признак ошибочного выбора структур данныхЭто явный признак того, что скорость работы критична. Как по мне, если критична скорость работы, то целесообразно в данном случае выбрать иные структуры данных, где можно удалять элементы без сдвигов и иных операций, не свойственных массивам. Вы как-то говорили про извращения. Так вот, "запихивание" структур в Variant - это не большее извращение, чем использование CopyMemory при работе с массивами. авторЭто взаимоисключающие параграфы. Именно поэтому массивы и не пригодны для таких целей. Одно с другим несовместимо, как Вы сами подметили. авторЛибо жестко ограничиваем структуру в целях повышения скорости, либо закладываем хоть песни с плясками на будущее, но работаем штатно, медленно. Выигрышь в скорости будет незначительный, к тому же можно реализовать динамическую подгрузку узлов. А вот проблемы расширяемости, рефакторинга и прочие умные категории всегда будут иметь большое значение в программировании. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2012, 18:08 |
|
Как в поле Tag разместить структуру
|
|||
---|---|---|---|
#18+
авторCyrax, чтобы не быть голословным, прикладываю библиотеку типов Да... Лучше, конечно, с объектами. Особенно, когда мусор есть кому выметать. авторТак чем вариант с классом не устроил? Так и не попробовали? А я Вам и так верю )) Остановился на варианте со ссылкой на объект в поле Tag. Имхо, оптимальный вариант. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2012, 18:11 |
|
Как в поле Tag разместить структуру
|
|||
---|---|---|---|
#18+
CyraxКак по мне, если критична скорость работы, то целесообразно в данном случае выбрать иные структуры данных,Мы вроде негласно договорились называть структурами Public Type. Здесь уместно сказать "хранилища". Cyrax где можно удалять элементы без сдвигов и иных операций, не свойственных массивам.Это зависит от задачи. Если 99% нагрузки программы на процессор заключается в поиске по индексу, а удаление/добавление происходит эпизодически, то коллекции безнадежно сливают массивам. А если 99% это перетряхивание его содержимого, то... нужно замерять. В реализации быстрых массивов гораздо больше букв, а скорость в 9 случаях из 10 не критична, поэтому коллекции удобнее. CyraxТак вот, "запихивание" структур в Variant - это не большее извращение, чем использование CopyMemory при работе с массивами.Использование CopyMemory это не извращение, а признак того, что человек наконец-то разобрался, что представляет из себя память компьютера и данные в ней. И от этого получает бонус в виде более шустрых процедур. А "запихивание" структур в Variant это извращение чистой воды. Во-первых, лишняя писанина, во-вторых проигрыш в скорости. Кто-то может объяснить, зачем это надо? CyraxВыигрышь в скорости будет незначительный, к тому же можно реализовать динамическую подгрузку узлов.Если заменить цикл на CopyMemory, выигрыш в скорости будет потрясающий. Я говорю о том, что видел и делал. CyraxИменно поэтому массивы и не пригодны для таких целей.Каких целей конкретно? Вы все говорите о каких-то целях, но мне не удается угадать ваше ТЗ. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2012, 18:38 |
|
Как в поле Tag разместить структуру
|
|||
---|---|---|---|
#18+
авторКаких целей конкретно? Вы все говорите о каких-то целях, но мне не удается угадать ваше ТЗ. Для целей хранения данных непостоянной длины. Например, динамических строк. авторЕсли заменить цикл на CopyMemory, выигрыш в скорости будет потрясающий. Я говорю о том, что видел и делал. Какой ещё цикл ? Мы сравниваем скорость работы с массивом структур и с иными "хранилищами" (так уж и быть), позволяющими удалять элементы без несвойственных этим хранилищам операций, т.е. штатными средствами. Например, с коллекцией ссылок на объекты. Вот и сравнивайте, что будет выполняться быстрее - Remove или CopyMemory. авторЕсли 99% нагрузки программы на процессор заключается в поиске по индексу, а удаление/добавление происходит эпизодически, то коллекции безнадежно сливают массивам. Слишком много "если". Основная нагрузка на процессор идёт при построении дерева. А там нечего искать по индексу. Обращение к БД, создание узлов. Да и вообще, скорость обработки данных критична прежде всего в системах реального времени. авторИспользование CopyMemory это не извращение, а признак того, что человек наконец-то разобрался, что представляет из себя память компьютера и данные в ней. А если не использовать CopyMemory, это значит, что человек лопух ? ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2012, 19:12 |
|
Как в поле Tag разместить структуру
|
|||
---|---|---|---|
#18+
CyraxДля целей хранения данных непостоянной длины. Например, динамических строк.Это не цель. Цель это то, что достигается путем хранения динамических строк. CyraxКакой ещё цикл ? Мы сравниваем скорость работы с массивом структур и с иными "хранилищами" (так уж и быть), позволяющими удалять элементы без несвойственных этим хранилищам операций, т.е. штатными средствами.Попробуйте удалить 100 элементов без цикла. Удаление одного элемента из коллекции будет быстрее, чем сдвиг массива через CopyMemory. И то не факт. Удаление ста элементов — медленнее. Если не будет очень лень, напишу таки тест. CyraxСлишком много "если". А вы как думали? Лишь скурпулезный учет всех условий, в которых придется работать коду, даст наиболее производительный алгоритм. CyraxОсновная нагрузка на процессор идёт при построении дерева.Я рассматривал массивы и коллекции в отрыве от всяких деревьев. Конечно, в таких условиях дерево является главным тормозом, и тут разница в скорости работы массивов и коллекций уходит на десятый план. CyraxДа и вообще, скорость обработки данных критична прежде всего в системах реального времени.Расскажите это хардкорным геймерам и тем, кто часто кодирует видео. авторА если не использовать CopyMemory, это значит, что человек лопух ? )))Это значит, что у него еще все впереди. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2012, 20:08 |
|
|
start [/forum/topic.php?fid=60&msg=37864274&tid=2157632]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
63ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 292ms |
total: | 454ms |
0 / 0 |