0

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

什么代码管理事件?

建议?

我有一个自定义组件,它连接到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;

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

4

1 回答 1

7

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

property OnMyEvent: TMyEvent read FOnMyEvent write FOnMyEvent;

因此,为了触发它,代码将执行FOnMyEvent,因此您需要搜索组件的源代码以查找FOnMyEventOnMyEvent. 通常你会发现这样的东西:

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如果您发现断点触发太频繁,您可能希望根据内容设置断点条件。

于 2013-03-12T11:47:39.693 回答