VCL组件的引用!

MAX·WOODS 2003-02-28 09:28:29
设以下两个组件:

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指针!怎么解决这个问题?
...全文
43 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fancier 2003-03-01
  • 打赏
  • 举报
回复
学习!
xzgyb 2003-03-01
  • 打赏
  • 举报
回复
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;
xzgyb 2003-03-01
  • 打赏
  • 举报
回复
覆盖TComponent的Notification方法
MAX·WOODS 2003-02-28
  • 打赏
  • 举报
回复
我想了一个很复杂的办法,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分呀!要不我自个儿得了!
eulb 2003-02-28
  • 打赏
  • 举报
回复
思考中
先帮你up吧
bluemeteor 2003-02-28
  • 打赏
  • 举报
回复
留个记号~~明天再来

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧