MDI子窗体问题!关于如何每一个子窗体只创建一次!! ( 积分: 20 )

  • 主题发起人 主题发起人 曾经
  • 开始时间 开始时间

曾经

Unregistered / Unconfirmed
GUEST, unregistred user!
如果用
procedure TMainForm.ToolButton9Click(Sender: TObject);
var
Form1:TForm1;
begin
Form1:=TFormdxfs.Create(Application);
form1.Show;
end;
每次都会创建一个子窗体

我现在用
procedure TMainForm.ToolButton9Click(Sender: TObject);
var
Form1:TForm1;
begin
if not Assigned(Form1) then
begin
Form1:=TForm1.Create(Application);
form1.Show;
end;
end;
Project 中我已经把Auto-create去掉
Form1 中 我这样写的:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
Form1:=nil;
end;


但我发现 if 中的代码并不执行
而是:
Assigned=True

不知道是什么原因!!!该如何解决
 
如果用
procedure TMainForm.ToolButton9Click(Sender: TObject);
var
Form1:TForm1;
begin
Form1:=TFormdxfs.Create(Application);
form1.Show;
end;
每次都会创建一个子窗体

我现在用
procedure TMainForm.ToolButton9Click(Sender: TObject);
var
Form1:TForm1;
begin
if not Assigned(Form1) then
begin
Form1:=TForm1.Create(Application);
form1.Show;
end;
end;
Project 中我已经把Auto-create去掉
Form1 中 我这样写的:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
Form1:=nil;
end;


但我发现 if 中的代码并不执行
而是:
Assigned=True

不知道是什么原因!!!该如何解决
 
procedure TMainForm.ToolButton9Click(Sender: TObject);
var
Form1:TForm1;
begin
//form1未赋值不代表=nil,而是指向任意地方
if not Assigned(Form1) then
begin
Form1:=TForm1.Create(Application);
form1.Show;
end;
end;
 
type
Myformclass=class of Tcustomform;
procedure ShowForm(const fmclass:myformclass);
var
fm:Tcustomform;
i:integer
begin

for I := 0 to Screen.FormCount-1 do
begin
if screen.forms.classtype=fmclass then
begin
fm:=screen.forms;
fm.show;
exit;
end;
end;
fm:=fmclass.create(application);
fm.show;
end;
 
procedure TMainForm.ToolButton9Click(Sender: TObject);
var
Form1:TForm1;
begin
Form1:=TFormdxfs.Create(Application);
form1.Show;
end;


show以后你并没有释放调,所以会出现多个实例,我不知道的Form1是存在什么地方的,我的建议是把Form1作为MainForm的成员

Mainform = class(TMainform)
……
public
Form1: TForm1;
……
end;

然后你在代码里面就可以判断了
begin
if Assinged(Form1) then Form1.Free;
Form1:=TFormdxfs.Create(Application);
form1.Show;
end;

但是这样有个问题就只能控制Form1,所以可以把Form1显示在某个容器里面,比如
Form1:=TFormdxfs.Create(Panel1);
Form1.Parent := Panel1;
等等,这样你就可以在Panel1里面去查它的Controls集合,看看里面有没有元素
 
同意zjjzl的,我也是这样来控制的
 
你的FORM1已经在UNIT中定义过了,即是全局的引用.

但在你在这个过程中是局部的.当然每次都要实例化一个了.

你应试去掉VAR FORM1:TFORM1;
引用USES ..
 
can kui can kui ,ying gai shi de
 
我想将你的

var
Form1:TForm1;

这个定义去掉就可以了!!!因为FORM1已经定义过了。
 
那就好,解决就可以了,分分吧[:D][:D][:D][:D]
 
后退
顶部