如何识别哪个控件是Sender?

How to identify which control is Sender?

我对所有虚拟树视图 (TVirtualStringTree) 使用通用程序,因此我只有 1 个代码需要维护,例如 OnClick 我使用 Common_VST_OnClick,所有 VST 控件都已设置:

procedure TForm1.Common_VST_OnClick(Sender: TObject);

为了执行基于 VST 在点击过程中调用此代码的代码,我意识到我使用许多不同的方法来识别哪个控件是发件人:

if Sender = VST1 then   

if Sender.Name = VST1.Name then    

if TVirtualStringTree(Sender) = VST1 then

if TVirtualStringTree(Sender).Name = VST1.Name then

if TVirtualStringTree(Sender).Name = 'VST1' then

最后一个可能是最糟糕的,因为名称是硬编码的,所以我试图在所有过程中只使用一种类型的标识。

识别哪个控件是发件人的最佳方法是什么?

您应该更喜欢使用对象标识的测试。也就是说,你问题中的第一个测试:

if Sender = VST1 then

对象引用如SenderVST1 是对象的地址。如果两个这样的地址相等,则引用指向同一个对象。反之亦然。

基于控件名称的测试可以工作但很脆弱。多个控件可以具有相同的名称。可以更改控件名称但不更新程序中该名称的所有使用。

至于类型转换选项

if TVirtualStringTree(Sender) = VST1 then

类型转换对对象标识没有影响,因此没有必要。永远不要将操作数类型转换为对象身份测试,因为这样做是虚假的。