Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.30;
Скачать: CL | DM;

Вниз

О порядке деструкции объектов которые создаются автоматически   Найти похожие ветки 

 
SergP.   (2006-07-06 20:49) [0]

Имеется TListView и TPageControl
Вкладки на последнем создаются наследниками нижеприведенного класса:


type TBaseSheet = class(TTabSheet)
  public
    Query:TAdoQuery;
    IspEnabled:boolean;
    Data:pointer; // Поле для хранения указателей на связанные объекты
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure ExportToExcel(WorkSheet:variant); virtual; abstract;
    function GetCount:integer; virtual; abstract;
  end;
// Классы создаваемых вкладок наследуются от этого

...

destructor TBaseSheet.Destroy;
begin
 Query.Close;
 Query.Free;
 TListItem(Data).Data:=nil; // тут возникает проблема
 inherited;
end;


При создании вкладки, указатель на нее сохраняется в TListItem.data, и соответственно указатель на TListItem сохраняется в TBaseSheet.data
Возникла проблема, проявляющая себя в возникновении AV  при закрытии программы.
Как выяснилось проблема из-за того что при закрытии приложения TlistView уничтожается раньше чем TPageControl, и при уничтожении TPageControl (вернее его "дочерних" объектов). Строка где происходит AV указана выше (в деструкторе вушеприведенного класса).
Как избежать данной неприятной ситуации?
Т.е. как сделать чтобы TPageControl уничтожался ранее TListView"а?

Пока віхожу их ситуации уничтожением TPageControl в OnClose формы.


 
Leonid Troyanovsky ©   (2006-07-06 21:01) [1]


> SergP.   (06.07.06 20:49)  

>  TListItem(Data).Data:=nil; // тут возникает проблема


Здесь неплохо бы, хотя бы, намекнуть на сермяжный
смысл оного (проблемного) деяния.

Плз, без заумствований, бо, практически, конец недели.

--
Regards, LVT.


 
SergP.   (2006-07-06 21:12) [2]


> Здесь неплохо бы, хотя бы, намекнуть на сермяжный
> смысл оного (проблемного) деяния.


У меня как-бы связаны объекты TListItem и TTabSheet взаимным хранением указателей друг на друга.

А смысл в том чтобы в соответствующем TListItem убрать указатель на нашу вкладку если мы ее хотим закрыть. Это все работает нормально. Проблема только возникает при закрытии приложения.


 
Leonid Troyanovsky ©   (2006-07-06 21:16) [3]


> SergP.   (06.07.06 21:12) [2]

> У меня как-бы связаны объекты TListItem и TTabSheet взаимным
> хранением указателей друг на друга.


При хранении ссылок необходимо
procedure Notification(AComponent: TComponent; Operation: TOperation); override;

--
Regards, LVT.


 
SergP.   (2006-07-06 23:11) [4]


> При хранении ссылок необходимо
> procedure Notification(AComponent: TComponent; Operation:
>  TOperation); override;


Поподробнее где можно почитать?


 
Leonid Troyanovsky ©   (2006-07-06 23:14) [5]


> SergP.   (06.07.06 23:11) [4]

> Поподробнее где можно почитать?


Delphi help: TComponent.Notification ?

--
Regards, LVT.


 
ЮЮ ©   (2006-07-07 04:01) [6]

1) У ListView есть событие OnDeletion, где лучше всего и уничтожать объекты из Data
2)  если в Data лишь указатель на связанный объект, уничтожение которого не входит в обязанности TBaseSheet, то зачем обnilять эту ссылку?



Страницы: 1 вся ветка

Текущий архив: 2006.07.30;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.045 c
3-1148051502
Antonyan
2006-05-19 19:11
2006.07.30
Как загрузить из блоба через TStream


15-1151659362
Layner
2006-06-30 13:22
2006.07.30
Сервис сам останавливается в W2003R2, хотя в 2000 стабильно


4-1144861111
anton773
2006-04-12 20:58
2006.07.30
Получить значение напряжения питания


3-1147982675
Некто
2006-05-19 00:04
2006.07.30
Размеры полей Ф, И и О


2-1152221686
Quattro
2006-07-07 01:34
2006.07.30
Координаты буквы