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

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

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

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

Сообщение Climber » 01.10.2021 01:16:49

Я забыл почти всё, что знал про freepascal...
Помню, был замечательный класс TStringList, который можно использовать как коллекцию объектов. Но вот беда: когда удаляешь объект из коллекции, сам объект уничтожается. А у меня случай, когда объект уничтожать нельзя, потому что по логике коллекция должна только временно ссылаться на объект. Ну примерно как если бы это была коллекция вида "список друзей". Если я перестаю с кем-то дружить (удаляю из списка друзей), я же его при этом не убиваю. Такое вообще возможно с TStringList? И если нет, то чем можно заменить?
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

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

Сообщение Seenkao » 01.10.2021 01:50:39

заменить пробелом или просто пустым местом? ('')
Seenkao
постоялец
 
Сообщения: 309
Зарегистрирован: 01.04.2020 03:37:12

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

Сообщение Climber » 01.10.2021 01:56:47

В смысле создать пустой TObject, вставить ссылку на него вместо моего объекта, а потом удалить запись из списка? Выглядит, как велосипед с квадратными колесами, но если других вариантов нет, то сойдет на первое время.
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

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

Сообщение runewalsh » 01.10.2021 02:52:11

Сними OwnsObjects (хотя она по умолчанию снята...).
Ни капельки не замечательный, ни тебе хэша, ни дерева, на десятке-сотне тысяч элементов должен вешаться.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 549
Зарегистрирован: 27.04.2010 00:15:25

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

Сообщение Climber » 01.10.2021 10:51:49

runewalsh писал(а):Сними OwnsObjects (хотя она по умолчанию снята...).
О! Вот оно что! Спасибо.
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

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

Сообщение Ichthyander » 01.10.2021 12:37:14

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

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

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

Только не забудь теперь очищать объекты самостоятельно
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 584
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

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

Сообщение Снег Север » 01.10.2021 17:35:10

Для хешированных списков есть fcl-stl, который входит в стандартную поставку давненько.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2782
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение Alex2013 » 01.10.2021 21:16:21

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

Упс! Что-то я запутался... Это что-же там тогда тогда творится по умолчанию? (то есть делает TObject.free или не делает? по опыту вполне очищает )
Alex2013
долгожитель
 
Сообщения: 2240
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение Ichthyander » 01.10.2021 21:29:09

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

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

Объекты, хранящиеся в экземпляре TStringList не очищаются по умолчанию. То есть те, что добавляются по процедуре TStringList.AddObject, к примеру. Да там иногда и не объекты хранят. Или объекты, которые не создавались в данном контексте и уничтожаться как следствие тоже не будут. Было бы странным, если бы это делалось по умолчанию.
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 584
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

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

Сообщение Climber » 01.10.2021 21:45:51

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

Упс! Что-то я запутался... Это что-же там тогда тогда творится по умолчанию? (то есть делает TObject.free или не делает? по опыту вполне очищает )
У меня в голове тоже засело почему-то, что очищает по умолчанию, но я писал соответсвующий код лет 10 назад и не помню уже ничего вообще. Видимо, на тот момент у меня в коде была просто куча дыр :oops:
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

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

Сообщение Ichthyander » 01.10.2021 21:56:56

...
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 584
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

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

Сообщение Alex2013 » 02.10.2021 15:35:26

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

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

При удалении одного элемента приходится делать что-то вроде этого .
Begin
P:=Pointer(S3DSList.Objects[II]);
T3DModel(P).Free;
S3DSList.Delete(II);
end ;
А при сбросе списка целиком по идее можно делать проще S3DSList.Free; или S3DSList.Cliar;
Alex2013
долгожитель
 
Сообщения: 2240
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение zoltanleo » 12.10.2021 02:13:56

Climber
А почему бы не воспользоваться для этих целей дженериками? Если я правильно понял первоначальный посыл, в списке с объектами некоторые элементы должны быть помечены как "невидимые"?
Можно заюзать какой-нибудь TList<T>, используя в качестве элемента, например, запись вида
Код: Выделить всё
TMyRec = packed record
  Visible: boolean;//"видимость" элемента
  PObj: Pointer;//ссылка на объект
end;
Аватара пользователя
zoltanleo
постоялец
 
Сообщения: 415
Зарегистрирован: 17.10.2013 10:55:01

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

Сообщение Climber » 12.10.2021 11:27:12

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


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru