设以下两个组件:TA=class(TComponent)
  
   ...end;TB=class(TComponent)
  private
    FB:TA;
  published
    property A:TA read FA write FA;
end;将这两个组件放到Form1上后为A1,B1将B1.A在Inspector中设为B1.A=A1,这时将A1从Form1从删除,再点击B1则出现错误!这是因为B1.A=A1,而A1被删除了,B1.A就指向一个nil指针!怎么解决这个问题?

解决方案 »

  1.   

    我想了一个很复杂的办法,Overload了TA的BeforeDestruction方法(在TObject中定义),产生一个OnBeforeDestroy事件(在TA中定义为TNotifyEvent),在TB中定义SetA方法和OnTABeforeDestory过程,将TB.A的Write过程设为SetA,在SetA中保存A.OnBeforeDestroy指针,将TB.OnTABeforeDestory替换之,这样,就可以在TB.A指向的TA的实例Destory前知道该事件。
    下面就简单了,在TB.OnTABeforeDestory中加入一行:A:=nil;搞定!这样做就可将B1中引用了A1的属性B1.A在A1被删除前得到一个通知,收到该通知后就将B1.A设为nil,Delphi的Inspector就不会找到一个指错了地方的B1.A了!靠!就没有更简单的方法吗?能不能自动完成这个功能?大家想办法呀!有100分呀!要不我自个儿得了!
      

  2.   

    TB=class(TComponent)
      private
        FB:TA;
      protected
            procedure Notification(AComponent: TComponent; Operation: TOperation); override;
      published
        property A:TA read FA write FA;
    end;procedure TB.Notification(AComponent: TComponent; Operation: TOperation); 
    begin
      if (Operation = opRemove) and (AComponent = A) then
        A := nil;
        
    end;