![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
копировать 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 не создаёт копии содержимого, оба списка ссылаются на одни и те же стринглисты.