我编辑了一个多窗体的程序,在关闭所有窗体之后电脑进程中此程序并没有关闭!不知道是什么问题?顺便问一下,我的destory和free分别什么在什么时候用?
下面程序代码是登陆界面
unit login;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, StdCtrls, jpeg, ExtCtrls;type
TLoginForm = class(TForm)
Image1: TImage;
EDUsername: TEdit;
Label1: TLabel;
EDPassword: TEdit;
Label2: TLabel;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
LoginForm: TLoginForm;implementationuses datemodule, main;{$R *.dfm}procedure TLoginForm.Button1Click(Sender: TObject);
begin
EDUsername.Clear;
EDPassword.Clear;
end;procedure TLoginForm.Button2Click(Sender: TObject);
var
username:string;
password:string;
begin
username:=EDusername.Text;
password:=EDPassword.Text;
with datam.ADOQueryAdduser do
begin
close;
sql.Clear;
SQL.Add('select * from admin');
open;
if trim(username)='' then
begin
showmessage('用户名不能为空!');
EDusername.SetFocus;
end
else
if trim(password)='' then
begin
showmessage('密码不能为空!');
EDPassword.SetFocus;
end
else
if not Locate('id',Trim(username),[loPartialKey])then
begin
showmessage('用户名不存在!');
EDusername.Clear;
EDPassword.Clear;
end
else
if not locate('password',Trim(password),[loPartialKey]) then
begin
showmessage('密码不正确!');
EDusername.Clear;
EDPassword.Clear;
end
else
begin
application.CreateForm(TmainForm,mainform);
mainform.StatusBar1.Panels[1].Text:=username;
mainform.StatusBar1.Panels[3].Text:=fieldbyname('class').AsString;
if fieldbyname('class').AsString='一般用户' then
begin
mainform.N2.Enabled:=false;
end;
loginform.Hide;
loginform.free;
mainform.ShowModal;
mainform.Free; end
endend;
下面是主窗体
unit main;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ComCtrls, ExtCtrls;type
TMainForm = class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
N14: TMenuItem;
N11: TMenuItem;
N12: TMenuItem;
N13: TMenuItem;
N15: TMenuItem;
N16: TMenuItem;
N17: TMenuItem;
N18: TMenuItem;
N19: TMenuItem;
N20: TMenuItem;
N21: TMenuItem;
N22: TMenuItem;
N23: TMenuItem;
N24: TMenuItem;
N25: TMenuItem;
N26: TMenuItem;
N27: TMenuItem;
N28: TMenuItem;
N29: TMenuItem;
N30: TMenuItem;
N31: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N32: TMenuItem;
N33: TMenuItem;
StatusBar1: TStatusBar;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;var
MainForm: TMainForm;implementationuses adduser, datemodule;{$R *.dfm}procedure TMainForm.Timer1Timer(Sender: TObject);
begin
mainform.StatusBar1.Panels.Items[5].Text:=timetostr(time);
end;procedure TMainForm.N3Click(Sender: TObject);
begin
adduserform:=Tadduserform.Create(application);
AddUserForm.Show;
end;procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
datam.free;
end;end.
end.
工程开始时只创建了datam(数据datamodule)和loginform(登陆界面)
下面程序代码是登陆界面
unit login;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, StdCtrls, jpeg, ExtCtrls;type
TLoginForm = class(TForm)
Image1: TImage;
EDUsername: TEdit;
Label1: TLabel;
EDPassword: TEdit;
Label2: TLabel;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
LoginForm: TLoginForm;implementationuses datemodule, main;{$R *.dfm}procedure TLoginForm.Button1Click(Sender: TObject);
begin
EDUsername.Clear;
EDPassword.Clear;
end;procedure TLoginForm.Button2Click(Sender: TObject);
var
username:string;
password:string;
begin
username:=EDusername.Text;
password:=EDPassword.Text;
with datam.ADOQueryAdduser do
begin
close;
sql.Clear;
SQL.Add('select * from admin');
open;
if trim(username)='' then
begin
showmessage('用户名不能为空!');
EDusername.SetFocus;
end
else
if trim(password)='' then
begin
showmessage('密码不能为空!');
EDPassword.SetFocus;
end
else
if not Locate('id',Trim(username),[loPartialKey])then
begin
showmessage('用户名不存在!');
EDusername.Clear;
EDPassword.Clear;
end
else
if not locate('password',Trim(password),[loPartialKey]) then
begin
showmessage('密码不正确!');
EDusername.Clear;
EDPassword.Clear;
end
else
begin
application.CreateForm(TmainForm,mainform);
mainform.StatusBar1.Panels[1].Text:=username;
mainform.StatusBar1.Panels[3].Text:=fieldbyname('class').AsString;
if fieldbyname('class').AsString='一般用户' then
begin
mainform.N2.Enabled:=false;
end;
loginform.Hide;
loginform.free;
mainform.ShowModal;
mainform.Free; end
endend;
下面是主窗体
unit main;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ComCtrls, ExtCtrls;type
TMainForm = class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
N14: TMenuItem;
N11: TMenuItem;
N12: TMenuItem;
N13: TMenuItem;
N15: TMenuItem;
N16: TMenuItem;
N17: TMenuItem;
N18: TMenuItem;
N19: TMenuItem;
N20: TMenuItem;
N21: TMenuItem;
N22: TMenuItem;
N23: TMenuItem;
N24: TMenuItem;
N25: TMenuItem;
N26: TMenuItem;
N27: TMenuItem;
N28: TMenuItem;
N29: TMenuItem;
N30: TMenuItem;
N31: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N32: TMenuItem;
N33: TMenuItem;
StatusBar1: TStatusBar;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;var
MainForm: TMainForm;implementationuses adduser, datemodule;{$R *.dfm}procedure TMainForm.Timer1Timer(Sender: TObject);
begin
mainform.StatusBar1.Panels.Items[5].Text:=timetostr(time);
end;procedure TMainForm.N3Click(Sender: TObject);
begin
adduserform:=Tadduserform.Create(application);
AddUserForm.Show;
end;procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
datam.free;
end;end.
end.
工程开始时只创建了datam(数据datamodule)和loginform(登陆界面)
解决方案 »
- 400高分请教关于“三险一金”方面的问题
- DBGrid1绑定字符串的问题
- 探索Delphi的出路,让我奉献青春的饭碗-delphi,你路在何方,写得好就给分哈!
- 要在其他窗体里动态生成控件到一个MDI的子窗体?
- 主从表的增加、删除、编辑问题,请帮手,在线等……
- 表达式的算法问题
- 请问怎样判断一个xls文件已经打开?
- 简单日期格式化问题
- 实用程序???
- 求助:我需要一下Unix系统下的账号,要有写入权限,空间只要1M就够了,用于测试我的数据备份程序?一天时间就可以了哪位能帮助我呀特给100分以作酬谢!!!!
- 怎么把OleVariant所指对象转成excelOleChart对象呢?
- WebService的问题?急!
begin
AddUserForm.Show;
end;
或者,在
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
datam.free;
end;这里不用datam.free语句就行
如果DM(数据模板)是一直要用的,不用自己创建,让它自动CREATE
要自己CREATE的FORM也有两种,
SDI和MDI(一般情况)
SID()
YOURFORM := TYOURFORM.CREATE(Application);
YOURFORM.ShowModal();
YOURFORM.Free();MDI; YOURFORM := TYOURFORM.CREATE(Application);
YOURFORM.ShowModal();
begin
application.Terminate;
end;
destroy中写 form:=nil;
procedure TMainForm.N3Click(Sender: TObject);
var
adduserform:=Tadduserform;
begin
adduserform:=Tadduserform.Create(application);
AddUserForm.Show;
end;
两种有什么区别?
首先看看你的致命伤:
1.Locate('id',Trim(username),[loPartialKey]),你没有认真看帮助吧,[loPartialKey]表示部分匹配。
2.逻辑错误:你首先判断是否存在用户,然后再判断是否存在密码,可以如果你要的是TOM的用户密码为TOMPASS,但表里面存在TOM的用户密码为NOTTOMPASS,却同时存在PETER的用户密码为TOMPASS,你就错了吧。
3.后面是最惨不忍睹的了,你以为你想把哪个窗体当成主窗体系统就同意了,你口口声声说MainForm是你的主窗体,可是我告诉你,系统就是认为主窗体是登录窗体。
4.loginform.Hide;
loginform.free;
mainform.ShowModal;
mainform.Free;
这一段,我已经无法忍受了,你先把主窗体的loginform释放掉了,然后再去调用mainform的ShowModal方法,这怎么能行呢?
楼主,如果你想将MainForm作为主窗体,请你到Projects->Options->Forms->Main Form中进行设定。
5.楼主写的程序丝毫没有精简和复用的基本编程理念,当然相信你是新手,不应该强求,像这样的代码:
procedure TLoginForm.Button2Click(Sender: TObject);
var
username:string;
password:string;
begin
username:=EDusername.Text;
password:=EDPassword.Text;
with datam.ADOQueryAdduser do
begin
close;
sql.Clear;
SQL.Add('select * from admin');
open;
if trim(username)='' then
begin
showmessage('用户名不能为空!');
EDusername.SetFocus;
end
else
if trim(password)='' then
begin
showmessage('密码不能为空!');
EDPassword.SetFocus;
end
else
if not Locate('id',Trim(username),[loPartialKey])then
begin
showmessage('用户名不存在!');
EDusername.Clear;
EDPassword.Clear;
end
else
if not locate('password',Trim(password),[loPartialKey]) then
begin
showmessage('密码不正确!');
EDusername.Clear;
EDPassword.Clear;
end
else
begin
application.CreateForm(TmainForm,mainform);
mainform.StatusBar1.Panels[1].Text:=username;
mainform.StatusBar1.Panels[3].Text:=fieldbyname('class').AsString;
if fieldbyname('class').AsString='一般用户' then
begin
mainform.N2.Enabled:=false;
end;
loginform.Hide;
loginform.free;
mainform.ShowModal;
mainform.Free; end
endend;
以后不应该再出现了。
6.楼主最后窗体的问题直接导致了程序不能关闭,这还是轻的,这样的程序是会崩溃的。