程序有两个窗体TForm1和TForm2;
我在TForm1的Private区加了如下代码:
private
  Form2: TForm2;
然后TForm1窗体上加一按钮,按钮的事件代码如下:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if not Assigned(Form2) then Form2 := TForm2.Create(Application);
  Form2.Show;
end;
我设了TForm2的Close事件的Action := crFree,我的目的就是TForm2关闭的时候释放。第一次点击按钮当然没有问题,但当你将Form2关闭,再次点击Form1的Button时,就出现了内存访问的错误,百思有点不解,感觉这样的代码应该很符合逻辑,但为什么会出错呢?

解决方案 »

  1.   

    Form2.free只是释放
    但还是会指向原来的地址
    Assigned()当然为真了
      

  2.   

    Form2不等於nil呀.
    你這應是不行的.看我的代碼:function FindChildForm(aFormClass: TFormClass): TForm;
    var
      i: integer;
    begin
      Result := nil;
      for i := 0 to Application.MainForm.MDIChildCount - 1 do
      begin
        if Application.MainForm.MDIChildren[i].ClassName
          = aFormClass.ClassName then
        begin
          Result := Application.MainForm.MDIChildren[i];
          Break;
        end; // end if
      end; // end for
    end;function TFrmMain.CreateChildForm(aFormClass: TFormClass): TForm;
    begin
      Result := FindChildForm(aFormClass);
      if not Assigned(Result) then
      begin
        Perform(WM_SETREDRAW, 0, 0);
        try
          Result := aFormClass.Create(Application.MainForm);
        finally
          Perform(WM_SETREDRAW, 1, 0);
          RedrawWindow(Handle, nil, 0, RDW_FRAME + RDW_INVALIDATE +
            RDW_ALLCHILDREN + RDW_NOINTERNALPAINT);
        end;
      end;
      Result.Show;
    end;
      

  3.   

    Assigned是判断对象是否为空。所以free后将对象:= nil;就可以了。
      

  4.   

    在MDIForm调用MDIChild窗体时要这样用
    if not Assigned(Form2) then begin
        Form2:=TForm2.Create(Self);
        Form2.Show;
      end else
        Form2.BringToFront;另外在MDIChild的OnClose, OnDestroy中要以下代码 Form2为MIDChild窗体的名称
    procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action:=caFree;
    end;procedure TForm2.FormDestroy(Sender: TObject);
    begin
      Form2:=nil;
    end;
      

  5.   

    设了TForm2的Close事件的Action := crFree,然后再加一句,Form2 := nil
      

  6.   

    Form2.free只是释放,但指向原来的地址没有变,所有在关闭窗体的时候要
    让Form2所指地址释放。
    加一句Form2:=Nil就ok了
      

  7.   

    我觉得用下面的方式会好一些
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Application.CreateForm(TForm2, Form2);
      Form2.Show;
      Form2.Free;
    end;
      

  8.   

    我觉得用下面的方式会好一些
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Application.CreateForm(TForm2, Form2);
      Form2.Show;
      Form2.Free;
    end;hqhhh(枫叶) 不要誤人子弟呀.
    這樣窗體能顯示出來嗎
      

  9.   

    procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      form2.Release;
      form2:=nil;
    end;