2013-03-12 77 views
0

我正在查找检查事件是否被分配的代码,如果是,则触发它。如何调试即使其assigend不被解雇的事件

什么代码管理事件?

对此提出建议?

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

如何跟踪,使调用此代码,德尔福里面的代码?

回答

7

典型的事件处理程序将与属性声明声明如下:

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的内容做出断点条件。