Страница: 1 |
Страница: 1 |
Вопрос: Коллекция типов
Добавлено: 24.11.05 13:17
Автор вопроса: LamerOnLine | ICQ: 334781088
Трабла следующего рода.
Есть структура пользовательских типов с многократным вложением, есть коллекция этих структур. Но!
При добавлении в коллекцию все поля структур становятся Variant, что недопустимо. Обойтись массивом вместо коллекции проблемно - элементы должны удаляться. Есть у кого оптимальное решение проблемы?
Ответы
Всего ответов: 8
Номер ответа: 1
Автор ответа:
Dushes
ICQ: 249195431
Вопросов: 8
Ответов: 110
Профиль | | #1
Добавлено: 24.11.05 13:20
А чем же проблемно обходиться массивами. Есть же Redim Preserve. А уж если ты хочешь использовать коллекцию, то вместо типа данных используй класс с тем же набором свойств.
Номер ответа: 2
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #2
Добавлено: 24.11.05 13:42
Массивы проблемны тем что удалить элемент из середины массива - гемор какого поискать...
Классы тут совсем не катят по двум причинам:
1. Нужна высокая скорость работы, софт работает в реальном времени.
2. Специфика работы с полями - через CopyMemory. С классом это куда сложнее
Номер ответа: 3
Автор ответа:
Victor
ICQ: 345743490
Вопросов: 42
Ответов: 385
Web-сайт:
Профиль | | #3
Добавлено: 25.11.05 01:00
Массивы проблемны тем что удалить элемент из середины массива - гемор какого поискать...
В чем проблема-то?
Сделать своп элемента который надо удалить в конец массива и Redim Preserve Arr(? to ubound(Arr)-1).
Номер ответа: 4
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #4
Добавлено: 25.11.05 12:07
Интересно как это
Есть идеи как поменять местами элементы массива. Точнее, перекинуть нужный в конец, а остальные сдвинуть к началу. Кроме цмкла, конечно.
CopyMemory тут не катит, структура элементов сложная.
Номер ответа: 5
Автор ответа:
Victor
ICQ: 345743490
Вопросов: 42
Ответов: 385
Web-сайт:
Профиль | | #5
Добавлено: 25.11.05 19:16
Сделать массив перестановок.
Иначе говоря, все элементы списка хранятся в х.-з.-каком порядке в каком-то массиве. И есть массив индексов, который хранит порядок этих элементов. А так как индексы - лонги, то гнать их циклом будет уже не так долго.
берем элемент, который надо удалить, и удаляем. Затем пишем туда последний элемент массива.
Затем делаем Redim Preserve для уменьшения длины массива на единицу (то биш удаления того элемента, что мы только что скопировали на то место, где находился тот, который первоначально надо было удалить).
Надеюсь, понятно.
Или, как я уже написал, использовать массив перестановок.
Номер ответа: 6
Автор ответа:
ANDREY
Вопросов: 0
Ответов: 33
Профиль | | #6
Добавлено: 26.11.05 22:46
Почитай: http://www.vbstreets.ru/VB/Articles/66160.aspx
Номер ответа: 7
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #7
Добавлено: 28.11.05 11:51
Да, это я, конечно, знаю, но повторю - структура типа сложная, со многочисленными вложениями, и писать граббер, который будет этим заниматься - муторное дело. Выйдет еще отстойнее чем с Variant.
Решил проблему более кривым способом - добавил однострочную функцию, которая принимает в качестве аргумента элемент коллекции и возвращает его как требуемый тип. Не очень красиво, зато без АПИ, груды кода и возможности сглючить
Номер ответа: 8
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #8
Добавлено: 28.11.05 12:43
Кстати, попутный вопрос.
Допустим, делаю так - присваиваю удаляемому элементу последний элемент массива, затем делаю Redim Preserve. Проверил - данные вложенных структур тоже сохраняются, но терзают смутные сомнения - не возникает ли утечка памяти?