delphi登录窗口关闭主窗口也关闭?怎么办啊?
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
UserTxt: TEdit;
PSWTxt: TEdit;
CancelBtn: TButton;
OKBtn: TButton;
Panel1: TPanel;
Label3: TLabel;
procedure FormCreate(Sender: TObject);
procedure UserTxtKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure PSWTxtKeyPress(Sender: TObject; var Key: Char);
procedure OKBtnClick(Sender: TObject);
procedure CancelBtnClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses A2;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Label3.Caption:='用户名:Admin'+#13+'密码:123';
end;
procedure TForm1.UserTxtKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key=13 then
PSWTxt.SetFocus;
end;
procedure TForm1.PSWTxtKeyPress(Sender: TObject; var Key: Char);
begin
if Key=#13 then
begin
OKBtn.SetFocus;
Exit;
end;
if(Key<#48)or(Key>#57) then
Key:=#0;
end;
procedure TForm1.OKBtnClick(Sender: TObject);
begin
if(UserTxt.Text='Admin')and(PSWTxt.Text='123') then
Form2.Visible:=True
else
begin
Label3.Caption:='错误!。'+#13+'用户名为:Admin'+#13
+'密码为:123'+#13+'注意大小写,请重新再试。';
CancelBtn.Click;
end;
end;
procedure TForm1.CancelBtnClick(Sender: TObject);
begin
UserTxt.Text:='';
PSWTxt.Clear;
UserTxt.SetFocus;
end;
end.
在哪加什么代码,登录成功后登录窗口关闭主窗口不关闭? 展开
这个问题有两种实现方式,看哪种适合你。
方案一:窗体隐藏法。
这个方案其实说起来很简单,即在登录窗口使用时Create并显示,不使用时Close并Free。程序以主窗口为调用各窗口的主窗体,程序运行时即创建该窗口。
方案二:修改DPR中调用顺序法
这里,是一个未修改工程属性和代码和DPR文件,与后面的做个比较:
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {frmMain},
Unit2 in 'Unit2.pas' {frmLogin};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TfrmMain, frmMain);
Application.CreateForm(TfrmLogin, frmLogin);
Application.Run;
end.
下面,你需要先修改工程属性,点击菜单Project -> Options,在Forms属性页中,将自动创建的窗口Auto-create Forms中清掉非必要的窗体,特别是主窗体和登录窗体,这样Main Form 处也就空了。点击OK返回后,相应的,DPR单元也发生了改变,我们还要对他书写代码,这里不细说了。
然后,修改登录窗口,在窗体类的后面,var的前面增加一个函数声明,并在实现他,见下面的代码例子:
// 上面的代码不贴出来了
private
{ Private declarations }
public
{ Public declarations }
end;
// 登录窗体调用方法, 使用这个方法可以减少调用处的代码量, 也方便统一的对该窗体进行操作
function ShowLoginForm(): Boolean;
var
frmLogin: TfrmLogin;
implementation
{$R *.dfm}
function ShowLoginForm(): Boolean;
begin
frmLogin := TfrmLogin.Create(nil);
try
// 获取窗体返回值, 下面被屏蔽的代码在功能上与本行是一样的
Result := FormLogin.ShowModal=mrOk;
// if Form2.ShowModal = mrOk then
// Result := True // 若窗体返回mrOk, 表示登录成功, 本函数返回True
// else
// Result := False; // 若窗体没有返回mrOk, 表示登录失败, 本函数返回False
finally
FreeAndNil(FormLogin);
end;
end;
// 这里的代码就只贴这么多,怎么在点击按钮时设置ShowModal的返回值,具体看源代码文件包吧。
然后,我们返回DPR单元文件,对他进行修改。
在代码
Application.Initialize;
Application.Run;
之间,增加对Login窗体中增加的这个窗体的调用,并判断他的返回值。
Application.Initialize;
if not ShowLoginForm() then // 若该函数返回False, 则登录不成功
Exit;
Application.CreateForm(TfrmMain, frmMain);
Application.Run;
好了,具体可以看我上传的附件里的源码。不过源码里的东西更多一些,因为我很早就上传到CSDN里了,不需要积分,也不会屏蔽下载的,那里的下载地址是: download。csdn。net/detail/ouyongke/6002261
PS:这里没法上传,不知道为什么,没办法了。
form1的 uses添加 unit2;
在form1的OnShow 事件写代码:
procedure TForm1.FormShow(Sender: TObject);
begin
Application.CreateForm(TForm2,Form2);
Form2.ShowModal;
form2.Free;
end;
这个就是主窗体的代码,就这个就足够了!
下面是登陆窗口的代码:
登陆窗口设计为两个Edit组件,分别用来输入账号和密码!
两个Button组件,button1为确定 button2为取消
定义一个全局变量 例如: I: integer=0;
单击确定按钮:
procedure TForm2.Button1Click(Sender: TObject);
begin
if (Trim(Edit1.Text)='账号')and(Trim(Edit2.Text)='密码') then
begin
I := 1;
close;
end
else
begin
showmessage('用户名或密码错误。');
I := 0;
end;
end;
单击取消按钮:
procedure TForm2.Button2Click(Sender: TObject);
begin
Application.Terminate;
end;
登陆窗口Onclose事件:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Int=0 then
Application.Terminate;
end;
你可以测试一下!
这样就可以实现你想要的。。其他的你再加上你自己的代码就可以了!
主窗口一般使用Application.createform创建.
登陆窗口使用Form2:=TForm2.create(Application);创建
这样在登陆窗口判断登陆信息成功的时候.使用Form2.Free可以正常释放掉.
然后显示主窗口.
可以从网上找些登陆窗口这样的实例代码看一下就明白了