如何识别哪个控件是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
对象引用如Sender
或VST1
是对象的地址。如果两个这样的地址相等,则引用指向同一个对象。反之亦然。
基于控件名称的测试可以工作但很脆弱。多个控件可以具有相同的名称。可以更改控件名称但不更新程序中该名称的所有使用。
至于类型转换选项
if TVirtualStringTree(Sender) = VST1 then
类型转换对对象标识没有影响,因此没有必要。永远不要将操作数类型转换为对象身份测试,因为这样做是虚假的。
我对所有虚拟树视图 (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
对象引用如Sender
或VST1
是对象的地址。如果两个这样的地址相等,则引用指向同一个对象。反之亦然。
基于控件名称的测试可以工作但很脆弱。多个控件可以具有相同的名称。可以更改控件名称但不更新程序中该名称的所有使用。
至于类型转换选项
if TVirtualStringTree(Sender) = VST1 then
类型转换对对象标识没有影响,因此没有必要。永远不要将操作数类型转换为对象身份测试,因为这样做是虚假的。