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

我的表单上有 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 中互不依赖的过程可以正常工作。

德尔福7

跟进:从 mghie 的评论中,我重新考虑了这一点。

我从表单中删除了 TPresence 组件(这导致了一些奇怪的 IDE 错误,这可能与它有关)并在设计时创建了它,分配了所需的所有内容。现在它可以工作了,但是将 TPresence 组件放回原处会再次出现错误。

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

有帮助吗?

解决方案

您似乎认为引发异常是因为 Presence1 的 client 字段未设置 - 如果您确实收到异常“Read of address 00000034”,则意味着 Self 指针在 设置状态() 呼叫是 . 。这表明你打电话 设置状态() 在未分配的 存在感 参考。从您发布的代码片段中实际上不可能说出其原因,但它应该让您开始调试。

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

其他提示

我们可能需要更多的代码。这是可能的,你是不正确创建TPresence的一个实例,它会给你你所遇到的错误。试着给我们一个简单越好的代码片段,导致你的错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top