delphi7中用用 ”Application.Terminate;”退出程序时报错:内存不能读!

我要实现的是先动态创建login窗口,验证通过后再创建main窗口。现在功能是实现了,但在main窗口中用”Application.Terminate;“退出程序时报错,... 我要实现的是先动态创建login窗口,验证通过后再创建main窗口。现在功能是实现了,但在main窗口中用 ”Application.Terminate;“退出程序时报错,但是将"Application.Terminate"换成"halt;"就没问题,我是新手,不明白原因,等待高手解答,最好能说明白、仔细点,谢谢!
工程文件:
program Project1;

uses
Forms,
login in 'login.pas' {flogin},
main in 'main.pas' {fmain};

{$R *.res}

begin
Application.Initialize;
flogin:=Tflogin.Create(nil);
flogin.ShowModal;
Application.Run;
end.

login单元:

unit login;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
Tflogin= class(TForm)

ok: TButton;
quit: TButton;
procedure quitClick(Sender: TObject);
procedure okClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
flogin: Tflogin;

implementation
uses main;

{$R *.dfm}

procedure Tflogin.quitClick(Sender: TObject);
begin
Application.Terminate;
end;

procedure Tflogin.okClick(Sender: TObject);
begin
flogin.Hide;
Application.CreateForm(Tfmain, fmain);
fmain.Show;
flogin.Free;
flogin:=nil;

end;

end.

main单元:
unit main;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
Tfmain = class(TForm)
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;

var
fmain: Tfmain;

implementation

{$R *.dfm}

procedure Tfmain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin

if application.MessageBox('你将退出本系统,请确认?','提示',mb_yesno+MB_ICONQUESTION )=idyes then
begin
// halt;
Application.Terminate;
end
else
begin
CanClose:=false;
end
end;

end.
展开
 我来答
renjian32
2011-06-12 · TA获得超过2386个赞
知道大有可为答主
回答量:1339
采纳率:0%
帮助的人:1431万
展开全部
login窗体既然是登陆窗口,一旦登陆成功,它的使命就完成了。所以可以close掉它,把flogin.Hide;改成flogin.Close;
下面这两行就不要了,不要这样释放窗体,删掉:
flogin.Free;
flogin:=nil
最后,在login窗体的OnClose中释放窗体,写上一句:Action:=caFree;
再运行你的程序,就没有问题了。
追问
按你说的改了后确实不会报错了。
但为什么不能用:
flogin.Free;
flogin:=nil;
而用 flogin.Close; 就不会出问题了呢?Free不是专门用来释放窗体的吗?
还有,如果不按你说的改,而是在主窗体退出时用halt代替Application.Terminate,也能正常退出程序且不会报错,但这样会不会有什么不良影响?
hushaowq
2011-06-13 · TA获得超过126个赞
知道小有建树答主
回答量:409
采纳率:0%
帮助的人:275万
展开全部
procedure Tflogin.okClick(Sender: TObject);
begin
flogin.Hide;
Application.CreateForm(Tfmain, fmain);
fmain.Show;
flogin.Free;
flogin:=nil;

end;
这段代码有问题,你看一下项目文件就知道错在哪里.可以改成如下所示
procedure Tflogin.okClick(Sender: TObject);
begin
flogin.Hide;
Application.CreateForm(Tfmain, fmain);
fmain.Show;
flogin.Hide;
end;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
HJ_3000
2011-06-13 · TA获得超过563个赞
知道小有建树答主
回答量:1264
采纳率:78%
帮助的人:59.8万
展开全部
Application.Terminate; -->CanClose:=True;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lin257257
2011-06-12 · TA获得超过424个赞
知道小有建树答主
回答量:331
采纳率:100%
帮助的人:181万
展开全部
procedure Tflogin.okClick(Sender: TObject);
begin
flogin.Hide;
Application.CreateForm(Tfmain, fmain);
fmain.Showmodel;//这里用有模的比较好, fmain close 之后 会往下执行的。
flogin.Free;
flogin:=nil;

end;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式