动态创建Frame没问题,如下所示:   var
      Ffrm_Manual:TFrm_Manual;
  if Ffrm_Manual<>nil then
  begin
    Ffrm_Manual.Free ;
    Ffrm_Manual:=nil ;
  end;
  if Ffrm_Manual=nil then
  begin
    Ffrm_Manual :=Tfrm_ManualCal.Create(Application);
    Ffrm_Manual .Parent :=Self ;
    Ffrm_Manual.Align:=alClient ;
    with Ffrm_Manual do但是我在Frame本体里面的释放的时候,有时候会报错,有时候又不报错,如下面所示:  procedure Tfrm_ManualCal.btn_CancelClick(Sender: TObject);
  begin
  if Ffrm_Manual<>nil then
  begin
    Ffrm_Manual.Free ;
    Ffrm_Manual:=nil ;
  end;
  end;

解决方案 »

  1.   

    frame中是不是有动态创建的控件
      

  2.   

    你能保证第一次Ffrm_Manual<>nil的时候去调用Free就是对的吗?Ffrm_Manual其实是一个指针如果它指向的是对象实例,那你这样用就没错,如果它是一个随机的地址,那调用Free就会报错了。除了判断是不是nil之外,我觉得你还可以加入(Ffrm_Manual.ClassName = 'TFrm_Manual')的判断。
      

  3.   

    “有时候会报错,有时候又不报错”
    楼主代码没贴全,看不出问题啊。现在只能建议想办法让问题必现。
    另外,释放前加这句判断下
    if Assigned(Frame) then 
      

  4.   


    var
      frm_Main: Tfrm_Main;
       FMainView:TMainView;
        Ffrm_Manual:Tfrm_ManualCal ;
    我声明为全局变量,但是看不出来
      

  5.   


    我原来是if Assigned( Ffrm_Manual) 判断,也还是偶尔有,偶尔没有,
    下面的代码是在主窗体实现 if Ffrm_Manual<>nil then
      begin
        Ffrm_Manual.Free ;
        Ffrm_Manual:=nil ;
      end;
      if Ffrm_Manual=nil then
      begin
        Ffrm_Manual :=Tfrm_ManualCal.Create(Application);
        Ffrm_Manual .Parent :=Self ;
        Ffrm_Manual.Align:=alClient ;
        with Ffrm_Manual do下面的代码是在Tfrm_ManualCal窗体里实现// ShowMessage(Ffrm_Manual.ClassName);
      if (Ffrm_Manual<>nil) and (Ffrm_Manual.ClassName = 'Tfrm_ManualCal') then
      begin
        Ffrm_Manual.Free ;
        Ffrm_Manual:=nil ;
      end;
    就是有时候有,有时候没有
      

  6.   

    下面的代码是在Tfrm_ManualCal窗体里实现// ShowMessage(Ffrm_Manual.ClassName);
      if (Ffrm_Manual<>nil) and (Ffrm_Manual.ClassName = 'Tfrm_ManualCal') then
      begin
        Ffrm_Manual.Free ;
        Ffrm_Manual:=nil ;
      end;就是有时候有,有时候没有不好意思,上面忘记写了,是在取消按钮下面的事件
    procedure Tfrm_ManualCal.btn_CancelClick(Sender: TObject);
    begin
     // ShowMessage(Ffrm_Manual.ClassName);
      if (Ffrm_Manual<>nil) and (Ffrm_Manual.ClassName = 'Tfrm_ManualCal') then
      begin
        Ffrm_Manual.Free ;
        Ffrm_Manual:=nil ;
      end;
    end;前面说中断不能看到,后面看了是我比较的类名写错了,少些了'Cal',呵呵,Tfrm_Manual改为Tfrm_ManualCal就可以了
      

  7.   

    主窗体代码  if Ffrm_Manual<>nil then
      begin
        Ffrm_Manual.Free ;
        Ffrm_Manual:=nil ;
      end;
      if Ffrm_Manual=nil then
      begin
        Ffrm_Manual :=Tfrm_ManualCal.Create(Application);
        Ffrm_Manual .Parent :=Self ;
        Ffrm_Manual.Align:=alClient ;
        with Ffrm_Manual do
        begin
    被调用的Frame内部的一个Cancel按钮的事件  procedure Tfrm_ManualCal.btn_CancelClick(Sender: TObject);
    begin
     // ShowMessage(Ffrm_Manual.ClassName);
      if Assigned(Ffrm_Manual) and (Ffrm_Manual.ClassName = 'Tfrm_ManualCal') then
      begin
        Ffrm_Manual.Free ;
        Ffrm_Manual:=nil ;
      end;
    end;
    就是报内存越界这个错误
      

  8.   

    不要在对象的事件里释放本身
    因为btn_Cancel.OnClick释放Frame,会导致btnCancel自己释放,所以可能出错
    可以用发WM_Close消息之类的方法关闭,而不是直接Free
      

  9.   

    我建议把Ffrm_Manual:=nil ;这一句写在Tfrm_ManualCal.OnDestroy里面
      

  10.   

    试一下这样写。if Assigned(Ffrm_Manual) then
      begin
        Ffrm_Manual.Free ;
        Ffrm_Manual:=nil ;
      end;
      

  11.   


    谢谢哈,我使用了下面的方法   SendMessage(Self.Handle, WM_CLOSE, 0, 0)
    就可以了
      

  12.   

    发现另外一个新问题,当我使用
      SendMessage(Self.Handle, WM_CLOSE, 0, 0)
    方法后,如果下面也有一个 Frame的话,Frame上的按钮的Caption 看不见了,比如我先让FrameA显示了,然后我再显示Fram2,然后我发送WM_CLOSE,然后FramA显示出来,发现按钮上的Caption看不见了,这是为什么呢
      

  13.   

    上面是没有caption
    下面是有caption