Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.12.16;
Скачать: [xml.tar.bz2];

Вниз

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

 
_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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.009 c
1-52244
Не знающий
2003-12-04 14:19
2003.12.16
Как скопировать файл?


1-52202
DVP777
2003-12-05 11:24
2003.12.16
Автоповтор в проигрывания в MediaPlayer? - ну, забыл ей-богу!


1-52271
Альф
2003-12-03 17:14
2003.12.16
Странное поведение TabControl


1-52195
MakNik
2003-12-05 12:37
2003.12.16
DateTimePicker


14-52408
Dimman1
2003-11-17 20:23
2003.12.16
Какой выбрать монитор





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский