我正在寻找检查事件是否已分配的代码,如果是,则触发它。
什么代码管理事件?
建议?
我有一个与AdoQuery
相关联的自定义组件,其中包含TField
。我的组件不会触发OnSetText
的{{1}},而其他组件则会触发TField
偶数。我试图找到原因。
好的,这是源代码:
OnSetText
如何在Delphi中跟踪调用此代码的代码?
答案 0 :(得分:7)
通常,将使用如下声明的属性声明事件处理程序:
property OnMyEvent: TMyEvent read FOnMyEvent write FOnMyEvent;
因此,为了触发它,代码将执行FOnMyEvent
,因此您需要在组件的源代码中搜索对FOnMyEvent
或可能OnMyEvent
的引用。通常你会发现这样的东西:
procedure TMyComponent.DoMyEvent;
begin
if Assigned(FOnMyEvent) then
FOnMyEvent(Self);
end;
最后,您需要查找调用DoMyEvent
的地方。
作为一个有效的示例,我们可以使用OnSetText
的{{1}}事件。这是这样声明的:
TField
这是对property OnSetText: TFieldSetTextEvent read FOnSetText write FOnSetText;
的唯一引用。因此,我们寻找导致此问题的OnSetText
:
FOnSetText
现在,procedure TField.SetEditText(const Value: string);
begin
if Assigned(FOnSetText) then FOnSetText(Self, Value) else SetText(Value);
end;
是一个私有方法,因此我们不需要在声明它的单元之外查看。它唯一使用的地方是SetEditText
:
TField.Text
然后你可以继续寻找分配该属性的地方,但会有很多地方发生这种情况。因此,如果要调试所有这些,只需启用调试DCU并在property Text: string read GetEditText write SetEditText;
内设置断点。如果您发现断点经常发生,您可能希望在TField.SetEditText
的内容上设置断点条件。