AV当使用另一个组件调用的一个组件的过程时

时间:2009-03-16 03:41:47

标签: delphi delphi-7 custom-component access-violation

我不确定我是否已经解释了这个我能做到的最好但是,我们走了......

我在表单上有2个自定义组件,它们在设计时通过IDE链接在一起。每当我从组件上调用一个过程时,我都会获得访问冲突,

  

地址0049A614的访问冲突   在模块'Project2.exe'中。阅读   地址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中彼此不依赖的程序可以正常工作。

Delphi 7

跟进: 从mghie评论,我重新思考它。

我从表单中删除了TPresence组件(这会导致一些奇怪的IDE错误,可能与它有关),并创建了设计时间,分配了所需的一切。现在它可以正常工作,但是将TPresence组件放回到从上会带来错误。

谢谢你的帮助,我现在应该能够解决这个问题了,如果我不能重新开启另一个问题:)

2 个答案:

答案 0 :(得分:8)

您似乎认为引发异常是因为Presence1的客户端字段未设置 - 如果您确实获得异常“读取地址00000034”,则表示 SetStatus()中的Self指针电话是 nil 。这表示您在未分配的 TPresence 引用上调用 SetStatus()。从您发布的代码片段中确切地说出原因是不可能的,但它应该让您开始调试。

我仍然建议你为自己的自定义组件中的所有组件引用编写一个合适的setter方法 - 首先是因为你在调试这些问题时有一个更好的钩子(你可以在那里设置一个断点),第二个因为你应该总是在这些链接的组件上调用 TComponent.FreeNotification(),以便能够跟踪它们的销毁并将内部引用设置为 nil

答案 1 :(得分:0)

我们可能需要更多代码。您可能没有正确创建TPresence实例,它会给您带来您遇到的错误。尽量给我们一个简单的代码片段,它会导致您的错误。