0

我不确定我是否已经尽我所能解释了这一点,但是,我们开始......

我在一个表单上有 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 组件放回 from 会带来错误。

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

4

2 回答 2

8

您似乎认为引发异常是因为 Presence1 的客户端字段未设置 - 如果您确实收到异常“读取地址 00000034”,则意味着SetStatus()调用中的 Self 指针为nil。这表明您在未分配的TPresence引用上调用了 SetStatus() 。从您发布的代码段中实际上不可能说出原因,但它应该可以帮助您开始调试。

我仍然建议您为您自己的自定义组件中的所有组件引用编写一个适当的 setter 方法 - 首先是因为您在调试此类问题时有一个更好的钩子(您可以在那里设置断点),其次是因为您应该始终调用TComponent.此类链接组件上的FreeNotification()以便能够跟踪它们的破坏并将内部引用设置为nil

于 2009-03-16T05:38:13.177 回答
0

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

于 2009-03-16T10:28:36.613 回答