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. 展开
工程文件:
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. 展开
4个回答
展开全部
login窗体既然是登陆窗口,一旦登陆成功,它的使命就完成了。所以可以close掉它,把flogin.Hide;改成flogin.Close;
下面这两行就不要了,不要这样释放窗体,删掉:
flogin.Free;
flogin:=nil
最后,在login窗体的OnClose中释放窗体,写上一句:Action:=caFree;
再运行你的程序,就没有问题了。
下面这两行就不要了,不要这样释放窗体,删掉:
flogin.Free;
flogin:=nil
最后,在login窗体的OnClose中释放窗体,写上一句:Action:=caFree;
再运行你的程序,就没有问题了。
追问
按你说的改了后确实不会报错了。
但为什么不能用:
flogin.Free;
flogin:=nil;
而用 flogin.Close; 就不会出问题了呢?Free不是专门用来释放窗体的吗?
还有,如果不按你说的改,而是在主窗体退出时用halt代替Application.Terminate,也能正常退出程序且不会报错,但这样会不会有什么不良影响?
展开全部
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;
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;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Application.Terminate; -->CanClose:=True;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
procedure Tflogin.okClick(Sender: TObject);
begin
flogin.Hide;
Application.CreateForm(Tfmain, fmain);
fmain.Showmodel;//这里用有模的比较好, fmain close 之后 会往下执行的。
flogin.Free;
flogin:=nil;
end;
begin
flogin.Hide;
Application.CreateForm(Tfmain, fmain);
fmain.Showmodel;//这里用有模的比较好, fmain close 之后 会往下执行的。
flogin.Free;
flogin:=nil;
end;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询