关于MDI的问题,很急,请大家帮帮忙(40分)

  • 主题发起人 主题发起人 fstao
  • 开始时间 开始时间
F

fstao

Unregistered / Unconfirmed
GUEST, unregistred user!
关于MDI的问题,假如Form1的FormStyle为“fsMDIForm”,Form2的FormStyle为“fsMDIChild”,而Form3为“fsMDIChild”,Form2和Form3的
属性WindowState都是为wsMaximized。
在Form1添加Button1和Button2,Button1的onClick和OnClose事件分别为:
procedure TForm1.Button1Click(Sender: TObject);
begin
if not assigned(form2) then
begin
form2 := TForm2.Create(Self);
form2.Show;
end;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=cafree;
form2:=Nil;
end;

Button2的其onClick和OnClose事件分别为:
procedure TForm1.Button2Click(Sender: TObject);
begin
if not assigned(form3) then
begin
form3 := TForm3.Create(Self);
form3.Show;
end;
end;

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=cafree;
form3:=Nil;
end;

运行时,按Form1的Button1,则运行Form2,按Button2时,则运行Form3。
但是我再按button1时,Form2不能显示在Form3前面,如果要显示Form2,只能关闭
Form3就可以显示form2了,但这样就比较麻烦了,有没有好了方法呢?我想这样:
如果按Button2时,则显示Form3,再按button1时,则显示Form2。如果再按Button2时,
则要显示form3,但不是生成一个Form3,而是要Form3显示在form2的前面,因为无论
按多少次Button2都只能生成一个Form3,没有另一个Form3,也就是不能有两个Form3
(我上面的程序就可以实现这一点)。同理按Button1也一样。请问如何修改代码?
 
这样写:

procedure TForm1.Button1Click(Sender: TObject);
begin
if not assigned(form2) then form2 := TForm2.Create(Self);
form2.Show;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if not assigned(form3) then form3 := TForm3.Create(Self);
form3.Show;
end

 
agree with DreanTiger
 
在form已经建立的情况下调用一下form.show方法就可以把窗口移到前面。
 
1.dreanTiger is right
2. showwindow(form?.handle,sw_restore)
 
多谢DreamTiger,我还想问题另一个有关MDI的问题:

假如有form1、form2、form3、form4和form5,form1作用是splash,也就是封面。
form2和form3的作用分别是
验证用户名和日期验证。Form4和Form5的FormStyle分别为fsMDIForm和
fsMDIChild。Form4是MainForm(即主程序),
我想这样,运行程序时先运行form1,完闭后运行Form2,验证用户名后,然后运行
Form3,验证日期后运行Form4,
然后运行Form5。
在form2添加一个Button2,在form2的Button2的OnClick事件为:
form3.show;

在form3添加一个Button3,在form3的Button3的OnClick事件为:
form4.show;

在Form4的Button4的onclick事件为:
if not assigned(Form5) then
Form5 := TForm5.Create(Self);
Form5.Show;

Form5的Onclose事件为:
Action:=cafree;
Form5:=Nil;

这样运行时,先出现form1,当出现form4,按Form4的Button4则出现错误:
‘Cannot create form.No MDI forms are currently active.’

请问如何解决,有没有另外的方法呢?有些人建议我把form2和form3也做成Splash,
但我不知如何做?我只解决Form1做成Splash,程序如下:
begin
form1 := Tform1.Create(Application);
form1.Show;
form1.Update;
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TForm4, Form4);
Application.CreateForm(TForm3, Form3);
form1.Hide;
form1.Free;
Application.Run;
end;
但form2和form3又如何做呢?但有一点,那就是form4和form5的FormStyle分别必需
是fsMDIForm和fsMDIChild。
 
你这样用Application.CreateForm会将Form2变成主窗口。
而且,按你的逻辑,
Form2 := TForm2.Create(Application);
应该是在Form1中调用的;

Form3 := TForm3.Create(Application);
应该是在Form2中调用的。

我觉得应该这样写:
begin
Form1 := TForm1.Create(Application);
Form1.Show;
Form1.Update;
Form2 := TForm2.Create(Application);
Form3 := TForm3.Create(Application);
Form1.Hide;
Form1.Free;//如果在Form1的OnClose中写了CaFree := true;这句就可以省了。

//在Form2的按钮事件做判断,如果符合条件,ModalResult := mrOK;
//否则ModalResult := mrCancel;
if(Form2.ShowModal = mrCancel) then
begin
Form2.Free;
Form3.Free;
Application.Terminate;
end;

Form2.Free;
//在Form3的按钮事件做判断,如果符合条件,ModalResult := mrOK;
//否则ModalResult := mrCancel;
if(Form3.ShowModal = mrCancel) then
begin
Form3.Free;
Application.Terminate;
end;

Application.CreateForm(TForm4, Form4);
Application.Run;
end;

 
DreamTiger,还是不行,你最好给我E_Mail一个Demos。
谁能给我一个成功的Demos,最好快一点,本人本月6号就要交货给用户,就差这一点
了。
 
好吧,可惜我没有分红,呵呵。
Demo已经给你寄出了。
 
多人接受答案了。
 
dreamtight,我也要那个Demo.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
716
import
I
后退
顶部