大家请看看,我编的登陆窗体问题在哪儿,解决了100分双手奉上。 (100分)

  • 主题发起人 xucongbo
  • 开始时间
X

xucongbo

Unregistered / Unconfirmed
GUEST, unregistred user!
我编的程序为:先出现一个闪现窗体,然后出现登陆窗体 闪现窗体关闭,(在登陆窗体中输入用户名、密码,点确定就可进入主体,点取消关闭此程序),一开始我用着没问题,但我在主窗体加上数据库后,就出现,点确定可顺利进入主窗体,一切正常,但点取消时就会出错,请各位帮我看看此代码哪儿写的不对,谢谢,
Project1中的代码为:
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2},
Unit3 in 'Unit3.pas' {Form3},
Unit4 in 'Unit4.pas' {Form4};
{$R *.res}
begin
Application.Initialize;
Form2:=TForm2.Create(Application);
Form2.Show;
Form2.Update;
try
Try
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm4, Form4);
Except
end;
Finally
Form2.Free;
end;
Application.CreateForm(TForm3, Form3);
if form3.ShowModal = 1 then
begin
form3.hide;
form3.Free;
Application.Run;
end;
end.

form3中的代码为:(form3为登陆窗体,Button1为确定,Button2为取消)
procedure TForm3.Button1Click(Sender: TObject);
begin
modalresult:=1;
if form1<>nil then
form1.Show;
end;
procedure TForm3.Button2Click(Sender: TObject);
begin
close;
end;
form2为闪现窗体。
请大家看为什么点取消时就出错怎么解决(其它一切正常)
 
if form3.ShowModal = 1 then
begin
form3.hide;
form3.Free;
Application.Run;
end;
====================
if form3.ShowModal = 1 then
begin
form3.hide;
form3.Free;
end
else
begin
Application.Terminate;
end;
;
Application.Run;
 
唉,看到这等代码也难怪人家对DELPHI说三道四了。
 
[^][^][^][^]
 
结构性错误!!!
还是用下面的方法吧!
begin
Application.Initialize;
Form2:=TForm2.Create(Application);
Form2.Show;
Form2.Update;
sleep(1000)
Form2.free;
with TForm3.create(application)do
begin
showmodal;
if modalResult = mrOk then

begin
Free;
application.create(TForm1, Form1)
application.Run
end
else
Application.terminate
end;
end.
 
看我的如下代码:
try
hrtlib.RunOnlyOne(Application);
Application.Initialize;
Frm_Splan:=TFrm_Splan.Create(Application);//快闪界面
Frm_Splan.Show;
sleep(1000);//不般可以不要,因为这样为启动慢一点
Application.ProcessMessages;
Application.CreateForm(TdmMain, dmMain);//datamodel
Application.CreateForm(TFrm_Main, Frm_Main);//主界体
Application.ProcessMessages;
Frm_Splan.Update;
Frm_Splan.Hide;
Frm_Splan.Free;
Application.Run;
except
Application.MessageBox('不能联上后台数据库,请查核电脑网络、数据库服务或阅读帮助文件!','数据库联接错误',MB_OK+MB_IconStop+MB_SystemModal);
Halt;
end;

//******************************************
在主界面中(TFrm_Main)的show事件中创建登录界面,进行用户的登录功能
procedure TFrm_Main.FormShow(Sender: TObject);
var
CXSCREEN,CYSCREEN:String;
begin
try
//*****************************
//判断系统的分辨率
CXSCREEN:= IntTostr(GetSystemMetrics(SM_CXSCREEN));
CYSCREEN:= IntTostr(GetSystemMetrics(SM_CYSCREEN));
IF (CXSCREEN<>'800') and (CYSCREEN<>'600') then
begin
PalMain.Visible:=False;
dxBarButton32.Visible:=ivNever;
Application.MessageBox('本系统图形向导功能只能在分辨率为 800*600 下(最佳分辨率),但不影响操作!','系统提示',MB_OK+MB_IconInformation+MB_SystemModal);
end;
//*****************************
Application.CreateForm(TFrm_Login,Frm_Login);//登录界面
Frm_Login.ShowModal;

StatusBar1.Panels[0].Text:=' 当前操作用户及权限:【'+hrtlib.User_No+' '+hrtlib.User_Nm+' ☆ '+hrtlib.Stk_nm+'】';
except
end;
end;

//*********************************************************
//在登录界面中有两种情况,一种为登录时,另一种为重新登录时情况。
通过就种方法,可以很简单的实现系统重新登录系统的功能(不关闭系统)。
兄弟,给分吧!
 
再说简单点吧,你的数据库是用ADO控件吧,你只要把新建一数据库模块来放这些控件就行了.
 
To xucongbo:
procedure TForm3.Button2Click(Sender: TObject);
begin
close;
/*(改为close.form3;)*/
end;
做以上改动试试!
 
看我的:
program Project1;
uses
Dialogs,
Forms,
SysUtils,
```````
{$R *.res}
var
time1: Tdatetime;
begin
Splashform := TSplashform.Create(nil);
Splashform.show;
Splashform.update;
time1 := now;
repeat until time1 + StrtoTime('00:00:1') <= now;
//延时1S,可以自己定义启动画面演示的时间,
//当所有的窗体装载完成后,现实主窗口。
Application.Initialize;
Application.Title := '。。。';
Application.CreateForm(Tadodm, adodm);//数据模块
if not adodm.XQconn.Connected then
//如果连接失败
begin
ShowMessage('连接后台数据库失败,请检查配置是否完好,数据库XQ是否存在');
halt;
end;
Application.CreateForm(TMainForm, MainForm);
Splashform.Hide;
Splashform.FreeOnRelease;
Application.CreateForm(TLoginForm, LoginForm);
LoginForm.ShowModal;
LoginForm.Free;
Application.Run;
end.


loginform:
unit TloginFormUnit;
interface
``````
procedure btokClick(Sender: TObject);
procedure btnoClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
LoginForm: TLoginForm;
implementation
uses Udm, Umain;
{$R *.dfm}
procedure TLoginForm.btokClick(Sender: TObject);
begin
LoginForm.Free;
MainForm.ShowModal;
end;
procedure TLoginForm.btnoClick(Sender: TObject);
begin
Application.Terminate;
end;
end.

 
我告诉你吧。把数据窗体在form3.ShowModal 不等于时即取消时Free掉就OK了。
if form3.ShowModal = 1 then
begin
form3.hide;
form3.Free;
Application.Run;
end else
form1.free;
////***************就这
 
to xucongbo
我試過你的程序,
把Unit3 in 'Unit3.pas' {Form3},
改成Unit3 in 'Unit3.pas' {Form3}﹔
點擊取消不會出錯,一切正常啊
 
不好意思,我一开始发的那个没问题,后来我又改了一下大家在看一下,我加了个from4就不行了,后来我看了看正如wonken兄说的
if form3.ShowModal = 1 then
begin
form3.hide;
form3.Free;
Application.Run;
end else
form1.free;
我在在加上一句form4.free;就行了,不过如果我的程序有100个窗体,就得把这100个窗体一一free;呢,是不是太麻烦了.怎么可以简单一些.
 
利用Application.Terminate;
 
Application.Terminate;
我试了试不行.
 
我认为先出现登录窗口,如果取消了,就会什么也不用做,退出。否则,再出现闪窗,创建各个窗体。请想想行不。
 
program wm;
uses
windows,
Forms,
mainfrm in 'Mainfrm.pas' {main_frm},
datafrm in 'Datafrm.pas' {Data_frm: TDataModule},
flashfrm in 'Flashfrm.pas' {flash_frm},
loginfrm in 'LOGINFRM.PAS' {login_frm}:
{$R *.res}
var
ITime:DWORD;
//显示FLASH窗体及登陆框
begin
Application.Initialize;
flash_frm:=Tflash_frm.create(application);
flash_frm.show;
flash_frm.update;
ITime:=GetTickCount;
Application.CreateForm(Tmain_frm, main_frm);
Application.CreateForm(TData_frm, Data_frm);
while (GetTickCount-ITime)<2000do
;
//延迟两秒
flash_frm.Close;
flash_frm.free;
Application.CreateForm(Tlogin_frm, login_frm);
login_frm.ShowModal;
Application.Run;
end.

登陆窗体
unit loginfrm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, Buttons, StdCtrls, Mask, ImgList;
type
Tlogin_frm = class(TForm)
useredit: TEdit;
PswEdit: TEdit;
Label1: TLabel;
Label2: TLabel;
okbtn: TBitBtn;
cancelbtn: TBitBtn;
procedure cancelbtnClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
procedure okbtnClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
login_frm: Tlogin_frm;
implementation
uses datafrm, mainfrm;
{$R *.dfm}

procedure Tlogin_frm.cancelbtnClick(Sender: TObject);
begin
self.Close;
end;

procedure Tlogin_frm.FormCreate(Sender: TObject);
begin
data_frm.LoginTable.Active := True;
end;

procedure Tlogin_frm.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
application.Terminate;
end;

//检查用户名和密码
procedure Tlogin_frm.okbtnClick(Sender: TObject);
begin
//回车键响应
if useredit.Text <> data_frm.LoginTable.Fields.Fields[1].AsString then
begin
Application.MessageBox('用户名错误,请重新输入.', '错误', MB_OK);
useredit.SetFocus;
end
else
if pswedit.Text = data_frm.LoginTable.Fields.Fields[2].AsString then
begin
login_frm.Hide;
main_frm.Show;
end
else
begin
Application.MessageBox('密码错误,请重新输入.', '错误', MB_OK);
pswedit.Text := '';
pswedit.SetFocus;
end;
end;

end.
 
取消中释放资源
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
514
import
I
顶部