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

Вниз

Проблемы с освобождением ресурсов   Найти похожие ветки 

 
_none_ ©   (2003-12-04 20:39) [0]

Есть компонент (A) - наследник tcontrol. у него есть подчиненные компоненты (B), которые требуют, чтобы их owner (C) был не ниже twincontrol.
проблема следующая: при закрытии приложения деструктор компонента (C) освобождает компоненты (B). Но при этом появляется проблема удаления компонентов (B) из компонента (A), т.к. за их удаление уже отвечает компонент (C).
Как же выйти из замкнутого круга?


 
Игорь Шевченко ©   (2003-12-04 20:58) [1]

наследник TComponent удаляет себя из списка компонентов Owner"а
наследник TControl не удаляет себя из списка контролов Parent"а при разрушении.
Parent в деструкторе очищает список контролов, и удаляет их, при этом каждый контрол удаляет себя из компонентов Owner"а.

Дальнейшая дискуссия будет после примеров кода


 
_none_ ©   (2003-12-04 22:34) [2]


TB = class;

TA = class(TComponent)
public
B: TB;
constructor Create(AOwner: TComponent); override;
destructor Destroy;override;
end;

TB = class(TWinControl)
end;

TC = class(TForm)
procedure FormCreate(Sender: TObject);
public
A: TA;
end;

var
C: TC;

implementation

{$R *.dfm}

constructor TA.Create(AOwner: TComponent);
begin
inherited;
B := TB.Create(AOwner); //парентом (B) должен быть именно (C),
end;

destructor TA.Destroy;
begin
B.Free;
inherited;
end;

procedure TC.FormCreate(Sender: TObject);
begin
A := TA.Create(Self);
end;


 
_none_ ©   (2003-12-04 22:36) [3]

т.е. не парентом, а овнером


 
Игорь Шевченко ©   (2003-12-04 22:39) [4]


> destructor TA.Destroy;
> begin
> B.Free;
> inherited;
> end;


При выполнении строчки B.Free он удалится из списка Components объекта C.
Я криминала на первый взгляд не вижу...


 
_none_ ©   (2003-12-04 22:42) [5]

Спасибо.
при удалении формы происходит AV. Стало быть не удаляется...
вся проблема в том, что я не могу написать так:

constructor TA.Create(AOwner: TComponent);
begin
inherited;
B := TB.Create(nil);
end;

так как компонент TB - не мой, и не допускает ничего, кроме TWinControl


 
ЮЮ ©   (2003-12-05 06:50) [6]

constructor Create(AOwner: TComponent; BOwner: TWinControl);

constructor TA.Create((AOwner: TComponent; BOwner: TWinControl); begin
inherited Create(AOwner);
B := TB.Create(BOwner); //парентом (B) должен быть именно (C),
B.Parent := BOwner;
end;

procedure TC.FormCreate(Sender: TObject);
begin
A := TA.Create(Self, TWinControl(Self));
end;


 
icWasya ©   (2003-12-05 09:47) [7]

как раз для таких случаев придумано


TA = class(TComponent)
....
procedure Notification(AComponent: TComponent;
Operation: TOperation); override;

.....

constructor TA.Create(AOwner: TComponent);
begin
inherited;
B := TB.Create(AOwner); //парентом (B) должен быть именно (C),
FreeNotification(B);
end;

procedure TA.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (B <> nil) and
(AComponent = B) then B := nil;

end;


 
_none_ ©   (2003-12-05 15:54) [8]

to [ЮЮ] > я написал, что перепутал...

to [icWasya] > спасибо, попробую

to [Игорь Шевченко] > вот код (сократил по максимуму):


TButtonPanel = class(TControl) //компонент (A)
private
FButtons: array of TDIBImageEx; //компоненты (B)
public
procedure AddFromFile(__FileName: string);
procedure AddFromStorage(__FileName, __ElemName: string);
constructor Create(AOwner: TDIBContainer);
destructor Destroy; override;
end;

....

constructor TButtonPanel.Create(AOwner: TDIBContainer);
begin
inherited Create(AOwner);
end;

destructor TButtonPanel.Destroy;
var i: Integer;
begin
//вот здесь проблемы: если я убиваю ручками - все нормально, а если автоматически - то ошибка... а если убрать освобождение FButtons - объекты не будут удаляться ручками
for i := 0 to High(FButtons) do
begin
FButtons[i].Free;
end;
inherited;
end;

procedure TButtonPanel.AddFromFile(__FileName: string);
begin
SetLength(FButtons, Length(FButtons) + 1);
FButtons[High(FButtons)] := TDIBImageEx.Create(Owner);
with FButtons[High(FButtons)] do
begin
Parent := TWinControl(Owner);
FTexture := TTexture.Create;
Texture.AutoSize := True;
Texture.FileName := __FileName;
Width := Texture.Width;
Height := Texture.Height;
end;
end;




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

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

Наверх




Память: 0.49 MB
Время: 0.118 c
7-52423
sv_sergik
2003-10-11 14:48
2003.12.16
Как сделать что бы не было видно иконки моего приложения?


14-52365
Кен
2003-11-23 03:49
2003.12.16
Мониторы из воздуха Подробности


1-52224
DeScriptor
2003-12-05 01:55
2003.12.16
Выбор элемента ListBox и еще парочка


14-52393
delpher_gray
2003-11-19 21:06
2003.12.16
Как найти открытые диски в сети ?


1-52245
klyonov
2003-11-27 12:11
2003.12.16
ZIP, etc