关于MID窗体中子窗体重复的问题(100分)

  • 主题发起人 anddyluo
  • 开始时间
A

anddyluo

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样才能控制在MID窗体中,子窗只打开一次??
 
if not assignde(form2) then form2 := TForm2.Create(self)
 

procedure OpenForm(FormClass: TFormClass; var AForm;
AOwner:TComponent=nil);
//根据窗口类名建立窗口,如果窗口存在则只激活它
var
i: integer;
Child:TForm;
begin
for i := 0 to Screen.FormCount -1 do
if Screen.Forms.ClassType=FormClass then
begin
Child:=Screen.Forms;
if Child.WindowState=wsMinimized then
Child.WindowState:=wsNormal;
Child.BringToFront;
Child.Setfocus;
TForm(AForm):=Child;
exit;
end;
Child:=TForm(FormClass.NewInstance);
TForm(AForm):=Child;
if not assigned(aowner) then aowner:=application;
Child.Create(AOwner);
end;

function ActiveForm(FormTitle:string):boolean;
//根据窗口标题激活窗口,如果窗口不存在则返回假
var
i:integer;
Child:TForm;
begin
Result:=False;
for i:=0 to screen.FormCount-1 do
begin
Child:=Screen.Forms;
if Child.caption=formtitle then
begin
Child:=Screen.Forms;
if Child.WindowState=wsminimized then
Child.WindowState:=wsnormal;
Child.BringToFront;
Child.SetFocus;
Result:=true;
end;
end;
end;
 
可以用Findwindow这个函数
 
agree with zw84611
 
以上方法都试过,但都不行。
 
MDI(FormMDI)关闭时:
//即OnClose中,不可乱写呀
Action := caFree;
//不可少,与Assigned函数有关。
FormMDI := nil;

MDI(FormMDI)创建时:
if not Assigned(FormMDI) then
Application.CreateForm(TFormMDI, FormMDI);
FormMDI.Show;
以上代码本人在项目中应用,没有问题。
 
扫描一边他所有的子窗体,看有没有子窗体类名和你准备打开的类名是一样的,是则显示,不是则创建
具体该用那些函数你去看看关于MDI一些东西吧
 
Application.CreateForm(TForm1, Form1);
Form1.show;
这样调用的话,如果Form1已经创建了,就不会创建第二次了,只是显示而已。
 
同意YFeral的做法。没问题。
 
在此的各位如果没有实践过的话最好不要发言,免得误人歧途!
 
so easy!
MDI创建时:
Application.CreateForm(TForm1, Form1);
menuItem_From1.Enable:=false;
MDI(FormMDI)关闭时:
//即OnClose中,不可乱写呀
Action := caFree;
menuItem_From1.Enable:=true;

 
创建字窗体时:
procedure TMainForm.MjianyanClick(Sender: TObject);
begin
if not assigned(fjianyanjg) then
fjianyanjg:=tfjianyanjg.Create(application);
fjianyanjg.Show;
end;
关闭字窗体时:(fjianyanjg为MDI子窗体)
procedure TFjianyanjg.FormClose(Sender: TObject; var Action: TCloseAction);
begin
action:=cafree;
end;
procedure TFjianyanjg.FormDestroy(Sender: TObject);
begin
fjianyanjg:=nil;
end;
给分.
 
以上方法都试过,还是不行。
我的程序:
1、调用子窗体:
procedure Tmainform.tzsrmenuClick(Sender: TObject);
var
tzsrfm : Ttzsrform;
begin
tzsrfm := Ttzsrform.create(application);
end;
2、关闭子窗体:
procedure Ttzsrform.ToolButton8Click(Sender: TObject);
begin
close;
end;
procedure Ttzsrform.FormClose(Sender: TObject; var Action: TCloseAction);
begin
action := cafree;
end;
 
用我的方法,调用窗体要用
OpenForm(Ttzsrform,tzsrfm,self);
 
我没有MDI模式开发。
我一般都用ShowModule。很好用的。
 
to anddyluo,
以上方法都试过,还是不行。
-------------------------------------------以下是对你程序的修改。
你没有试过YFeral的方法吧?要不怎么不行。不能只问问题不动手啊?
我的程序:
1、调用子窗体:
procedure Tmainform.tzsrmenuClick(Sender: TObject);
var
tzsrfm : Ttzsrform;
begin
if not Assigned(tzsrfm) then
tzsrfm := Ttzsrform.create(application);
tzsrfm.Show;
end;
2、关闭子窗体:
procedure Ttzsrform.ToolButton8Click(Sender: TObject);
begin
close;
end;
procedure Ttzsrform.FormClose(Sender: TObject; var Action: TCloseAction);
begin
action := cafree;
tzsrfm := nil;
end
 
to anddyluo:
伙计我怎么写的,你怎么写的?就你那写法行才怪呢!
仔细看看我的见解,动动脑子别只知道问别人。你要知道自己也是一个程序员!
 
to kingdeezj
唉, 兄弟,你动动脑子啊. 难怪YFeral 兄(姊) 急
我帮你写一下吧.

procedure Tmainform.tzsrmenuClick(Sender: TObject);
var
tzsrfm : Ttzsrform;
begin
if not Assigned(tzsrfm) then
tzsrfm := Ttzsrform.create(application);
tzsrfm.Show;
end;
2、关闭子窗体:
procedure Ttzsrform.ToolButton8Click(Sender: TObject);
begin
tzsrfm.release
tzsrfm := nil;
end;
procedure Ttzsrform.FormClose(Sender: TObject; var Action: TCloseAction);
begin
action := cafree;
end
 
嘿嘿,看看俺的笨办法,
几个窗口就建几个全局变量,赋值为0。
每个子窗体对应一个,打开就赋值为1,关闭就赋值为0。
打开时检测到变量为1了,就说明已经打开一个了。所以不打第二个了。
明白否。。。
 
顶部