![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Parent и Owner [D7]
Ega23 © (2007-10-24 15:01:00)Это что же получается: я создал фрейм, Owner - nil, потом ему назначил в качестве Parent форму, потом эту форму убил. фрейм, получается, тоже погиб???
Leonid Troyanovsky (2007-10-24 15:49:00) [1]
> Palladin © (24.10.07 15:37) [10]
> ну так ты совершенно верно считал...
RTFM: Delphi help. TControl.Parent. Note
--
Regards, LVT.
Сергей М. (2007-10-24 15:49:00) [2]
> Ega23 © (24.10.07 15:44) [13]
Виноват-с)... Это меня заклинило на Parent Window
Palladin (2007-10-24 15:48:00) [3]нет... не подерутся... проверил... освобождается...
плохо...
Сергей М. (2007-10-24 15:46:00) [4]
> Leonid Troyanovsky © (24.10.07 15:41) [12]
Угу, вижу.
Ты был прав.
Ega23 (2007-10-24 15:44:00) [5]
> Интересно, на основании чего ты пришел к такому умозаключению
> ?
>
> Ты перекрывал деструктор фрейма или обрабатывал его OnDestroy
> и стал очевидцем вызова деструктора или возникновения события
> при "убийстве родителя" ?
>
unit uMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, uTreeViewFrame, uDBTreeViewFrame, StdCtrls, DB, ADODB;
type
TFMain = class(TForm)
btnDBTreeViewFrame: TButton;
btnConnect: TButton;
ADOConnMain: TADOConnection;
adsClasses: TADODataSet;
dsClasses: TDataSource;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure btnConnectClick(Sender: TObject);
procedure btnDBTreeViewFrameClick(Sender: TObject);
private
{ Private declarations }
public
DBTreeViewFrame : TDBTreeViewFrame;
end;
var
FMain: TFMain;
implementation
uses uModalForm;
{$R *.dfm}
//*****************************************************************************
procedure TFMain.FormCreate(Sender: TObject);
begin
DBTreeViewFrame := TDBTreeViewFrame.Create(nil);
end;
//*****************************************************************************
procedure TFMain.FormDestroy(Sender: TObject);
begin
TreeViewFrame.Free;
end;
//*****************************************************************************
procedure TFMain.btnConnectClick(Sender: TObject);
begin
ADOConnMain.Connected := True;
adsClasses.Open;
end;
//*****************************************************************************
procedure TFMain.btnDBTreeViewFrameClick(Sender: TObject);
begin
Application.CreateForm(TModalForm, ModalForm);
try
DBTreeViewFrame.DataSource := dsClasses;
ModalForm.InitFrame(DBTreeViewFrame);
ModalForm.ShowModal;
finally
DBTreeViewFrame.Parent := nil; // <-
ModalForm.Free;
end;
end;
//*****************************************************************************
end.
Если Parent фрейма не присвоить nil, то я попадаю на деструктор TDBTreeView, которой лежит на данном фрейме.
Leonid Troyanovsky (2007-10-24 15:41:00) [6]
> Сергей М. © (24.10.07 15:36) [9]
See Control.pas: destructor TWinControl.Destroy
--
Regards, LVT.
KSergey (2007-10-24 15:38:00) [7]Интересно: подерутся "голубые" или нет?
Palladin (2007-10-24 15:37:00) [8]
> Ega23 © (24.10.07 15:28) [7]
ну так ты совершенно верно считал...
Сергей М. (2007-10-24 15:36:00) [9]
> Ega23 © (24.10.07 15:28) [7]
Интересно, на основании чего ты пришел к такому умозаключению ?
Ты перекрывал деструктор фрейма или обрабатывал его OnDestroy и стал очевидцем вызова деструктора или возникновения события при "убийстве родителя" ?
Palladin (2007-10-24 15:33:00) [10]
> Leonid Troyanovsky © (24.10.07 15:11) [4]
Это обязанность Owner, обязанность Parent предоставить кусочек монитора (если он сам конечно имеет кусочек монитора), где контрол будет жить полноценной жизнью, а не таиться в черных темных пещерах оперативки...
Ega23 (2007-10-24 15:28:00) [11]
> т.е., если этого не хочешь,
> предварительно сделай ему Parent := nil
>
Ага, это я уже понял. Просто я всё жизнь считал, что если Owner=nil, то Parent в убийстве никакой роли не играет...
А оно вон оно как, оказывается...
Сергей М. (2007-10-24 15:26:00) [12]
> Leonid Troyanovsky © (24.10.07 15:11) [4]
> Конечно, это обязанность Parent.
Обязанность уничтожать фрейм как VCL-объект ?
Хм ..
Leonid Troyanovsky (2007-10-24 15:13:00) [13]т.е., если этого не хочешь,
предварительно сделай ему Parent := nil
--
Regards, LVT.
Leonid Troyanovsky (2007-10-24 15:11:00) [14]
> Ega23 © (24.10.07 15:01)
> ему назначил в качестве Parent форму, потом эту форму убил.
> фрейм, получается, тоже погиб???
Конечно, это обязанность Parent.
--
Regards, LVT.
Сергей М. (2007-10-24 15:09:00) [15]"Погиб" - это когда Owner <> nil и ты убил этого Owner'а.
А в сабже фрейм просто останется бесхозным, неприкаянным)
Palladin (2007-10-24 15:04:00) [16]нет... с чего бы...
Германн (2007-10-24 15:04:00) [17]
> фрейм, получается, тоже погиб???
С чего бы ему погибать?