MDIForm的困惑!(100分)

  • 主题发起人 主题发起人 lhq_007
  • 开始时间 开始时间
L

lhq_007

Unregistered / Unconfirmed
GUEST, unregistred user!
最近我在做一个程序,遇到一个关于MDI窗口的问题:
有一个登录窗体(frm_Login),经过按扭调出MDI父窗口(frm_Main);
然后在frm_Main上有一个按扭生成一个子窗口,但是好像出问题了,我查
了以前的贴子,好像没有人回答这个问题,它弹出的错误提示是:
" Cannot Creat form,No MDI forms are currently active"
不知有何解决办法?
 
你的frm_Main是不是应用程序的主窗体?
 
你的登录窗体(frm_Login)是否设成MDIChild了?
 
MDI应用程序必须先生成MdiForm才能有MdiChild.
把你的登录窗体设为普通形式。
 
问题是你把登录窗体设成了主窗体。你可以改一下。让你的登录窗成不是主窗体。让你的
FRM-Main成主窗体就可以了。
 
to ysai:那当然不是啊!
to zw84611:frm_Login 并不是子窗口,frm_Login在调出frm_Main以后就hide了。
 
to _xiaofeng:不能把frm_Main设为主窗体啊,因为它是必须由frm_Login确认密码下确后才
弹出来的啊!
 
不妨把frm_Main作为主窗体。
 
---------------下面是我的一个程序的工程文件-----------------
Var
TApp:HWND;
Ret:Integer;
begin
Application.Initialize;
TApp:=CreateMutex(nil,False,'ABC');//创建互斥对象,使程序只运行一次。
Ret:=GetLastError;
If Ret<>ERROR_ALREADY_EXISTS then
begin
frmSFlash:= TfrmSFlash.Create(Application);//这是我的启动画面窗体。普通窗体。
frmSFlash.Show;
frmSFlash.Update;
Application.CreateForm(TfrmMain, frmMain);//窗建主窗体。也是MDIForm
Application.Run;
end
else
begin
//激活已经运行的程序。
TApp:= FindWindow(nil,'用户登录');
if TApp=0 then
TApp:= FindWindow('TfrmMain','业务管理系统');
BringWindowToTop(TApp)
end;
end.
 
在MDI 的 OnCreate 中弹出登录窗口,这样就比较简单。
 
你可以在工程里这样写。
frm_Login:=Tfrm_login.create(application);
frm_login.showmodal;
try
if 判断 then
创建主窗体
execpt
frm_login.free;
 
这个问题难道真的没有什么好办法了吗?
 
你要注意调整窗口建立的顺序(菜单project|option|forms),MDI必须比MDI Child先建立。
 
同意:kingdeezj
 
to sjzzhyong:
那我的登录窗体不是没有用了,frm_main是通过frm_login密码确认后才弹出来的,所以
frm_login是必须在frm_main之前生成的。
欢迎各位FW继续讨论!!!
 
//工程文件,不全
var
hMutex,hApp:HWND;
begin
Application.Initialize;
//建立互斥对象
hMutex:=CreateMutex(nil,False,PChar(SAppName));
If GetLastError=ERROR_ALREADY_EXISTS then
begin
//已经运行,找到句柄
hApp:=FindWindow('TApplication',PChar(SAppName));
//激活
if IsIconic(hApp) then
PostMessage(hApp,WM_SYSCOMMAND,SC_RESTORE,0);
SetForegroundWindow(hApp);
//释放互斥对象
ReleaseMutex(hMutex);
Application.Terminate;
exit;
end;
Application.HintPause := 500;
Application.HintHidePause := 10000;
Application.ShowMainForm := False;
Application.OnMessage := MDIMainForm.AppMessageHandler;
AddAboutMenu(application.Handle);
//{
LoadSetting;
//显示闪现窗体并检查密码
if not (ShowSplashForm and CheckPassWord) then
begin
ReleaseMutex(hMutex);
application.Terminate;
exit;
end;
//}
Application.CreateForm(TMDIMainForm, MDIMainForm);
Application.Run;
//释放互斥对象
ReleaseMutex(hMutex);
end.
//登录窗体
//------------------------------------------------------------------------------
//Login.pas,Login.dfm
//登录窗体
//------------------------------------------------------------------------------
unit LogIn;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, Forms,
Dialogs, ExtCtrls,Global, Child, StdCtrls,
Buttons, TFlatEditUnit, TFlatButtonUnit,MainDM;
type
TLogInForm = class(TChildForm)
bOK: TFlatButton;
bCancel: TFlatButton;
tUserName: TFlatEdit;
tPassWord: TFlatEdit;
labUserName: TLabel;
labPassWord: TLabel;
procedure bOKClick(Sender: TObject);
procedure bCancelClick(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormClose(Sender: TObject;
var Action: TCloseAction);
private
{ Private declarations }
public
CheckOK:boolean;
{ Public declarations }
end;

function CheckPassWord(UserName:string=''):boolean;
implementation
uses MDIMain;
{$R *.dfm}
const
CM_MSG_CLOSE = WM_USER+402;
function CheckPassWord(UserName:string=''):boolean;
//检查密码函数,建立LogIn窗体
var
Handled : Boolean;
Msg : TMsg;
CanExit : Boolean;
begin
Application.Title:=SAppName;
with TLogInForm.Create(Application) do
begin
if length(UserName)>0 then
begin
Caption:=SCheckPassWord;
tUserName.Text:=UserName;
tUserName.Enabled:=false;
end;
Show;
CanExit:=False;
//{
while not CanExit do
if PeekMessage(Msg,0,0,0,PM_REMOVE) then
if (Msg.message = CM_MSG_CLOSE) then
CanExit:=True
else
begin
Handled := False;
if Assigned(Application.OnMessage) then
Application.OnMessage(Msg,Handled);
TranslateMessage(Msg);
DispatchMessage(Msg);
end
else
WaitMessage;
//}
result:=CheckOK;
end;
end;

procedure TLogInForm.bOKClick(Sender: TObject);
//确认密码
begin
inherited;
if length(tusername.text)>0 then
begin
if MainDMForm.ADSUser.Locate(sfield_username,tusername.Text,[]) then
begin
if MainDMForm.ADSUser[SField_PassWord]=tpassword.Text then
begin
sUserName:=MainDMForm.ADSUser[SField_UserName];
iUserGrade:=MainDMForm.ADSUser[SField_UserGrade];
CheckOK:=true;
close;
end else
begin
msgbox(sepassword,caption,mb_iconstop);
tpassword.SetFocus;
end;
end else
begin
msgbox(format(seusername,[tusername.text]),caption,mb_iconstop);
tusername.SetFocus;
end;
end else
begin
sUserName:=SNoUserName;
iUserGrade:=4;
CheckOK:=true;
Close;
end;
end;

procedure TLogInForm.bCancelClick(Sender: TObject);
//退出
begin
inherited;
CheckOK:=false;
Close;
end;

procedure TLogInForm.FormActivate(Sender: TObject);
//如果保存了用户名,则使用
begin
inherited;
if bSaveUserName and (length(susername)>0) then
begin
tUsername.Text:=susername;
tPassword.SetFocus;
end;
end;

procedure TLogInForm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
inherited;
PostMessage(Handle,CM_MSG_CLOSE,0,0);
end;

end.
 
>to sjzzhyong:
> 那我的登录窗体不是没有用了,frm_main是通过frm_login密码确认后才弹出来的,所以
>frm_login是必须在frm_main之前生成的。
> 欢迎各位FW继续讨论!!!
procedure tfrm_main_oncreate(sender:tobject);
begin
frm_login:=tfrm_login.create(self);
//frm_login先于frm_main显示出来
frm_login.show;
.........
end;

frm_login验证失败时application.halt即可结束程序
 
Var
TApp:HWND;
Ret:Integer;
begin
Application.Initialize;
TApp:=CreateMutex(nil,False,'ABC');//创建互斥对象,使程序只运行一次。
Ret:=GetLastError;
If Ret<>ERROR_ALREADY_EXISTS then
begin
//主窗体必须首先创建
Application.CreateForm(TfrmMain, frmMain);//窗建主窗体。也是MDIForm
Application.CreateForm(TfrmSplash,frmSplash);
Application.CreateForm(Tfrm_login, frm_logion);
frmSFlash.ShowModal;
//强制显示启动画面
frmSFlash.Update;
frmSplash.Hide;
frmSplash.Free;
frmSplash:=nil;
try
if frm_login.ShowModal=mrCancle then
;
//强制显示登录窗体
begin
frmMain.Free;
Application.Terminate ;
end
else
begin
//可以开始系统初始化
end;
finally
frm_login.free;
frm_login:=nil;
end;

Application.Run;
end
else
begin
//激活已经运行的程序。
TApp:= FindWindow(nil,'用户登录');
if TApp=0 then
TApp:= FindWindow('TfrmMain','业务管理系统');
BringWindowToTop(TApp)
end;
end.

将你的密码验证等代码可以放入登录单元内完成,登录不成功可直接 application.terminate;
 
对,我也碰到了类似的问题。应该怎么办啊?
 
后退
顶部