我也注意过这个问题,好象它会保留在内存里,不过再创建后释放,新创建的是被
释放了,我也不明白,不过我猜窗体为nil值不见得是窗体释放的评价标准

解决方案 »

  1.   

    关于窗体的释放:Close()方法是将窗体隐藏,即form.hide;
    释放窗体或是控件的标准用法是Form.Free,其实Free方法只是调用了Destroy()方法,在窗体不为nil时进行资源的释放,但并不将窗体实例置为nil,只有窗体实例没有创始化之前值才为nil,否则你要显示的将窗体实例置为nil.
    释放窗体的标准用法是:
    1、对于模态窗体
    Form1 := TForm.Create(Self);
    try
      your process
      Form1.ShowModal;
    finally
      Form1.Free;
    end;//可以确保资源的释放,而不会重复创建窗体实例。
    2、对于非模态窗体
    if not Assigned(Form1) then//窗体实例为nil;
    begin
      Form1 := TForm1.Create(Self);
      Form1.Show;
    end;
    注意要在窗体的OnClose和OnDestroy事件中分别写入事件处理代码。
    OnClose:
    Action := caFree;
    OnDestroy:
    Form1 := nil;
    //这样确保form1在释放后置为nil值,不会重复创建窗体实例.
      

  2.   

    高手!模态窗体?非模态窗体
    非模态窗体是指dll,datamodule这些吗?对于这个我不是很清楚....
      

  3.   

    看看 system.pas :procedure TObject.Free;
    begin
      if Self <> nil then
        Destroy;
    end;
      

  4.   

    模态窗体是以独占方式打开的窗体,你可以试一下,当你Showmodal打开一个窗体时,其他窗体都不再响应
    非模态窗体,则相反
      

  5.   

    一般情况下,你只需要调用FREE,FREE是安全的做法.虽然现在FREE只判断了指针是否为NIL,当以后可能会有改进,为了便于代码的移植,你应该使用FREE
    我通常这样
    form1.free;
    form1:=nil;
    来释放,我发现只FREE,指针不是为nil,再次创建时会出错,所以用第二句话来将其强制设置为NIL.
      

  6.   

    我看见很多时候又有大虾把问题所在的pas单元引用了出来
    我搜索到system.pas在dephi5\source的Rtl文件夹里
    请问在碰到相关问题时怎么样去查找相关的pas单元,怎么样在其中找到
    我想要的相关问题,我搜索到system.pas在dephi5\source的Rtl文件夹里
    谢谢,请授我以渔!而不是单纯的鱼。
      

  7.   

    在Code Explorer  中你只要把鼠标指向相关过程或函数,就会显示其所在。PAS单元和行号,然后用VIEW——borwse打开相应单元就行了。
      

  8.   

    哦,我看到的怎么是一些汇编代码
    ILikeTomato(我爱吃番茄)看到的怎么是一些pascal代码?
      

  9.   

    在用 Use Debug DCUs 选项跟踪调试程序时,务必谨慎使用 Step Over 和 Trace Into ,只用 Trace Into 会跟踪得晕头转向。另,如果只是看看源码,建议用 yang6130(月明@沧海)说的的方法。
      

  10.   

    nil是可以作为判断窗体释放的评价标准的,不过在释放窗体的时候采用FreeAndNil(form1)的办法或from1.free;form1 :=nil。
    其中的原因是form1是个指向窗体的指针,调用free释放窗体时,系统只是把form1指向的内存释放了,而指针还是指向内存地址的,没有归零,所以必须归零(from1:=ni),才能用来作为判断的标准。
      

  11.   

    我是用 yang6130(月明@沧海) 的方法啊,看到form.free
    都是看到的汇编代码................