Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

копировать TObjectList в TObjectList


Цукор5 ©   (2015-09-03 15:33:00) 

Добрый день, всем.

Подскажите, что я делаю не так?

 var Obj1,Obj2:TObjectList;
 I:Integer;
begin
 Obj1:=TObjectList.Create;
 try
   Obj1.Add(TStringList.Create);
   for I:=0 to 5 do TStrings(Obj1.Items[0]).Add('hello'+IntToStr(I));

   Obj2:=TObjectList.Create;
   try
     Obj2. Assign(Obj1);
     Memo1.Lines.Add(IntToStr(Obj2.Count))
   finally
     Obj2.Free;
   end;

 finally
   Obj1.Free;
 end;
end;


Юрий Зотов   (2015-09-03 17:20:00) [1]

Ужас. Не завидую тому, кому придется этот код сопровождать.

Действительно, похоже на сагу про X, Y, Z. Вы бы лучше сказали простыми словами - в чем состоит задача-то? Есть подозрение, что можно сделать проще.


Цукор5   (2015-09-03 16:09:00) [2]

Короче, я забил. Сделал копирование и все. Нет проблем с утечками.

procedure TForm1.InfoObj(var Msg: TMessage);
 var Rec:PDataRec;
 I,II:Integer;
begin
 Rec:=PDataRec(Msg.WParam);
 List.Clear;
 if Rec^.Obj.Count>0 then
 begin
   for I:=0 to Rec^.Obj.Count-1 do List.Add(TStringList.Create);
   //
   for I:=0 to Rec^.Obj.Count-1 do
   for II:=0 to TStrings(Rec^.Obj.Items[0]).Count-1 do TStrings(List.Items[I]).Add(TStrings(Rec^.Obj.Items[I]).Strings[II]);
 end;
 Dispose(Rec);
end;


han_malign   (2015-09-03 15:59:00) [3]


> Т.е. простыми словами, уничтожать нужно только один. Я правильно понял?

- неправильно - создаватьнужно только один...

З.Ы. где-то там была ссылка на вопрос про XYZ...


RWolf   (2015-09-03 15:58:00) [4]

> Не будет ли  утечек
Будет, конечно. Нужно определиться с тем, кто владеет объектами.

Что, если один из TObjectList находится в другом потоке
тогда нужно заодно продумывать доступ к стринглистам из разных потоков.


Цукор5   (2015-09-03 15:48:00) [5]

Т.е. простыми словами, уничтожать нужно только один. Я правильно понял?

Хорошо, пусть так. Не будет ли  утечек при таком подходе? Что, если один из TObjectList находится в другом потоке? Как тут быть?


RWolf   (2015-09-03 15:41:00) [6]

ObjectList по умолчанию владеет объектами, а Assign не создаёт копии содержимого, оба списка ссылаются на одни и те же стринглисты.


Наверх

Титульная страница Поиск, карта сайта Написать письмо