我在工程中作了一个类似于MSN、Foxmail的弹出式消息提示窗体,窗体中放了一个定时器,到规定时间之后自动关闭提示窗体。我现在想在其他unit中建立新的实例使用它,比如frmTip:=TfrmTipPop.crieate(nil),因为frmTip到时会自动关闭,但是这个变量怎么释放呢?我从任务管理器中观察到即使窗体卸载了,但是内存占用量也没有减少。如果紧跟在frmTip.Show后面写frmTip.free的话,提示窗体根本就不出来了。

解决方案 »

  1.   

    可以利用ModelResult属性
    if frmTip.ModelResult = mrOk then
      FreeAndNil(frmTip);
      

  2.   

    不好意思,刚才出去了。我刚看到,还没有来得及试,但是我感觉还是不一定合适,因为我是在DataMoudle.ConnectionDisconnected里面检测到与数据库的连接断开之后,调用frmTip.Show的,提醒使用者连接已经断开,而frmTip显示一段时间(比方说2秒钟)之后就自己hide and close掉了,实例已经没了,对象变量是不是还在内存呢?我不是很懂,只是从任务管理器中看到即使frmTip没了,但是程序占用的内存空间还是没有减少。
      

  3.   

    frmTip.free;
    frmTip := nil;
      

  4.   

    紧跟着写显然不行,还没有来得及显示就会被free掉,我已经遇到过了,如何处理从显示到销毁这中间的时间
      

  5.   

    if Assigned(frmTip) then
      frmTip.Free;这样试试~~
      

  6.   

    不好意思,还是没有明白。frmTip不是模态窗体,而且自己可以关闭自己,没有办法取得ModelResult值,如果是用FreeAndNil的话,窗体只是闪了一下就被free。举个极端的例子,如果要求定时器在100个小时之后再卸载窗体,那FreeAndNil前面怎么保证同样是100小时之后才运行FreeAndNil呢?比较麻烦。
      

  7.   

    //设置一个TIMER专门用来看着frmTip,Timer.Tag作为frmTip的Free计时器。
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      if Assigned(frmTip) then
      begin
        Timer1.Tag :=Timer1.Tag +1;
        if Timer1.Tag >100 then  
        begin
          FreeAndNil(frmTip);
          Timer1.Tag :=0;
        end;
      end else
        Timer1.Tag :=0;
    end;
      

  8.   

    TfrmTip 中设个TTimer,Enable设为True;时间设为2000,
    procedure TfrmTip.Timer1Timer(Sender:TObject);
    begin
      self.close;
    end;调用窗体时
    procedure Showfrm;
    var Aform:TfrmTip;
    begin
      Aform:=TfrmTip.create(Application);
      try 
        Aform.Show;
      finally
        Aform.free;
      end;
    end;