![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
1122 |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 109 Регистрация: 24.10.2007 Репутация: нет Всего: нет |
Создаю объект TobjectList. Заполняю. Далее нужно оставить половину элементов от того, что есть. Перегоняю эту половину во временный ObjectList и хочу очистить исходный, чтобы затем вернуть туда эти элементы из временного. Но сыпятся ошибки после того, как я пытаюсь вызвать clear или delete по элементно.
Как правильно очищать такие массивы? Выдержки из кода:
Таким способом первоначально формирую массив:
Далее массив дозаполняется элементами:
И вот дальше нужно оставить в Population только N значений. Как это сделать? Спасибо. |
||||||
|
|||||||
Dom |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 7.8.2005 Репутация: 1 Всего: 4 |
Если все равно какие элементы удалять, то можно например так
|
|||
|
||||
1122 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 109 Регистрация: 24.10.2007 Репутация: нет Всего: нет |
Вбил ваш код. Ошибка. Аксесс виалэйшен.
|
|||
|
||||
1122 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 109 Регистрация: 24.10.2007 Репутация: нет Всего: нет |
Странные дела.
Если написать такой код:
и этот самый каунт будет равен 92, то на 71 итерации, когда будет удаляться 71 элемент произойдет ошибка.Т.к. удаляя на первой итерации 50-тый элемент каунт уменьшается на один и т.д. Когда дойдем до 71 итерации и нужно будет удалить 71й элемент, то его уже не будет. Что можно сделать? Это сообщение отредактировал(а) 1122 - 25.5.2010, 18:05 |
|||
|
||||
kami |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Ничего странного. Пойдем по порядку. По умолчанию ObjectList является владельцем элементов, которые он содержит. Это значит, что при удалении объекта из него, или при очищении списка этот объект УНИЧТОЖАЕТСЯ. Если нужно, чтобы этого не происходило, то конструктор вызывать нужно так:
Но нужно четко осознавать, что в этом случае об освобождении объектов, добавленных в список, нужно позаботиться самому, иначе пойдут утечки. При Вашем способе (загнать половину во временный список, очистить исходный, перенести обратно) получается следующая последовательность: 1. В исходном списке содержатся ссылки на объекты. 2. Часть этих ссылок мы копируем во временный список. 3. Очищаем исходный список. При этом, т.к. список был создан с конструктором по-умолчанию, он является владельцем добавленных в него объектов. При очищении он высвобождает все содержащиеся в нем объекты, ссылки на них становятся не-валидными. 4. Копируем ссылки на (уже уничтоженные) объекты в исходный список. Но толку от них уже нет...
Код, предложенный Dom правильный. Вы не обратили внимание на то, что используется цикл на уменьшение for ...downto, а не for...to. В случае использования этого кода настоятельно рекомендуется оставить ObjectList владельцем объектов. Добавлено @ 19:20 В дополнение: так как индексация элементов в списке начинается с нуля, прошу обратить внимание на Это сообщение отредактировал(а) kami - 25.5.2010, 19:21 |
||||
|
|||||
underchronos |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 25.7.2008 Репутация: нет Всего: нет |
kami
А не проще тогда в этом цикле воспользоваться функцией Extract?
Разве для этого метода будет важно с каким флагов Create? Он удалит ссылку из своего списка и вернет ее, не удалив сам объект. Это сообщение отредактировал(а) underchronos - 25.5.2010, 20:49 |
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
"Из любого безвыходного положения есть по меньшей мере два выхода" (с) не помню чье. Возможно, Вам проще сделать так. Но мне было бы лень заводить второй список, тратить время процессора на его создание/заполнение/копирование_в_исходный/уничтожение, когда можно просто воспользоваться кодом Dom, зная при этом что OwnObjects=True. Всё зависит от задачи... Upd: в Вашем случае при перегоне из временного в основной также нужно будет пользоваться Extract, в противном случае - опять контроль OwnObjects временного списка... Это сообщение отредактировал(а) kami - 25.5.2010, 21:32 |
|||
|
||||
underchronos |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 25.7.2008 Репутация: нет Всего: нет |
Надо запомнить! ![]() Да я, честно признаться, задачу не понимаю. ![]() Это сообщение отредактировал(а) underchronos - 25.5.2010, 21:33 |
|||
|
||||
kami |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Вообще-то исходная проблема звучала как
И решение было дано в первом же ответе ![]() Кстати, чем-то этот код напоминает пример игры на Паскале из учебников - "Цивилизация" (не путать со стратегией). Там по определенным условиям в "соседних" клетках "рождались" новые элементы, старели (просто от этапа к этапу), умирали от перенаселенности (когда в 3 или 4 соседних клетках тоже были элементы) и т.п... |
||||
|
|||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
kami, это жизнь а не цивилизация
-------------------- Обижено школьников: 8 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |