non*_*one 0 delphi debugging events delphi-2009
我正在寻找检查事件是否已分配的代码,如果是,则触发它.
什么代码管理事件?
建议?
我有一个自定义组件,连接到AdoQuery,持有TField.我的组件,不火OnSetText的TField,而其他部件允许的火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中跟踪调用此代码的代码?
通常,事件处理程序将使用如下声明的属性声明:
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如果您发现断点经常触发,您可能希望在内容上设置断点条件.