我在一个pas文件中写了一个类, 类里创建了一个 TTimer 的对象,但是每次释放的时候都会报内存错,请问大家有可能是什么原因?(注 : 定时器创建了, 我使用 if Assigned ( tmrGrowth ) then FreeAndNil( tmrGrowth ); 这样释放的,tmrGrowth 就是定时器对象; 改成tmrGrowth.Destroy 也一样报内存错,而且Destroy 这个方法不能跟进去 )
调试欢乐多
我释放之前 已经把 enable := False 了...
仍然不行... 大侠们, 因为代码有300行左右,所以不好贴出来,我说一下我的代码的大概思路:
我这个pas文件是实现从屏幕的右下角弹出一个冒泡窗口,类似msn在好友登录的时候弹出的冒泡窗口。
本来用一个定时器(tmr1)就够了(tmr1 的作用就是做进入屏幕,在屏幕停留5s,然后逐渐淡化至透明,然后释放窗口和资源),昨天老大说,同时收到两个冒泡窗口的消息时也要像msn一样,下面的把上面的推上去,所以我就又加了一个定时器( tmr2 )专门用来检测是否有新的冒泡窗口,如果有那么本身的窗口就上移; 就是这样一个定时器在释放的时候总是报内存错(tmr1,tmr2 的释放都是在tmr1Timer 方法中做的 )如果有人帮我解决了问题,我再加100分!!
我的类结构大概这样的:
THintMsg = class( TObject )
private
FOwner : TObject; FHintForm : TForm;
CloseImage :TImage ;
tmrGradient : TTimer;
tmrGrowth : TTimer;
procedure tmrGradientTimer( Sender: TObject );
procedure tmrGrowthTimer( Sender: TObject );
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
public FormClick : TFormClick;
constructor Create( AOwner : TObject );
destructor Destroy; override; end;
implementation
constructor THintMsg.Create( AOwner : TObject );
begin
FHintForm := TForm.Create( application );
tmrGradient := TTimer.Create( FHintForm );
tmrGrowth := TTimer.Create( nil ); // 问题出在这里,先前我是tmrGradient :=
// Timer.Create( FHintForm ); 这样创建的,改成
// nil 就没问题了, 虽然问题解决的,但是我不知道为什
// 么,如果有人知道为什么来说一下,同样给分end;
begin
tmrGrowth.Enable := False;
end;FreeAndNil(tmrGrowth);
FHintForm 释放前会自动释放定时器的