可以实现某个窗体的
ME:=NIL;这个样子?

解决方案 »

  1.   

    恩,是这样的,我写了一个父窗体,是MDICHILD类型其他窗体继承它,我在ONCLOSE事件中加入
        
        action:=cafree;
        self:=nil;但是关闭子窗体的时候没有问题,再次打开子窗体时报错误。
      

  2.   

    if not Assigned(frmPrdtSet) then
            begin
                Application.CreateForm(TfrmPrdtSet, frmPrdtSet);
                frmPrdtSet.Show;
            end
        else
            begin
                frmPrdtSet.Show;
                frmPrdtSet.BringToFront;
            end;
    这个是我打开窗体的代码,这样还是出错误
      

  3.   

    跟踪了一下,没有执行self:=nil;这句
      

  4.   

    action:=cafree;//这里已经释放了
        self:=nil; // 这里没有意义了,编译器优化掉了这里问题是你销毁了frmPrdtSet的实体部分,但他的指针可能指向了一个无效空间,Assigned的时候,判断出错,你跟踪这里吧。
      

  5.   

    self=nil;
    改为frmPrdtSet:=nil才可以
      

  6.   

    “if not Assigned(frmPrdtSet) then”因为你判断的是frmPrdtSet这个指针变量是否指向一段内存地址
      

  7.   

    就是说,我需要更改判断的地方
    if not Assigned(frmPrdtSet) then
    那么,应该改成如何判断呢?
      

  8.   

    也只能这么判断,在close中
    self=nil;
    改为frmPrdtSet:=nil就行了
    除非你有其他的功能要求
      

  9.   

    关键的是,我是继承的窗体,这么说,我还是要在每个窗体中都在CLOSE事件中添加代码了?
      

  10.   

    为什么要继承一个FORM呢?创建一个FORM的另一个实例不成吗?你的问题不是继承导致的问题,而是frmPrdtSet生命周期的问题。
    if not Assigned(frmPrdtSet) then
    begin
    Application.CreateForm(TfrmPrdtSet, frmPrdtSet);
    frmPrdtSet.Show;
    end
    else
    begin
    frmPrdtSet.Show;
    frmPrdtSet.BringToFront;
    end;
    既然在关闭frmPrdtSet后就释放它了,为什么还需要写else里面的语句。直接改成这样更好点吧:
    if not Assigned(frmPrdtSet) then
    begin
    Application.CreateForm(TfrmPrdtSet, frmPrdtSet);
    frmPrdtSet.ShowModal;
    frmPrdtSet:=nil;
    end;
    在一个类的实现里要把它的一个实例的变量置为nil是做不到的,只能是在创建这个实例的地方做这个工作
      

  11.   

    呵呵,谢谢了主要是原来用。NET平台做B/S结构的东西,允许这么继承并执行很多内容,感觉上想这么做而已