private { Private declarations } public end;var login: Tlogin;implementation{$R *.dfm}procedure Tlogin.BitBtn1Click(Sender: TObject); begin with query1 do begin ParamByName('dm').AsString:=lowercase(edit1.text); ParamByName('passwd').AsString:=edit2.text; open; if eof then if login.tag<2 then begin login.Tag:=login.tag+1; application.MessageBox('用户或口令错误,请重输!','注意',mb_ok); edit1.SetFocus; end else begin application.MessageBox('抱歉,您不能使用本系统!','注意',mb_ok); modalresult:=mrcancel; end else begin m_cz:=trim(lowercase(edit1.text)); modalresult:=mrok; end; close; end; end;
怎么解决?
不关这段代码的事,而在你modalresult<>mrok后,你的处理返回结果的窗口做了不该做的事 比如数据库还没打开就操作某些资源 你要是把loginform的cancel按钮事件这样写,就不会发生问题了 oncancelclick() begin halt; end; (说明:这样写是不合适的,应当想别的办法避免。我这么写只是为了指出你程序错在了什么地方)
就在这里调用:program hx;uses Forms, controls, sysutils, u_main in 'u_main.pas' {main}, u_data in 'u_data.pas' {DataModule1: TDataModule}, u_login in 'u_login.pas' {login}, u_wzjk in 'u_wzjk.pas' {wzjk};{$R *.res}begin Application.Initialize; Application.CreateForm(Tmain, main); Application.CreateForm(TDataModule1, DataModule1); Application.CreateForm(Tlogin, login); Application.CreateForm(Twzjk, wzjk); if login.ShowModal=mrok then Application.Run;//这里 end.
。。
var m_cz:string;
type
Tlogin = class(TForm)
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
Edit2: TEdit;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
Query1: TQuery;
procedure BitBtn1Click(Sender: TObject);
procedure Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure BitBtn2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public end;var
login: Tlogin;implementation{$R *.dfm}procedure Tlogin.BitBtn1Click(Sender: TObject);
begin
with query1 do
begin
ParamByName('dm').AsString:=lowercase(edit1.text);
ParamByName('passwd').AsString:=edit2.text;
open;
if eof then
if login.tag<2 then
begin
login.Tag:=login.tag+1;
application.MessageBox('用户或口令错误,请重输!','注意',mb_ok);
edit1.SetFocus;
end
else
begin
application.MessageBox('抱歉,您不能使用本系统!','注意',mb_ok);
modalresult:=mrcancel;
end
else
begin
m_cz:=trim(lowercase(edit1.text));
modalresult:=mrok;
end;
close;
end;
end;
怎么解决?
比如数据库还没打开就操作某些资源
你要是把loginform的cancel按钮事件这样写,就不会发生问题了
oncancelclick()
begin
halt;
end;
(说明:这样写是不合适的,应当想别的办法避免。我这么写只是为了指出你程序错在了什么地方)
Forms,
controls,
sysutils,
u_main in 'u_main.pas' {main},
u_data in 'u_data.pas' {DataModule1: TDataModule},
u_login in 'u_login.pas' {login},
u_wzjk in 'u_wzjk.pas' {wzjk};{$R *.res}begin
Application.Initialize;
Application.CreateForm(Tmain, main);
Application.CreateForm(TDataModule1, DataModule1);
Application.CreateForm(Tlogin, login);
Application.CreateForm(Twzjk, wzjk);
if login.ShowModal=mrok then Application.Run;//这里
end.
你在那里设个断点试试
你在main.oncreate、datamodule.oncreate里都创建了哪些对象?
这些对象的释放都在哪里?
我劝你最好单步跟踪一下,看看到底是在哪出的错误if login.ShowModal=mrok then Application.Run;
在这里设断点,然后单步跟踪
begin
Application.Initialize;
Application.CreateForm(Tmain, main);
Application.CreateForm(TDataModule1, DataModule1);
Application.CreateForm(Tlogin, login);
//Application.CreateForm(Twzjk, wzjk);
if login.ShowModal=mrok then Application.Run;//这里
end.
这样就pass了,Twzjk里用了2个第三方控件:Ehlib2.3和dxmemdata,难道和这2个控件有关?
如果是的话而且不想放弃使用此2个控件(偶觉得很好用),是否只有用Halt呢?