我的一段代码用来创建和显示窗体,可是,当第一次窗体正常创建和关闭后,第二次创建时经常会报错inaccesible value代码是这样的:
  if not Assigned(frmOrder) then frmOrder := TfrmOrder.Create(Application);
  frmOrder.Show();
  frmOrder.WindowState := wsMaximized;并且在frmOrder的Close 里做了
Action := caFree;
并在frmOrder的Destroy 里做了
frmOrder := nil在程序开始时的自动创建中已经去掉了的,那么为什么第二次创建时会出错呢?
调试时是
TfrmOrder.Create(Application) 出现上述错误,这个要怎么解决?

解决方案 »

  1.   

    frmOrder := nil也写在close事件中试试,我以前也是这样做的。子窗体关闭时的代码:
    procedure Tfmczview_edt.FormClose(Sender: TObject; var Action: TCloseAction);
    beginMainForm.fmczview_edt:=nil;
    Action := caFree;end;主窗体打开子窗体的代码
    procedure TMainForm.N11Click(Sender: TObject);
    begin
    if fmczview_edt= nil then
    fmczview_edt := Tfmczview_edt.Create(self);
    end;在主窗体的public
    fmczview_edt:Tform;
      

  2.   

    写在Close 里是一样的啊,我之前也是写在Close 里的,后来写到 Destroy里,都是一样的,你们没有遇到这样的问题吗。
    我的这个窗体是一个MDIChlid 窗体,一个MDI窗体中有多个MDIChlid窗体,有时个一个MDIChild 窗体的首次打开也会出这样的错误
      

  3.   

    看出你这是mdi窗体了,去掉frmOrder := nil,因为你已经把对象生命期的管理权交给对象的父亲了,而且好像不需要frmOrder.Show();刚创建必然是显示把我写得给你一些看看:
    if assigned(FChargeFrm) then
        FreeAndNil(FChargeFrm);
      {}
    FChargeFrm := TChargeFrm.Create(false);
    {注:我的create 重写了,你写成nil就是了}
    再说两句,你这个子窗体和主窗体是依赖关系,不要让父亲管理生命期
      

  4.   

    我是这样解决的:在子窗体的FormDestroy事件中添加
    Fm_pwd:=nil;
    但是,编译过后,新的问题出现了,在不关闭子窗体的前提下,第二次新建同一个子窗体报错,这是什么原因呢?郁闷啊,哪位高手给我解答一下................