我不确定我是否已经解释了这个我能做到的最好但是,我们在这里......
我在表单上有2个自定义组件,它们在设计时通过IDE链接在一起.每当我从组件上调用一个过程时,我都会获得访问冲突,
模块"Project2.exe"中地址0049A614的访问冲突.读取地址00000034.
这是我的代码的一小部分
TMyClient = class(TClientSocket) {...} end;
和...
TPresence = class(TComponent) private ftheClient: TMyClient public procedure SetStatus(status: string); published property UserName : string read fUserName write fUserName; property theClient: TMyClient read ftheClient write ftheClient; end; procedure TPresence.SetStatus(status: string); begin try ***** if theClient = nil then Exception.Create('theClient is Nil'); except on e:Exception do MessageDlg(e.classname+', '+e.message, mtWarning, [mbOK], 0); end; {...} end;
0049A614在*****,IDE停在此处.
我也尝试过在运行时进行分配
Presence1.theClient := MyClient1;
没有运气
使用Presence1或MyClient1中不依赖于彼此的程序可以正常工作.
德尔福7
跟进:从mghie的评论,我重新思考它.
我从表单中删除了TPresence组件(这导致了一些奇怪的IDE错误,可能与它有关)并创建了它的设计时间,分配了所需的一切.现在它可以正常工作,但是将TPresence组件重新放回到从上会带来错误.
谢谢你的帮助,我现在应该能够解决这个问题,如果我不能重新打开另一个问题:)
您似乎认为异常是由于Presence1的客户端字段未设置而引发的 - 如果您获得异常"读取地址00000034",则表示SetStatus()调用中的Self指针为nil.这表示您在未分配的TPresence引用上调用SetStatus().从您发布的代码片段中确切地说出原因是不可能的,但它应该让您开始调试.
我仍然建议你为自己的自定义组件中的所有组件引用编写一个正确的setter方法 - 首先是因为你在调试这些问题时有一个更好的钩子(你可以在那里设置一个断点),其次是因为你应该总是调用TComponent. FreeNotification()对这些链接的组件能够跟踪它们的破坏并将内部引用设置为nil.