Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.012 c
3-52077
GIL
2003-11-24 15:01
2003.12.16
много пользователей


1-52142
Mishenka
2003-12-03 20:50
2003.12.16
Запуск файла из проги???


11-52125
France
2003-04-04 13:47
2003.12.16
Как фон строк в KOLListView сделать


14-52399
Igor_thief
2003-11-19 18:18
2003.12.16
Plugins


1-52260
Zheks
2003-12-04 10:24
2003.12.16
Левоая консольная прога чарез CreateProcess




   Наверх