|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Объясните поведение
Имеем код:
Код:
TItem = class (TObject) private fName:string; fID:integer; public Property Name:string read fName write fName; Property ID:integer read fID write fID; end; TGroup = class (TObjectList) // Реализован список объектов типа TItem Procedure AppendItem(aName:string; aID:integer);// создает новый элемент списка end; ... var l1,l2:TGroup; begin l1:=TGroup.create; l1.AppendItem('qwe1',1); l1.AppendItem('qwe2',2); l1.AppendItem('qwe3',3); l2:=TGroup.Create; l2.AppendItem('qaz1',101); l2.Add(l1[0]); ... l1.delete(0); Если string поменять на ShortString, то Name не обнуляется. Хотелось-бы понять почему так происходит и что делать с уже написанным кодом. |
#2
|
||||
|
||||
Цитата:
Если так, то самым простым решением пожалуй будет отключить OwnsObjects в списках и не забывать удалять сами объекты руками, когда они более не нужны. Можно пойти другим путем - хранить в списках или динамических массивах не объекты, а записи (record), чтобы при добавлении элемента он полностью копировался в новый список/массив, а не просто сохранялся еще один указатель, как в случае с объектами. Но это только предположение - я не особо разбирался в работе делфовых строк, списков и импровизированного сборщика мусора. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 20.03.2016 в 16:11. |