如何激活已打开的MDIForm,防止重复打开(50分)

  • 主题发起人 主题发起人 斗士
  • 开始时间 开始时间
结合主窗口的MDIChildCount和MDIChildren属性来一个遍历,根据子窗口的类名或窗口名
或窗口变量名等进行判断(具体用什么看你的实际情况了)。
 
if FindComponent('Sell_WPRK_frm')=nil then
begin
Sell_WPRK_frm:= TSell_WPRK_frm.Create(self);
Sell_WPRK_frm.WindowState:= wsMaximized;
end
else Sell_WPRK_frm.WindowState:= wsMaximized;

Sell_WPRK_frm是一个MDI子窗体名,
TSell_WPRK_frm是一个MDI子窗体类。
这样还有问题吗?
 
在MainForm的public中加入一窗体变量。
public
SubForm: TForm;
再在主调程序中加入:
with Form1 do
begin
if SubForm=nil then
SubForm := TEnerForm.Create(Self);
SubForm.BringToFront;
end;
在子窗体的Close事件中加入:
uses Form1;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
Form1.SubForm := nil;
end;


 
var iTemp:Integer;
bHasForm:Boolean;
begin
bHasForm:=False;
for iTemp:=0 to MDIChildCount-1 do
begin
if MDIChildren[iTemp].Name = 'youyformmname' then
begin
(MDIChildren[iTemp] as TForm).Show;
bHasForm:=True;
end;
end;
if bHasForm=False then with Tyourformnamem.Create(Application) do Show;
end;
 
要打开用以下代码(设此MDI子窗口为TFMcontact):
if FMcontact=nil then
begin
FMcontact:=tFMcontact.Create(application) ;
FMcontact.Caption:='XXX';
end
else
FMcontact.BringToFront;

在MDI子窗口关闭时用:
free;
FMcontact:=nil;
 
//打开MDIForm,或激活
Function TMain_Form.OpenMDIForm(FormName:String):Boolean;
var
i:integer;
begin
for i:=0 to Main_Form.MDIChildCount-1 do
if Main_Form.MDIChildren.Name=FormName then
Result:=True
else Result:=False;
end;
if OpenMDIForm(FormName) then
Main_Form.MDIChildren.Show
else
NewForm:=TMDIForm.Create(self);

以上函数可以执行,不知可行。
 
用这个函数创建MDIForm吧
procedure OpenForm(FormClass: TFormClass; var fm; AOwner:TComponent);
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
ShowWindow(Child.handle,SW_SHOWNORMAL)
else
ShowWindow(Child.handle,SW_SHOWNA);
if (not Child.Visible) then Child.Visible:=True;
Child.BringToFront;
Child.Setfocus;
TForm(fm):=Child;
exit;
end;
Child:=TForm(FormClass.NewInstance);
TForm(fm):=Child;
Child.Create(AOwner);
end;
 
TO: 程云

我使用您的方法,会出现如下问题:
我在Childform1最小化后,再去点击动态生成Childform1子窗口的菜单时,却无法把该
Childform1还原为最大化,这是为什么?
 
if varisnull(窗体名称)<>0 then
窗体名称 := T窗体类.Create(application);

窗体名称 .show;
showwindow();//重要:调用API函数,注意参数!!!!!!!!!!

在子窗体的Close事件中加入:
uses Form1;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
窗体名称 := nil;
end;
搞定!
 
这是从俺正在写的一个查询平台中考出来的一段代码,
我都懒着动了.

procedure CQShowDsEntprsForm(AParent: TWinControl);
var
F: TCQDsEntprsForm;
I: Integer;
begin
for I := 0 to Screen.FormCount - 1 do
begin
if (not (Screen.Forms is TCQDsEntprsForm)) then Continue;
F := (Screen.Forms as TCQDsEntprsForm);
F.BringToFront;
Exit;
end;
CQCreateMDIChildForm(Application, TCQDsEntprsForm, AParent, 1);
end;
 
****, 我收不到邮件了,只好一个一个点开看.
 
不可能的,
我这儿就是这样写的,完全可以的,

if FindComponent('Sell_WPRK_frm')=nil then
begin
Sell_WPRK_frm:= TSell_WPRK_frm.Create(self);
Sell_WPRK_frm.WindowState:= wsMaximized;
end
else Sell_WPRK_frm.WindowState:= wsMaximized;

当FindComponent反回为nil时表示没有被创建,即创建之,并最大化,
否则表示已被创建,只最大化即可。也就是"Sell_WPRK_frm.WindowState:= wsMaximized;"这部分。
 
解决的方法很多,以下也可以:
在主窗口中加入以下代码:
procedure TForm1.aaa1Click(Sender: TObject);
begin
if not Assigned(Form2) then//判断是否有Form2的实例
begin
Application.CreateForm(TForm2, Form2);
Form2.Show;
end else
Form2.BringToFront;
end;
在子窗口中加入以下代码:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
Form2 := nil;
end;
 
我用以下函数解决问题通过,谢谢各位
//打开MDIForm,或激活
Function TMain_Form.OpenMDIForm(FormName:String):Boolean;
var
i:integer;
ShowF:boolean;
begin
ShowF:=False;
for i:=0 to Main_Form.MDIChildCount-1 do
if Main_Form.MDIChildren.Name=FormName then
begin
Main_Form.MDIChildren.Show;
ShowF:=True;
break;
end
else ShowF:=False;
Result:=ShowF;
end;

procedure TMain_Form.Form1_MenuClick(Sender: TObject);
Var
NewForm:TForm1;
begin
if not OpenMDIForm('Form1name') then
begin
NewForm:=TForm1.Create(Self);
NewForm.Show;
end;
end;
 
多人接受答案了。
 
if not assigned(mdi_form_name) then
mdi_form_name:=Tmdi_form_name.create(application);
即可即可。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部