窗体释放:谁能解释清楚?

zhoufs 2009-03-16 06:16:04
有3个窗体:form1、form2、form3,其中form1为主窗体。
工程文件如下:
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TForm3, Form3);
form2.show;
Application.Run;
----------------------------------------
form1中有如下代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
form3.show;
end;

----------------------------------------
form2、form3都有一个Button,其中的OnClick事件处理程序都只一句:free;

执行程序后,点击form1上的Button1,显示form3,然后点击form2的Button,正常释放;再点击form3的Button,就会报错!

但如果将工程文件中的 form2.show;改为 form3.show或者将form1中的form3.show移到工程文件中,则一切正常!


哪位高手能解释其中的原因?



...全文
180 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
pbray 2009-03-17
  • 打赏
  • 举报
回复
也有可能是系统问题。
我也碰到过
zhoufs 2009-03-17
  • 打赏
  • 举报
回复
请楼上各位在D6下编译一下,看看如何? 保证你100%出错。

当我一字未改,在在D7中试了一下,编译执行,完全正常,一点错误都没有!

所以,原因只能是一个:D6的bug 。
7年 2009-03-17
  • 打赏
  • 举报
回复
我也试了,没报错,楼主表达的不准确?
coderee 2009-03-17
  • 打赏
  • 举报
回复
可能你说的那种情况是对的,但你这样说,我相信没有人真正理解你的意思,释放的话我建议还是用release。
Seamour 2009-03-16
  • 打赏
  • 举报
回复
还真试过了,我相信没人能重现你的错误
zhoufs 2009-03-16
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 Seamour 的回复:]
根本就不可能发生,如果你点的顺序如你所说,也保证没有别的代码,那么不管引用什么单元,vcl都不可能出现你说的这种低级错误
[/Quote]

确实没有别的代码,就三个窗体。

建议你不是亲自试一下,反正我是试了多次,都是报错。如果去掉引用“DB”,就没有问题。
Seamour 2009-03-16
  • 打赏
  • 举报
回复
根本就不可能发生,如果你点的顺序如你所说,也保证没有别的代码,那么不管引用什么单元,vcl都不可能出现你说的这种低级错误
zhoufs 2009-03-16
  • 打赏
  • 举报
回复
初步找到原因:

只要在form2或form3的uses列表中加入“DB”单元,就会出错:

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

但进一步的原因是什么?期待高手来解答。
zhoufs 2009-03-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 unsigned 的回复:]
不知道你什么问题,我这里不会出现问题。对于Form的操作,个人不建议直接调用Free,而换调用Form的Close方法。
[/Quote]

是的,一般是通过在form 的close中执行Action:=cafree来释放窗体,而不是直接在窗体自身的某个事件中
用free来释放。我这个例子只是想研究一下为什么当free第2个窗体时出错而free第1个窗体时却不出错?
zhoufs 2009-03-16
  • 打赏
  • 举报
回复
没错,是这样子。
运行程序时,显示主窗体form1的同时,也显示form2,然后点击form1上的Button,显示form3。
接下来,如果先点击form2上的Button,再点击form3上的Button,就会报错;反之亦然。
JetDash 2009-03-16
  • 打赏
  • 举报
回复
逻辑要搞清楚,一般这种简单的delphi是不会出错的.
preserve 2009-03-16
  • 打赏
  • 举报
回复
好像没问题。
willflyz 2009-03-16
  • 打赏
  • 举报
回复
估计就是点错了,多测试几次就知道了,
tsingfeng_bhcss 2009-03-16
  • 打赏
  • 举报
回复
按照你说的没有问题,如果你再次点Form上的Button才会有问题,因为Form3已经释放掉了
Seamour 2009-03-16
  • 打赏
  • 举报
回复
没看懂
是说这个样子?

program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2},
Unit3 in 'Unit3.pas' {Form3};

{$R *.res}

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TForm3, Form3);
Form2.Show;
Application.Run;
end.


unit Unit1;

...

var
Form1: TForm1;

implementation

{$R *.dfm}

uses
Unit3;

procedure TForm1.Button1Click(Sender: TObject);
begin
Form3.Show;
end;

end.


unit Unit2;

...

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
Free
end;

end.


unit Unit3;

...

implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
begin
Free
end;

end.


然后怎么个点法?
form1.button1, form2.button1, form3.button1?不会有问题啊
僵哥 2009-03-16
  • 打赏
  • 举报
回复
不知道你什么问题,我这里不会出现问题。对于Form的操作,个人不建议直接调用Free,而换调用Form的Close方法。

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧