如何调试未被触发的事件,即使它的assigend

non*_*one 0 delphi debugging events delphi-2009

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

什么代码管理事件?

建议?

我有一个自定义组件,连接到AdoQuery,持有TField.我的组件,不火OnSetTextTField,而其他部件允许的火OnSetText均匀.我试图找到原因.

好的,这是源代码:

procedure TForm1.ADOQuery1MydateSetText(Sender: TField; const Text: string);
var
  Garbage:TDateTime;
begin
  if TryStrToDate(text,Garbage) then
    Sender.AsString := Text
  else ShowMessage('so now what?');
end;
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*nan 7

通常,事件处理程序将使用如下声明的属性声明:

property OnMyEvent: TMyEvent read FOnMyEvent write FOnMyEvent;
Run Code Online (Sandbox Code Playgroud)

因此,为了触发它,代码将执行FOnMyEvent,因此您需要搜索组件的源代码以获取FOnMyEvent或可能的引用OnMyEvent.通常你会发现这样的事情:

procedure TMyComponent.DoMyEvent;
begin
  if Assigned(FOnMyEvent) then
    FOnMyEvent(Self);
end;
Run Code Online (Sandbox Code Playgroud)

最后,您需要查找DoMyEvent被调用的位置.


作为一个有效的例子,我们可以使用OnSetText事件TField.这声明如下:

property OnSetText: TFieldSetTextEvent read FOnSetText write FOnSetText;
Run Code Online (Sandbox Code Playgroud)

这是唯一的参考OnSetText.所以我们寻找FOnSetText导致这种情况的原因:

procedure TField.SetEditText(const Value: string);
begin
  if Assigned(FOnSetText) then FOnSetText(Self, Value) else SetText(Value);
end;
Run Code Online (Sandbox Code Playgroud)

现在,它SetEditText是一个私有方法,所以我们不需要在声明它的单元之外查看.它唯一使用的地方是作为属性设置器TField.Text:

property Text: string read GetEditText write SetEditText;
Run Code Online (Sandbox Code Playgroud)

然后你可以继续寻找分配该属性的地方,但会有很多地方发生这种情况.因此,如果要调试所有这些,只需启用Debug DCU并在其中设置断点即可TField.SetEditText.Value如果您发现断点经常触发,您可能希望在内容上设置断点条件.