动态窗体创建后为什么会自动释放对象? ( 积分: 27 )

  • 主题发起人 主题发起人 rsjd
  • 开始时间 开始时间
R

rsjd

Unregistered / Unconfirmed
GUEST, unregistred user!
不好意思,只有这点分啦,我在主窗体中动态创建子窗体,主窗体上通过tmainmenu的菜单项来建立不同的子窗,子窗体显示在一个TPanel中(代码中的ContainerPanel),现在的问题是子窗体可以建立,但在show的过程中,会自动调用子窗体的onDeletion事件,结果把子窗体中Treeview中的Data全清掉啦,主窗体中的代码如下:
procedure TmainForm.N3Click(Sender: TObject);
begin
ShowForms(TchildForm1)
//TchildForm1是子窗体的type名
end;

procedure TmainForm.ShowForms(NewForm: TFormClass);
var NewDemo: TForm;
begin
if (ContainerPanel.ControlCount=0) or not (ContainerPanel.Controls[0] is NewForm) then
begin
if ContainerPanel.ControlCount &gt
0 then ContainerPanel.Controls[0].Free;
if Assigned(NewForm) then
begin
NewDemo := NewForm.Create(Self);
NewDemo.Hide;
//调试时发现每次运行到这里后,都要去调用子窗体中的TreeView1Deletion,害得我在子窗体中无法使用Node.Data,为什么?
NewDemo.BorderStyle := bsNone;
NewDemo.Parent := ContainerPanel;
NewDemo.Align := alClient;
NewDemo.Show;
end;
end;
end;
子窗体中有一个treeview1,写了一个OnDeletion事件:
procedure TchildForm1.TreeView1Deletion(Sender: TObject
Node: TTreeNode);
begin
Dispose(Node.Data);
end;
 
不好意思,只有这点分啦,我在主窗体中动态创建子窗体,主窗体上通过tmainmenu的菜单项来建立不同的子窗,子窗体显示在一个TPanel中(代码中的ContainerPanel),现在的问题是子窗体可以建立,但在show的过程中,会自动调用子窗体的onDeletion事件,结果把子窗体中Treeview中的Data全清掉啦,主窗体中的代码如下:
procedure TmainForm.N3Click(Sender: TObject);
begin
ShowForms(TchildForm1)
//TchildForm1是子窗体的type名
end;

procedure TmainForm.ShowForms(NewForm: TFormClass);
var NewDemo: TForm;
begin
if (ContainerPanel.ControlCount=0) or not (ContainerPanel.Controls[0] is NewForm) then
begin
if ContainerPanel.ControlCount &gt
0 then ContainerPanel.Controls[0].Free;
if Assigned(NewForm) then
begin
NewDemo := NewForm.Create(Self);
NewDemo.Hide;
//调试时发现每次运行到这里后,都要去调用子窗体中的TreeView1Deletion,害得我在子窗体中无法使用Node.Data,为什么?
NewDemo.BorderStyle := bsNone;
NewDemo.Parent := ContainerPanel;
NewDemo.Align := alClient;
NewDemo.Show;
end;
end;
end;
子窗体中有一个treeview1,写了一个OnDeletion事件:
procedure TchildForm1.TreeView1Deletion(Sender: TObject
Node: TTreeNode);
begin
Dispose(Node.Data);
end;
 
procedure TmainForm.ShowForms(NewForm: TFormClass);
var NewDemo: TForm;
begin
if (ContainerPanel.ControlCount=0) or not (ContainerPanel.Controls[0] is NewForm) then
begin
if ContainerPanel.ControlCount &gt
0 then ContainerPanel.Controls[0].Free;
if Assigned(NewForm) then
begin
NewDemo := NewForm.Create(Self);
NewDemo.Hide
{这里不用Hide,只要将窗口的Visible设置成false就可以了}
NewDemo.BorderStyle := bsNone;
NewDemo.Parent := ContainerPanel;
NewDemo.Align := alClient;
NewDemo.Show;
end;
end;
end;
 
NewDemo.Hide;这句我注释掉了,还是一样啊
 
NewDemo := NewForm.Create(Self);
---->>改成NewDemo := NewForm.Create(nil);
最后NewDemo.free
 
不行啊,还是运行完NewDemo := NewForm.Create(nil);这一句后,按F7调试就发现直接调用TreeView1Deletion事件处理,把Node.Data全部清空了。
以前这个子窗口本来是我单独做的,已经成功运行,现在准备把它合并到一块,发现就成了这个样子
 
procedure TCustomForm.Hide;
begin
Visible := False;
end;
//问题好象是这里,根据上下文 ContainerPanel.Controls[0]是一个NewForm类型的窗体
//如果Free Form的时候,释放form里面的东东是很正常的!
if ContainerPanel.ControlCount &gt
0 then ContainerPanel.Controls[0].Free;
//这里我想不明白 if Assigned(NewForm) then 是什么意思,如果 NewForm不存在,前面的检查怎么通过ContainerPanel.Controls[0] is NewForm?
 
这跟Delphi的初始化有关,你可以先不挂Deletion,而在窗体的FormShow事件中再动态挂上。
 
var NewDemo: TForm
//是这里的问题吧??
改成
var
NewDemo : TNewForm 试试....我想是这里的问题吧
 
再顶一次,是不是真的没办法了?我不想新开一个窗口啊
 
我说的方法不行吗?
 
dreamisx:你说的方法没试过,不过我也不想试,试想如果把一个CLASS里面的代码也分离出来,且不是代码太乱了?
我查了很多离线包的内容,没查到,我也很想搞清楚为什么Delphi会这样处理?create后马上清除
 
NewDemo := NewForm.Create(Self);
NewForm.treeview1.OnDeletion := nil
//将事件暂时屏闭掉
NewDemo.BorderStyle := bsNone;
NewDemo.Parent := ContainerPanel;
NewDemo.Align := alClient;
NewForm.treeview1.OnDeletion:=TreeView1Deletion
//再将事件关联上
NewDemo.Show;
 
后退
顶部