Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2017, 15:42   #1
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию Пытаюсь разобраться с TList. Как чего удалять?

Что-то я вижу в примерах, как создаются TList, но не вижу, как они удаляются... Типа myList.Free. Для TList этого не нужно, что ль?
И ещё, как я прочитал, TList - это список указателей на элементы. Т.е., если у меня есть класс, и я добавляю объект класса в TList, то myList.delete[i] не удаляет объект из памяти? Мне нужно делать так?
Часть 1. Присвоение.
Код:
type
  TMyClass = class
    ind: integer;
  end;

procedure AddToList;
var
  MyList:TList;
  MyEl:TMyClass;
  i: integer;
begin
  MyEl:=TMyClass.create;
  for i:=0 to 10 do
  begin
    MyEl.ind := i;
    MyList.Add(MyEl);
  end;
  MyEl.Destroy;
end;
Часть 2. Удаление.
Код:
procedure DelFromList;
var
  MyList:TList;
  MyEl:TMyClass;
  i:integer;
begin
  For i:=0 to 10
// А чего вообще тут-то? MyList[i].Destroy? А потом, чтоб указатель в TList не остался, MyList[i].delete?
end;
Как вообще с этим работать? Поясните, пожалуйста...
Ship_1 вне форума Ответить с цитированием
Старый 04.04.2017, 15:49   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

В TList всякий геморой с указателями, я его не осилил когда писал на Дельфи )

Говорю ж, TObjectList проще для объектов. + есть флаг, чтоб он сам вызывал Free при удалении элементов (методы Delete или Remove) или очистке списка или уничтожении (Free) списка.

И .Free вместо Destroy.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 04.04.2017 в 15:54.
Alex11223 вне форума Ответить с цитированием
Старый 04.04.2017, 16:02   #3
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Ну хорошо, а если перенести это в TObjectList, то, в первую очередь, надо установить OwnsObjects := true, а потом Delete удаляет элемент из списка и сам объект? Я правильно понял, что TObjectList хранит сами объекты, а не указатели на них? Т.е. при
MyClass:=TMyClass.create;
MyObjectList[0]:=MyClass;

MyClass.Free;
не уничтожает MyObjectList[0]? Его уничтожает MyObjectList.Delete(0)?
Ship_1 вне форума Ответить с цитированием
Старый 04.04.2017, 16:09   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
procedure AddToList;
var
  MyList:TList;
  MyEl:TMyClass;
  i: integer;
begin
  MyEl:=TMyClass.create;
  for i:=0 to 10 do
  begin
    MyEl.ind := i;
    MyList.Add(MyEl);
  end;
  MyEl.Destroy; // А теперь у нас есть ссылка на РАЗРУШЕННЫЙ объект 
 // ссылка в List осталась, но объект-то(последний из тех что добавляли) мы разрушили.
end;
Код:
procedure DelFromList;
var
  MyList:TList;
  MyEl:TMyClass;
  i:integer;
begin
  For i:=0 to 10
// А чего вообще тут-то? MyList[i].Destroy? А потом, чтоб указатель в TList не остался, MyList[i].delete?

ОБЫЧНО 
tmp:=MyList[i];  // сначала получить локальную ссылку на удаляемый объект
MyList.Remove(tmp); //потом ИСКЛЮЧИТЬ данный элемент из списка или так 
MyList.Delete(i); // или этак не помню как будет правильно
tmp.Free; // и теперь разрушаем САМ объект, если он нам не нужен
end;
ну и конечно при цикличном удалении надо учитывать ИЗМЕНЕНИЕ индексов при удалении из середины.
Код:
  For i:=10 downto 0
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 04.04.2017 в 16:14.
evg_m вне форума Ответить с цитированием
Старый 04.04.2017, 16:11   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Указатели. В Дельфи вроде нельзя никак передать объекты не по указателю, только если вручную скопировать значения.

TObjectList это просто более удобная обертка над TList для объектов.

Добавлять через .Add, удалять Delete или Remove.

Если с OwnsObjects, то самому не надо уничтожать элементы.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 04.04.2017, 16:17   #6
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

evg_m Вроде стало понятней немного, спасибо.
Alex11223, в случае TObjectList замечание от evg_m по первой части остаётся справедливым?
Ship_1 вне форума Ответить с цитированием
Старый 04.04.2017, 16:30   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Да, только .Free у элемента никогда не надо если OwnsObjects.

И еще (в обоих случаях) если tmp это TMyClass, то до 2009 надо
Код:
tmp := TMyClass(list[i]);
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 04.04.2017, 16:31   #8
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Ух ты. Это серьёзный комментарий, даже и не предположил бы. Спасибо!
Ship_1 вне форума Ответить с цитированием
Старый 04.04.2017, 16:36   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Alex11223, в случае TObjectList замечание от evg_m по первой части остаётся справедливым?
Да.
Боле того, у нас ВСЕ ссылки будут НЕВЕРНЫМИ.
Цитата:
Код:
MyEl:=TMyClass.create;
  for i:=0 to 10 do
    MyList.add(MyEl);
Мы просто десять раз добавили один и ТОТ же объект.
проверить это просто.
Код:
for j:=0 to 10
  ShowMessage(inttostr((MyList[j] as TMyclass).i );
десять раз будет выведено 10 (при учете исправления замечания про Destroy)

Код:
For i:=1 to 
  r:=TmyClass.Create; // создавать объект надо КАЖДЫЙ раз.
  MyList.add(r);
  r.i:=i;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 04.04.2017, 16:41   #10
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Спасибо большое!! Теперь, надеюсь, не наделаю глупостей и не оставлю в памяти кучу мусора
Ship_1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
пытаюсь разобраться ya2500 Visual C++ 13 07.03.2013 15:32
пытаюсь разобраться Кудаив Помощь студентам 6 01.05.2012 23:04
TlistView и Tlist непоучается массово удалять выбранные обьекты... Человек_Борща Общие вопросы Delphi 4 09.01.2011 16:28
Пытаюсь разобраться в задании fs444 Microsoft Office Excel 12 12.01.2010 12:57