AV 当使用一个组件中的过程被另一组件调用时
-
19-08-2019 - |
题
我不确定我是否已尽我所能解释这一点,但是,我们开始......
我的表单上有 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的一个实例,它会给你你所遇到的错误。试着给我们一个简单越好的代码片段,导致你的错误。