请教个问题,我把一个定时器timer1拖放到了Form1上,然后在Form1的Destroy事件中,执行了timer1.free。程序执行起来好像没有什么问题,请教一下各位高手,这样写是否有问题?
解决方案 »
- 各位老大,关于DELPHI接收邮件的问题?
- scrollbox中的控件在获得焦点时,如果控件在显示区域外,scrollbox会自动滚动到焦点控件上,如何禁止这种自动滚动?
- 如何把一串字符串转化成UNICODE编码形式?
- Installshield Express 4所制作的安装程序的序列号校验之DLL?(如何用delphi编制?)
- 怎样向ActiveForm传递对象?
- 在FormCreate时设置StringGrid内容的问题
- 请教一个参数类型问题
- 关于二为数组的问题,请教!
- 使用webbrowser如何不下载图片?
- 我怎么才能将别人的软件反编译,一般用什么软件,是不是要懂汇编?
- DELPHI动态创建数据库时,如何显示进度条?
- 4个数据表怎样建立视图?急求
定时器好像在form关闭还执行,导致了access violation。
所以我在form1的destroy事件,让form1 = nil,并且执行了timer1.free,
不过这样写总感觉不大对劲
原因是你拖放timer1到form上,form在释放的时候会自动释放timer1,但是你自己释放了又没有将其置为nil,会导致重复释放已被你释放的内存。或许看不出来,那是因为那会会释放的内存没有其他用途或者正好是空闲的。
TComponent.Create(AOwner: TComponent);
destructor TComponent.Destroy;
以及
procedure TComponent.DestroyComponents;从TComponent继承而来的组件,只要它有子对象,就会在子对象Create时,加到自己的FComponents中,Owner释放时,会把FComponents列表中的所有对象都释放掉,而当子对象单独释放时,会把这个子对象从FComponents列表中删除
destructor TComponent.Destroy;
begin
....
if FOwner <> nil then FOwner.RemoveComponent(Self);
....
end;
因此楼主这么用,完全没问题.
至于Form1 := NIL;是否需要就得看所有引用Form1的地方了.
Form.OnClose中,用 Timer1.Enabled := False;来关闭就可以了