TStringList - убрать объект из списка, не удаляя его

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
Climber
постоялец
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

TStringList - убрать объект из списка, не удаляя его

Сообщение Climber »

Я забыл почти всё, что знал про freepascal...
Помню, был замечательный класс TStringList, который можно использовать как коллекцию объектов. Но вот беда: когда удаляешь объект из коллекции, сам объект уничтожается. А у меня случай, когда объект уничтожать нельзя, потому что по логике коллекция должна только временно ссылаться на объект. Ну примерно как если бы это была коллекция вида "список друзей". Если я перестаю с кем-то дружить (удаляю из списка друзей), я же его при этом не убиваю. Такое вообще возможно с TStringList? И если нет, то чем можно заменить?
Seenkao
энтузиаст
Сообщения: 578
Зарегистрирован: 01.04.2020 02:37:12
Контактная информация:

Сообщение Seenkao »

заменить пробелом или просто пустым местом? ('')
Climber
постоялец
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Сообщение Climber »

В смысле создать пустой TObject, вставить ссылку на него вместо моего объекта, а потом удалить запись из списка? Выглядит, как велосипед с квадратными колесами, но если других вариантов нет, то сойдет на первое время.
Аватара пользователя
runewalsh
энтузиаст
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Сообщение runewalsh »

Сними OwnsObjects (хотя она по умолчанию снята...).
Ни капельки не замечательный, ни тебе хэша, ни дерева, на десятке-сотне тысяч элементов должен вешаться.
Climber
постоялец
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Сообщение Climber »

runewalsh писал(а):Сними OwnsObjects (хотя она по умолчанию снята...).
О! Вот оно что! Спасибо.
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Сообщение Ichthyander »

runewalsh писал(а):Ни капельки не замечательный, ни тебе хэша, ни дерева, на десятке-сотне тысяч элементов должен вешаться.

Ну, если список отсортированный, то в некотором смысле хешированный. НО так-то да, для таких дел лучше хеш списки использовать

Добавлено спустя 1 минуту 3 секунды:
Climber писал(а):
runewalsh писал(а):Сними OwnsObjects (хотя она по умолчанию снята...).
О! Вот оно что! Спасибо.

Только не забудь теперь очищать объекты самостоятельно
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3071
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Для хешированных списков есть fcl-stl, который входит в стандартную поставку давненько.
Alex2013
долгожитель
Сообщения: 3237
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

runewalsh писал(а):Сними OwnsObjects (хотя она по умолчанию снята...

Упс! Что-то я запутался... Это что-же там тогда тогда творится по умолчанию? (то есть делает TObject.free или не делает? по опыту вполне очищает )
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Сообщение Ichthyander »

Alex2013 писал(а):
runewalsh писал(а):Сними OwnsObjects (хотя она по умолчанию снята...

Упс! Что-то я запутался... Это что-же там тогда тогда творится по умолчанию? (то есть делает TObject.free или не делает? по опыту вполне очищает )

Объекты, хранящиеся в экземпляре TStringList не очищаются по умолчанию. То есть те, что добавляются по процедуре TStringList.AddObject, к примеру. Да там иногда и не объекты хранят. Или объекты, которые не создавались в данном контексте и уничтожаться как следствие тоже не будут. Было бы странным, если бы это делалось по умолчанию.
Climber
постоялец
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Сообщение Climber »

Alex2013 писал(а):
runewalsh писал(а):Сними OwnsObjects (хотя она по умолчанию снята...

Упс! Что-то я запутался... Это что-же там тогда тогда творится по умолчанию? (то есть делает TObject.free или не делает? по опыту вполне очищает )
У меня в голове тоже засело почему-то, что очищает по умолчанию, но я писал соответсвующий код лет 10 назад и не помню уже ничего вообще. Видимо, на тот момент у меня в коде была просто куча дыр :oops:
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Сообщение Ichthyander »

...
Alex2013
долгожитель
Сообщения: 3237
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Climber писал(а):У меня в голове тоже засело почему-то, что очищает по умолчанию, но я писал соответсвующий код лет 10 назад и не помню уже ничего вообще. Видимо, на тот момент у меня в коде была просто куча дыр

А понял в чем шутка при УДАЛЕНИИ память по умолчанию не освобождается, а при освобождении или очистке всего списка очень даже ...

При удалении одного элемента приходится делать что-то вроде этого .
Begin
P:=Pointer(S3DSList.Objects[II]);
T3DModel(P).Free;
S3DSList.Delete(II);
end ;
А при сбросе списка целиком по идее можно делать проще S3DSList.Free; или S3DSList.Cliar;
Аватара пользователя
zoltanleo
постоялец
Сообщения: 459
Зарегистрирован: 17.10.2013 10:55:01

Сообщение zoltanleo »

Climber
А почему бы не воспользоваться для этих целей дженериками? Если я правильно понял первоначальный посыл, в списке с объектами некоторые элементы должны быть помечены как "невидимые"?
Можно заюзать какой-нибудь TList<T>, используя в качестве элемента, например, запись вида

Код: Выделить всё

 TMyRec = packed record
  Visible: boolean;//"видимость" элемента
  PObj: Pointer;//ссылка на объект
end;
Climber
постоялец
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Сообщение Climber »

zoltanleo писал(а):А почему бы не воспользоваться для этих целей дженериками?
Я бы много чем воспользовался, но не на всё нашел достаточно документации и рабочих примеров. Потихоньку что-то находится, я не спешу... Когда-то давно, в прошлой жизни, видел много примеров использования TStringList, ну и привык пихать его везде. Хорошая штука ведь, универсальная.
zoltanleo писал(а):Если я правильно понял первоначальный посыл, в списке с объектами некоторые элементы должны быть помечены как "невидимые"?
Нет. Идея довольно простая. Хочу написать редактор ER диаграмм. Есть объект типа "таблица", у него есть вложенные объекты типа "столбец". "Таблица" владеет "столбцами", то есть если таблица удаляется, то столбцы тоже удаляются. Или если один столбец удаляется из таблицы, то он удаляется насовсем. А есть объект типа "констрейнт", он тоже ссылается на столбцы, но не владеет ими. Если один столбец удаляется из констрейнта или весь констрейнт удаляется, столбцы остаются в таблице.
Ответить