请教如何请改这个不行创建MDI子窗体的错误(45分)

  • 主题发起人 主题发起人 topdelphi
  • 开始时间 开始时间
T

topdelphi

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序有三个窗体,其中设置开始启动的是一个验证用户的普通窗体,
验证完用户窗体之后,出现的是一个MDI父窗体,在父窗体里面再打开一个MDI子窗体,
就是这时程序就出错了,显示不了子窗体,出现了下面的错误,请教如何修改这个错误,
project1.exe raised exception class einvalidoperation with message
'cannot create form no mdi forms are currently activel.'

下面分别是我这三个窗体的代码
//普通窗体
procedure Tfrmlogin.cmdokClick(Sender: TObject);
begin
frmmdiform.show;
frmlogin.hide;
end;

//MDI父窗体
procedure Tfrmmain.N2Click(Sender: TObject);
begin
frmuser.open(tfrmuser,frmuser,self);
end;

//MDI子窗体
public
{ Public declarations }
procedure open(formclass:tformclass;var fm;aowner:tcomponent);

var
frmuser: Tfrmuser;
implementation
{$R *.dfm}

procedure tfrmuser.open(formclass:tformclass;var fm;aowner:tcomponent) ;
var
i:integer;
child:tform;
begin
for i:=0 to screen.FormCount -1 do
//找到和FORMCLASS参数相同的窗体,即子窗体已经存在

if screen.Forms.ClassType =formclass then
begin
child:=screen.Forms;
showmessage('你已经打开这个窗体了');
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:=tfrmuser(formclass.NewInstance );
tform(fm):=child;
child.Create(aowner);
end;
procedure Tfrmuser.FormClose(Sender: TObject; var Action: TCloseAction);
begin
action:=cafree;
end;
 
说你的mainform不是fsMDIForm阿,修改mainform的formstytle :=fsMDIForm
 
我的FRMLOGIN是普通窗体,FRMMAIN是MDI父窗体,FRMUSER是子窗体,这个formstytle属性
我早就设置这两个MDI窗体了,请你试试我这个功能吧,结果还是一样的,请教如何修改啊.
 
你的工程文件里第一个创建的窗体才是主窗体阿,自己看看,可能是frmlogin是主窗体。
修改一下就好了
 
我的FRMLOGIN的formstytle属性为fsNormal,FRMMAIN的formstytle属性为fsMDIForm
FRMUSER的formstytle属性为fsMDIChild,我的程序开始启动的是FRMLOGIN的,
如果改成FRMMAIN启动就没有这个问题,可以打开MDI子窗体,但是我必须做这个用户
验证的窗体啊,
如果将FRMLOGIN的formstytle属性改为fsMDIForm,结果是有两个MDI父窗体,而且错误
还是一样啊,请麻烦再指教.
 
运行的时候再创建阿
 
chenxz先生我的分全比你了,我还是不明白,
请你比个详细的例子我吧,真的好急的,可以修改我上面
的代码做个例子比我吗,在此再次感谢你的回答.
 
在MDI父窗口的OnCreate中建立Login窗体,登录成功后再Show自己
在工程文件中加一句
Application.ShowMainForm:=False;
 
问题不在你上面的代码,要修改工程文件(.dpr),给你一个例子,修改一下就可以了。

program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {mainmdiForm},
Unit2 in 'Unit2.pas' {logForm},
Unit3 in 'Unit3.pas' {childForm};

{$R *.res}

begin
Application.Initialize;
Application.ShowMainForm := false; //不显示主窗体
Application.CreateForm(TmainmdiForm, mainmdiForm); //创建主窗体
LogForm := TLogForm.Create(nil); //创建登录窗体
LogForm.ShowModal; //显示登录窗体
LogForm.Hide; //隐含
LogForm.Free; //释放
Application.ShowMainForm := true; //显示主窗体
Application.CreateForm(TchildForm, childForm); //创建子mdi,可以根据需要创建
Application.Run; //运行
end.
 
后退
顶部