如何调试即使已分配也未触发的事件

时间:2013-03-12 11:45:37

标签: delphi debugging events delphi-2009

我正在寻找检查事件是否已分配的代码,如果是,则触发它。

什么代码管理事件?

建议?

我有一个与AdoQuery相关联的自定义组件,其中包含TField。我的组件不会触发OnSetText的{​​{1}},而其他组件则会触发TField偶数。我试图找到原因。

好的,这是源代码:

OnSetText

如何在Delphi中跟踪调用此代码的代码?

1 个答案:

答案 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的内容上设置断点条件。