Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.03.2016, 15:57
Leks Leks вне форума
Прохожий
 
Регистрация: 17.01.2011
Сообщения: 2
Версия Delphi: XE6
Репутация: 10
По умолчанию Объясните поведение

Имеем код:
Код:
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);
И после этого у элемента l2[1] поле Name пустое, хотя сам объект присутствует и поле ID у него нормальное.
Если string поменять на ShortString, то Name не обнуляется.
Хотелось-бы понять почему так происходит и что делать с уже написанным кодом.
Ответить с цитированием
  #2  
Старый 20.03.2016, 16:05
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Сообщение от Embarcadero
TObjectList is a TList with the capability of automatically freeing object entries when they are removed from the list.
В связи с этим полагаю (не утверждаю), что l1 владеет объектом и при удалении из списка он удаляется, а во втором списке остается указатель на невалидный объект. Это может кончится совершенно произвольными вещами, в том числе и похуже, чем пустая строка в имени.
Если так, то самым простым решением пожалуй будет отключить OwnsObjects в списках и не забывать удалять сами объекты руками, когда они более не нужны. Можно пойти другим путем - хранить в списках или динамических массивах не объекты, а записи (record), чтобы при добавлении элемента он полностью копировался в новый список/массив, а не просто сохранялся еще один указатель, как в случае с объектами.

Но это только предположение - я не особо разбирался в работе делфовых строк, списков и импровизированного сборщика мусора.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 20.03.2016 в 16:11.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:03.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter