【问题标题】:how to debug an event that is not fired even if its assigend如何调试即使已分配也未触发的事件
【发布时间】:2013-03-12 11:45:37
【问题描述】:

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

什么代码管理这些事件?

建议?

我有一个自定义组件,它连接到AdoQuery,它保存TField。我的组件不会触发TFieldOnSetText,而其他组件甚至允许触发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 中跟踪调用此代码的代码?

【问题讨论】:

    标签: delphi debugging events delphi-2009


    【解决方案1】:

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

    property OnMyEvent: TMyEvent read FOnMyEvent write FOnMyEvent;
    

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

    procedure TMyComponent.DoMyEvent;
    begin
      if Assigned(FOnMyEvent) then
        FOnMyEvent(Self);
    end;
    

    最后,你需要寻找DoMyEvent被调用的地方。


    作为一个工作示例,我们可以使用TFieldOnSetText 事件。这是这样声明的:

    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;
    

    然后您可以继续查找该属性被分配到的位置,但是会有很多地方发生这种情况。所以,如果你想调试所有这些,你只需要启用调试 DCU 并在TField.SetEditText 中设置一个断点。如果您发现断点触发过于频繁,您可能希望在Value 的内容上设置断点条件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-08
      • 2015-11-22
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多