如何调试即使其assigend不被解雇的事件
问题描述:
我正在查找检查事件是否被分配的代码,如果是,则触发它。如何调试即使其assigend不被解雇的事件
什么代码管理事件?
对此提出建议?
我有一个自定义组件,即连接到AdoQuery
,它拥有TField
。我的组件不会触发TField
的OnSetText
,而其他组件甚至允许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;
如何跟踪,使调用此代码,德尔福里面的代码?
答
典型的事件处理程序将与属性声明声明如下:
property OnMyEvent: TMyEvent read FOnMyEvent write FOnMyEvent;
因此,为了激发它的代码将执行FOnMyEvent
,所以你需要搜索组件的源代码来引用FOnMyEvent
或可能的OnMyEvent
。通常你会发现这样的事情:
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;
然后,你可以继续寻找如该财产分配给地方,但会有很多地方出现这种情况的地方。因此,如果您想调试所有这些,只需启用调试DCU并在TField.SetEditText
内设置一个断点即可。如果您发现中断点太频繁发生,您可能希望对Value
的内容做出断点条件。