通常,事件处理程序将使用如下声明的属性声明:
property OnMyEvent: TMyEvent read FOnMyEvent write FOnMyEvent;
因此,为了触发它,代码将执行FOnMyEvent
,因此您需要搜索组件的源代码以查找FOnMyEvent
对OnMyEvent
. 通常你会发现这样的东西:
procedure TMyComponent.DoMyEvent;
begin
if Assigned(FOnMyEvent) then
FOnMyEvent(Self);
end;
最后,你需要寻找DoMyEvent
被调用的地方。
作为一个工作示例,我们可以使用 的OnSetText
事件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
:
property Text: string read GetEditText write SetEditText;
然后你可以继续寻找该属性被分配到的地方,但是会有很多地方发生这种情况。所以,如果你想调试这一切,你只需要启用 Debug DCUs 并在TField.SetEditText
. Value
如果您发现断点触发太频繁,您可能希望根据内容设置断点条件。