定义一个窗口实例公用变量
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
fm2: TForm2;
//在这里定义implementation{$R *.dfm}end.
然后让其它的mdi窗口不自动创建。
注意Tform2是一个mdi子窗口。
这时在菜单里这样写
if fm2<>nil then
fm2:=Tform2.create(self);
fm2.show;
就可以了
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
fm2: TForm2;
//在这里定义implementation{$R *.dfm}end.
然后让其它的mdi窗口不自动创建。
注意Tform2是一个mdi子窗口。
这时在菜单里这样写
if fm2<>nil then
fm2:=Tform2.create(self);
fm2.show;
就可以了
fm2= nil then
fm2:=Tform2.create(self);fm2.show;
对不起
好像通不过
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;//在这里定义implementationvar
fm2: TForm2;//定义在这儿
{$R *.dfm}end.
TMainForm=class(TForm)
...
public
FSpecChild:TForm;
...
end;创建子窗体时:
if FSpecChild <> nil then
FSpecChild := TChildForm.Create(self);
...在ChildForm的OnClose事件中:
implementation
uses Main;//主窗体的单元.
...
TChildForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
MainForm.FSpecChild := nil;
end;
var
childform;tchildform;
begin
if not assign(childform) then
childform:=tchildform.create(self);
childform.show;
end;
在子窗体的onclose 事件里面写上:begin
action:=cafree;
end;
释放动作
TChildForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
end;
action:=cafree;
这样这个帖子就完成了
与此相似的是,在模式窗体被关闭时,都是被隐藏的。
1.先将MDIChild窗体设置成不自动建立
2.按纽事件
Tform2.create(self);
button1.enabled:=false;
3.MDIChild窗体的OnClose事件
action:=cafree;
form1.button1.enabled:=true;
4.OK!
TForm1=class(TForm)
...
public
FChild:TChildForm;
...
end;创建子窗体时:
if FChild <> nil then
FChild := TChildForm.Create(self);
...在ChildForm的OnClose事件中:
implementation
uses unit;//主窗体的单元.
...
TChildForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
MainForm.FChild := nil;
end;
1、问题很清楚了,就是怎样创建唯一的子窗体实例。在父窗体中声明一个TChildForm的变量是可以的,不过在子窗体中不也有childform:TChildForm;吗,这样:主窗体中implementation uses form2;在创建children的procedure中:if form2 = nil then form2:=Tform2.create(self);
在子窗体关闭事件处理中:action:=cafree;form2:= nil;这样可以实现了。
2、我对释放内存不太理解,为什么已经指明caFree了还要明确写出form2:= nil呢?C中不是这样的。空间释放了之后原先指向该空间的指针等于什么?(在没有赋nil前)
3、不知道创建form2后的show是否有必要?
4、当然 halo_hell(死亡阴影)的也很有意思。不过好像是曲线救国。
5、plainsong(轻风)说的'在MDIChild窗体的OnClose事件中,Action是不起作用的,无论你设置为什么,都和caFree是一样的。'我不明白。
var Action: TCloseAction);
begin
Action:=caFree;
frmChild1:=nil;
end;
frmMain中button Click
if not assigned (frmfrmChild1) then
frmChild1:=TfrmChild1.Create(nil);另外将子窗体从自动创建的窗体列表中移去。我的答案肯定是对的
TForm1=class(TForm)
...
public
FChild:TChildForm;
...
end;创建子窗体时:
if FChild <> nil then
FChild := TChildForm.Create(self);
...在ChildForm的OnClose事件中:
implementation
uses unit;//主窗体的单元.
...
TChildForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
MainForm.FChild := nil;
Action := CAFree;
end;
-------------嘻…,拿分-----------
例如可以在其他地方创建窗体(用另一个按钮Button2的OnClick):frmchild:=tfrmchild.create(self);
当用button2创建多个frmchild后,关闭其中的一个,再click上面说的button1,此时有了多个子窗体,但仍然会在生成一个frmchild,怎么办?