请教个问题,我把一个定时器timer1拖放到了Form1上,然后在Form1的Destroy事件中,执行了timer1.free。程序执行起来好像没有什么问题,请教一下各位高手,这样写是否有问题?

解决方案 »

  1.   

    谢谢。
    定时器好像在form关闭还执行,导致了access violation。
    所以我在form1的destroy事件,让form1 = nil,并且执行了timer1.free,
    不过这样写总感觉不大对劲
      

  2.   

    用FreeAndNil(timer1),不要用timer1.Free.
    原因是你拖放timer1到form上,form在释放的时候会自动释放timer1,但是你自己释放了又没有将其置为nil,会导致重复释放已被你释放的内存。或许看不出来,那是因为那会会释放的内存没有其他用途或者正好是空闲的。
      

  3.   

    拖放到Form上的控件,当确定以后不再使用时,不需要用FreeAndNil来释放,直接Free即可,也不会导致重复释放,这么作本身也不会有内存问题.详见:
    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的地方了.
      

  4.   

    如果楼主如果仅仅是为了解决Form关闭时,Timer.OnTimer可能被执行的情况,可以在
    Form.OnClose中,用  Timer1.Enabled := False;来关闭就可以了