是不是在主窗体的FormCreate事件中动态创建Login登录窗口?

yown 2003-09-13 10:48:06
请各位帮忙!!
我想做一个登录界面,Form1为主窗体,login为登录窗体,我是不是在主窗体的FormCreate事件中动态创建Login登录窗口? 用ShowModal显示它,成功登录后,不能关闭登录窗口!
请帮忙较正!!!! 或请另给方法!!
...全文
106 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
dawnming 2003-09-15
  • 打赏
  • 举报
回复
up
ysycrazy 2003-09-15
  • 打赏
  • 举报
回复
program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};

{$R *.RES}

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Form2:=TForm2.create(Application);
try
if Form2.ShowModal = 1 then // form2为登陆窗口
begin
Application.Run;
end
else
Application.Terminate;
finally
Form2.free;
end;
end.
popmailzjw 2003-09-15
  • 打赏
  • 举报
回复
study
yown 2003-09-15
  • 打赏
  • 举报
回复
谢了.
FrameSniper 2003-09-13
  • 打赏
  • 举报
回复
比较常规的做法应该是在工程文件中直接添加,好象Splash窗口那样!

首先在工程文件中如下编写

....
var
vError:String;
vIsExit:Boolean;
....
//登录验证
vErrorStr:=LoginFrm.CheckUserLogin(vIsExit); //假设登陆窗体单元为LoginFrm,并且在登陆窗体单元中定义一个例程CheckUserLogin方法
if vErrorStr<>'' then //vErrorStr为空表明调用登陆窗体成功!
begin
Application.MessageBox(PChar(vErrorStr),'错误',$00000010 + $00000000);
Application.Terminate ;
end;
if vIsExit then //vIsExit为True表示用户关闭了登陆窗体
Application.Terminate
else
begin
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end;
....

在登陆窗体单元中定义的CheckUserLogin例程:

function CheckUserLogin(var oIsExit:Boolean):String; //带一变参
var
vErrStr:String;
begin
vErrStr:='';
oIsExit:=False;
try
with TLoginForm.Create(Application) do
try
if IsAbortResult(ShowModal) then //判断关闭方式
oIsExit:=True;
finally
Free;
end;
except
vErrStr:='调用身份验证错误.';
end;
Result:=vErrStr;
end;

------------------------------------------------------------------------
这种使用前后台函数的方法的唯一好处就是功能划分严格!

FrameSniper 2003-09-13
  • 打赏
  • 举报
回复
工程文件代码:

program Project1;

uses
Forms,
MainFrm in 'MainFrm.pas' {MainForm},
LoginFrm in '..\LoginFrm.pas' {LoginForm},

{$R *.res}

var
vErrorStr:String;
vIsExit:Boolean;

begin
Application.Initialize;
//登录验证
vErrorStr:=LoginFrm.CheckUserLogin(vIsExit);
if vErrorStr<>'' then
begin
Application.MessageBox(PChar(vErrorStr),'错误',$00000010 + $00000000);
Application.Terminate ;
end;
if vIsExit then
Application.Terminate
else
begin
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end;
end.

----------------------------------------------------------------------

登陆窗体单元文件代码:

unit LoginFrm;

interface

uses
....

type
TLoginForm = class(TForm)
Image1: TImage;
Label1: TLabel;
Label2: TLabel;
Bevel1: TBevel;
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Button2: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

function CheckUserLogin(var oIsExit:Boolean):String;

var
LoginForm: TLoginForm;

implementation

{$R *.dfm}

function CheckUserLogin(var oIsExit:Boolean):String;
var
vErrStr:String;
begin
vErrStr:='';
oIsExit:=False;
try
with TLoginForm.Create(Application) do
try
if IsAbortResult(ShowModal) then
oIsExit:=True;
finally
Free;
end;
except
vErrStr:='调用登陆窗体错误.';
end;
Result:=vErrStr;
end;

procedure TLoginForm.Button1Click(Sender: TObject);
begin
ModalResult:=mrOk;
end;

end.

--------------------------------------------------------------------

最后将LoginForm从你的自创建列表中去掉!
yown 2003-09-13
  • 打赏
  • 举报
回复
FrameSniper老兄,按你的改了,还是不行,请烦劳给我一个完整的例子吧!!
感激不尽!!
FrameSniper 2003-09-13
  • 打赏
  • 举报
回复
vErrorStr:=Form7.CheckUserLogin(vIsExit);

改成

vErrorStr:=Login.CheckUserLogin(vIsExit); //既然我说了这个函数是个例程,所以它不属于任何类,而你这里却用类限定它,肯定是要出错的。我的源程序可不是用类限定的,而是用单元文件名来限定的哦!呵呵.........
FrameSniper 2003-09-13
  • 打赏
  • 举报
回复
我说了,函数CheckUserLogin不是登陆窗体类的方法,你没有看我的登陆窗体单元的申明吗?那是个单独的函数!
yown 2003-09-13
  • 打赏
  • 举报
回复
我是按照你的要求做的,但在编译时有问题:请你查错:问题标记////////////
program HKSJ_SMS;
uses Forms,
terminater in 'terminater.pas' {Form1},
login in 'login.pas' {Form7};
var
vErrorStr:String;
vIsExit:Boolean;
{$R *.res}
begin
Application.Initialize;
Application.Title := '平台';
vErrorStr:=Form7.CheckUserLogin(vIsExit);
////////////此为登录窗口并在登录窗口中已声明了Form7.CheckUserLogin(vIsExit);但系统编译时出现这样的错误:[Error] HKSJ_SMS.dpr(40): Undeclared identifier: 'CheckUserLogin' 就这一句!是不是要在这声明。请指教! if vErrorStr<>'' then //vErrorStr为空表明调用登陆窗体成功!
begin
Application.MessageBox(PChar(vErrorStr),'错误',$00000010 + $00000000);
Application.Terminate ;
end; if vIsExit then //vIsExit为True表示用户关闭了登陆窗体
Application.Terminate
else
begin
   Application.CreateForm(TForm1, Form1);//主窗口
Application.Run;
end; end.
delphiseabird 2003-09-13
  • 打赏
  • 举报
回复
我在工程文件中application.run之前创建、显示登录窗体
也有一种是在主窗体的onshow中写,我两种都用,适时而定
superlionet 2003-09-13
  • 打赏
  • 举报
回复
你可以在主工程单元文件中(通过project 的 view source 中打开) application.run前创建登陆窗体,然后释放窗体。
FrameSniper 2003-09-13
  • 打赏
  • 举报
回复
谢谢你的回复,
按你的做了,但在项目文件中系统不能找到登录窗口中的Form7.CheckUserLogin(vIsExit); 事件,请问该如何在项目文件中声明这个事件?

---------------------------------------------------------------------

我第一个回复中说了,CheckUserLogin这个函数是不属于任何类的(是个例程,Delphi中不属于任何类的单独过程或函数统称为例程!),可以在LoginFrm单元的类型申明中进行,例如放到TLoginForm的类申明之后,如下:

unit LoginFrm;

interface

uses
Windows, Messages, SysUtils, ....;

type
TLoginForm = class(TForm)
....
private
{ Private declarations }
public
{ Public declarations }
end;

function CheckUserLogin(var oIsExit:Boolean):String; //在这里申明

........
FrameSniper 2003-09-13
  • 打赏
  • 举报
回复
program ProjectName; //假设你的项目文件名为ProjectName

uses
....
LoginFrm in '..\LoginFrm.pas' {LoginForm}, //这里的路径自己指定!
....

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧