程序流程:当datamodule中的adoconnection连接数据库成功时->创建登陆窗体,然后登陆成功时->创建主窗体:然后在主窗体中调用MDIchild窗体,此时会出现错误
(cannot creat form. No MDI forms are currently active)
我查一些资料,听说是delphi程序会把第一个创建的窗体设置为主窗体,不知道各位达人有什么好方法没???
==================
程序代码:
program DesSys;
uses
Forms,
UnMain in 'UnMain.pas' {frMain},
UnMingxi in 'UnMingxi.pas' {frMingxi},
UnAbout in 'UnAbout.pas' {frAbout},
UnZuli in 'UnZuli.pas' {frZuli},
Unlogin in 'Unlogin.pas' {frLogin},
UnData in 'UnData.pas' {DataModule1: TDataModule},
UnPublicInfo in '..\public\UnPublicInfo.pas';{$R *.res}
begin
Application.Initialize;
Application.Title := 'SYS';
Application.CreateForm(TDataModule1, DataModule1);
Application.Run;
end.
============================================================procedure TDataModule1.DataModuleCreate(Sender: TObject);
var
sConnect:string;
begin
sConnect:='Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;';
sConnect:=sConnect+'Initial Catalog=mould;Data Source=E-MOD010';
try
ADOConnection1.ConnectionString:=sConnect;
ADOConnection1.Connected:=true;
adoconnection1.KeepConnection:=true;
adoconnection1.LoginPrompt:=false;
Application.CreateForm(TfrLogin, frLogin);
except
Application.MessageBox('数据库连接失败!!!','设计课系统',mb_OK+mb_IconStop);
end;
end;
========================procedure TfrLogin.btnLoginClick(Sender: TObject);
begin
if checkLogin() then
begin
edtPwd.Clear; //密码文本框清空
Application.CreateForm(TfrMain, frMain); //创建主窗体
frMain.Show;
frLogin.Hide;
end;
end;
(cannot creat form. No MDI forms are currently active)
我查一些资料,听说是delphi程序会把第一个创建的窗体设置为主窗体,不知道各位达人有什么好方法没???
==================
程序代码:
program DesSys;
uses
Forms,
UnMain in 'UnMain.pas' {frMain},
UnMingxi in 'UnMingxi.pas' {frMingxi},
UnAbout in 'UnAbout.pas' {frAbout},
UnZuli in 'UnZuli.pas' {frZuli},
Unlogin in 'Unlogin.pas' {frLogin},
UnData in 'UnData.pas' {DataModule1: TDataModule},
UnPublicInfo in '..\public\UnPublicInfo.pas';{$R *.res}
begin
Application.Initialize;
Application.Title := 'SYS';
Application.CreateForm(TDataModule1, DataModule1);
Application.Run;
end.
============================================================procedure TDataModule1.DataModuleCreate(Sender: TObject);
var
sConnect:string;
begin
sConnect:='Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;';
sConnect:=sConnect+'Initial Catalog=mould;Data Source=E-MOD010';
try
ADOConnection1.ConnectionString:=sConnect;
ADOConnection1.Connected:=true;
adoconnection1.KeepConnection:=true;
adoconnection1.LoginPrompt:=false;
Application.CreateForm(TfrLogin, frLogin);
except
Application.MessageBox('数据库连接失败!!!','设计课系统',mb_OK+mb_IconStop);
end;
end;
========================procedure TfrLogin.btnLoginClick(Sender: TObject);
begin
if checkLogin() then
begin
edtPwd.Clear; //密码文本框清空
Application.CreateForm(TfrMain, frMain); //创建主窗体
frMain.Show;
frLogin.Hide;
end;
end;
Application.CreateForm(TfrLogin, frLogin);改成
frLogin := TfrLogin.Create(Application);
frLogin.Show;
我用你的方法试了不行 (login 窗台一闪就消失了)
====
我在云看来的程序中加 showmessage(application.mainform.caption) 才知道原来系统把login窗体作为主窗体了,难怪会有错误
高手们宽开帮忙啊!!!
Application.CreateForm(TfrLogin, frLogin);改成
frLogin := TfrLogin.Create(Application);
frLogin.ShowModal;
就可以了,
但创建顺序还是先创建主窗体,然后在创建登陆窗体,只不过显示顺序可以控制,LZ不防试下
//这里改:
frLogin := TfrLogin.Create(Application);
if frLogin.ShowModal = mrOK then
Application.CreateForm(TfrMain, frMain);
else Exit;另:
procedure TfrLogin.btnLoginClick(Sender: TObject);
begin
if checkLogin() then
begin
edtPwd.Clear; //密码文本框清空
ModalResult := mrOK;
frLogin.Hide;
end;
end;
(当登录系统成功时是没有问题,但当登录失败返回一个错误提示时窗体就关闭了,而不能继续输入正确信息) 而且关闭mainform时,会出现错误。
=================
这样比较麻烦的话 能给一个别的登录方法也好啊
然后再frLogin := TfrLogin.Create(Application).....
最后进行判断。你理清一下自己的逻辑吧。
unit Unit2;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TFrm_Login = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Frm_Login: TFrm_Login;implementation{$R *.dfm}
var
LoginCount : integer;procedure TFrm_Login.Button1Click(Sender: TObject);
begin
if Edit1.Text <> '合法身份' then
begin
Inc(LoginCount);
if LoginCount > 2 then self.ModalResult := mrCancel;
Edit1.Clear;
Edit1.SetFocus;
end
else
self.ModalResult := mrOK;
end;end.
//主窗体单元
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;type
TFrm_Main = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;var
Frm_Main: TFrm_Main;implementation{$R *.dfm}end.
////工程单元
program Project1;uses
Forms, windows, Controls,
Unit1 in 'Unit1.pas' {Frm_Main},
Unit2 in 'Unit2.pas' {Frm_Login};{$R *.res}begin
Application.Initialize;
Frm_Login := TFrm_Login.Create(application);
try
Frm_Login.ShowModal;
if Frm_Login.ModalResult = mrOK then
Application.CreateForm(TFrm_Main, Frm_Main);
finally
Frm_Login.Free;
end;
Application.Run;
end.
"先创建你所期望的主窗体, 然后显示不显示随你便, 然后再创建登录窗体"
请问怎样不显示主窗体???
=================================
lihuasoft(坐井观天) ( ) 信誉:100
用你你的方法,发现还是登录一次不成功程序就关闭了,而不是你代码想表示的三次
以下代码中,Form2是子窗体,Form1是主窗体,登陆后隐藏主窗体。
Form2 :=TForm2.Create(Application);
Form2.Show;
Form1.Hide;在初始化部分中可以省去Form2的创建:
////工程单元
program Project1;
uses
Forms, windows, Controls,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
//Application.CreateForm(TForm2, Form2);
Application.Run;
end.
虽然好几年没碰delphi了, 但是这个功能我还是记得的.
Forms,
login in 'login.pas' {Flogin},
main in 'main.pas' {Fmain},
xueji in 'xueji.pas' {Fxueji},
dm in 'dm.pas' {Fdm: TDataModule},
chaxun in 'chaxun.pas' {Fchaxun},
xjxg in 'xjxg.pas' {Fxjxg},
xjzj in 'xjzj.pas' {Fxjzj},
yearmonth in 'yearmonth.pas' {Fyearmonth},
PublicProcedure in 'PublicProcedure.pas',
setzhuanye in 'setzhuanye.pas' {Fsetzhuanye},
setclass in 'setclass.pas' {Fsetclass},
rili in 'rili.pas' {Frili},
weiji in 'weiji.pas' {Fweiji},
liangcao in 'liangcao.pas' {Fliangcao},
bedroom in 'bedroom.pas' {Fbedroom},
fanxiao in 'fanxiao.pas' {FFanxiao},
plxg in 'plxg.pas' {Fplxg},
plzj in 'plzj.pas' {Fplzj},
bed in 'bed.pas' {Fbed},
dormitory in 'dormitory.pas' {Fdormitory},
inroom in 'inroom.pas' {Finroom};{$R *.res}begin
Application.Initialize;
Flogin:=TFlogin.Create(application);
flogin.ShowModal;
flogin.Update;
if not flogin.ok then
application.Terminate
else begin
Application.Title := '于2006年9月设计';
Application.CreateForm(TFmain, Fmain);
Application.CreateForm(TFdm, Fdm);
Application.CreateForm(TFlogin, Flogin);
Application.CreateForm(TFinroom, Finroom);
Application.Run;
end;
end.login.pas单元
unit login;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, bsSkinBoxCtrls, bsSkinCtrls, bsSkinData,
BusinessSkinForm, DB, DBTables, bsMessages,Inifiles;type
TFlogin = class(TForm)
bsSkinButton1: TbsSkinButton;
bsSkinButton2: TbsSkinButton;
bsSkinLabel1: TbsSkinLabel;
bsSkinLabel2: TbsSkinLabel;
bsSkinPasswordEdit1: TbsSkinPasswordEdit;
bsSkinComboBox1: TbsSkinComboBox;
bsSkinData1: TbsSkinData;
bsCompressedStoredSkin1: TbsCompressedStoredSkin;
bsBusinessSkinForm1: TbsBusinessSkinForm;
Table1: TTable;
bsSkinMessage1: TbsSkinMessage;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure bsSkinButton1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure bsSkinButton2Click(Sender: TObject);
procedure bsSkinPasswordEdit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
public
{ Public declarations }
ok:boolean;
cuser:string;
end;var
Flogin: TFlogin;implementation{$R *.dfm}
uses
dm;
procedure TFlogin.FormCreate(Sender: TObject);
begin
ok:=false;
end;procedure TFlogin.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if not ok then
application.Terminate;
end;procedure TFlogin.bsSkinButton1Click(Sender: TObject);
var
myini:Tinifile;
begin
table1.Open;
if table1.Locate('user',self.bsSkinComboBox1.Text,[]) then
begin
if self.Table1.FieldValues['Pasword']=self.bsSkinPasswordEdit1.Text then
begin
ok:=true;
cuser:=self.bsSkinComboBox1.Text;
myini:=tinifile.Create(extractfilepath(paramstr(0))+'init.ini');
myini.WriteString('当前登陆用户','cuser',cuser);
self.Close;
end else
self.bsSkinMessage1.MessageDlg('密码错误!',mtWarning,[mbok],0);
end else
begin
self.bsSkinMessage1.MessageDlg('非法用户!',mtWarning,[mbok],0);
end;
end;procedure TFlogin.FormShow(Sender: TObject);
var
i:integer;
begin
self.Table1.Open;
self.Table1.First;
self.bsSkinComboBox1.Items.Clear;
for i:=0 to table1.RecordCount-1 do
begin
self.bsSkinComboBox1.Items.Add(self.Table1.FieldValues['User']);
self.Table1.Next;
end;
self.bsSkinComboBox1.ItemIndex:=0;
self.Table1.Close;
self.bsskinpasswordedit1.SetFocus;
end;procedure TFlogin.bsSkinButton2Click(Sender: TObject);
begin
self.close;
end;procedure TFlogin.bsSkinPasswordEdit1KeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
if key=13 then
self.bsSkinButton1Click(self);
end;end.