我在一个pas文件中写了一个类, 类里创建了一个 TTimer 的对象,但是每次释放的时候都会报内存错,请问大家有可能是什么原因?(注 : 定时器创建了, 我使用       if Assigned (  tmrGrowth ) then FreeAndNil( tmrGrowth ); 这样释放的,tmrGrowth 就是定时器对象; 改成tmrGrowth.Destroy 也一样报内存错,而且Destroy 这个方法不能跟进去 )

解决方案 »

  1.   

    FreeAndNil前TTimer的Enable属性设置为False了么?另外,无论什么时候都不该调用tmrGrowth.Destroy,不仅仅TTimer类。
      

  2.   

    是不是timer的事件正在执行?
      

  3.   


    我释放之前 已经把 enable := False 了...
      

  4.   

    菜单->Project->Options...->Compiler选项卡->Debugging区->选中Use Debug DCUs
      

  5.   


    仍然不行... 大侠们, 因为代码有300行左右,所以不好贴出来,我说一下我的代码的大概思路:
    我这个pas文件是实现从屏幕的右下角弹出一个冒泡窗口,类似msn在好友登录的时候弹出的冒泡窗口。
    本来用一个定时器(tmr1)就够了(tmr1 的作用就是做进入屏幕,在屏幕停留5s,然后逐渐淡化至透明,然后释放窗口和资源),昨天老大说,同时收到两个冒泡窗口的消息时也要像msn一样,下面的把上面的推上去,所以我就又加了一个定时器( tmr2 )专门用来检测是否有新的冒泡窗口,如果有那么本身的窗口就上移; 就是这样一个定时器在释放的时候总是报内存错(tmr1,tmr2 的释放都是在tmr1Timer 方法中做的 )如果有人帮我解决了问题,我再加100分!!
      

  6.   

    是肯定报错还是偶尔报错,如果你的timer事件里有循环处理,可能会出错的!
      

  7.   

    哎...  问题解决了。 和大家分享一下:
    我的类结构大概这样的:
      
    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;
      

  8.   

    if tmrGrowth.Enable then
    begin
      tmrGrowth.Enable := False;
    end;FreeAndNil(tmrGrowth);
      

  9.   

    你先前是 timer的owner是FHintForm 它的资源由FHINTFORM进行管理 当FHintForm释放时 TIMER就要释放,NIL呢 由你手工控制,,就是TIMER.free   或者freeandnil 。我估计原先你是FHINTFORM已经释放了,你再释放Timer当然会报错,因为它的owner是FHintForm,它已经释放了
      

  10.   

    Timer.Create( FHintForm );
    FHintForm 释放前会自动释放定时器的