Delphi VCL组件的“Tag”属性的目的是什么?

时间:2009-11-06 21:56:42

标签: delphi user-interface vcl

Delphi VCL组件的'Tag'属性是否有任何特定用途? 我用Google搜索了几个例子,例如,使用'color'属性或者使用值作为指针地址,但使用它是“好习惯”,还是因为它与UI的程序逻辑?

8 个答案:

答案 0 :(得分:36)

“tag”属性作为“货物集装箱”存在于您可能想要做的任何事情中。

当你有很多类似的组件共享一个事件处理程序时,它经常用于事件处理程序。事件处理程序可以找到它的调用者,然后查询其标记值,以获得有关它应该采取什么行动的更多信息。

编辑:

示例:计算器应用可能会使用各自的数字标记数字按钮...愚蠢且不完整的示例,但您明白了。然后,事件处理程序可以将数字添加到显示和累加器中,直接从标记中添加,而不必弄清楚哪个按钮可以用来做什么。

答案 1 :(得分:11)

即使您没有该组件的源,也可以向任何组件添加一条信息。应该谨慎使用它,因为每个组件只能用于一个目的。因此,图书馆永远不应该使用它。

答案 2 :(得分:5)

我有一些Tag属性的基本问题。 不完全是这个属性本身,因为它按预期工作。

一般来说,我认为使用任何通用/通用/多用途变量作为“不良做法”。 它们在调试期间非常有用,但在生产/关键任务环境中非常有害。 它们降低了代码的可读性和可理解性,因为没有人知道“Tag”命名属性或属性的作用。当然你知道为什么要使用这个变量。但迟早你会忘记(我知道你会)并且依靠这个值会让事情变得更复杂。 这就是为什么我们应该正确地命名每个变量和属性,以帮助我们理解代码的作用。

使用Tag属性只是一种变通方法/快捷方式,可以避免实现可理解且编写良好的代码。 这是实践,它让人上瘾。 下次需要存储绑定到组件的新整数值时,您将使用Tag属性,而不考虑任何其他方式来存储所需的值。 在Tag属性中存储指针是一个可怕的想法:每次调试指针时都必须转换此值。

告诉我:你有多少次发现自己想要在Tag属性中存储新值,但是你意识到这个属性已经用于不同的目的(如果只有'Tag2'那么每个组成部分的财产......)。

答案 3 :(得分:4)

正如其他人所说,这是一个放置任何东西的地方。通常,当通过对象引用或指针关联两个对象时,这会派上用场。标签的大小恰好可以容纳一个指针,因此,如果您需要将一个对象绑定到列表框中的一个项目,它就变得非常简单了。

答案 4 :(得分:3)

此外,它可用于分组目的,假设您想要访问具有特定标记值的所有组件,而不管组件的类型如何。

答案 5 :(得分:3)

太棒了!一个免费赠品。我一直用它来存储与该对象相关的一条额外信息。

我经常存储一个指向相关数据结构的指针,或者有时是一个整数,它可能是某个其他数组的索引。

您可以将其用作访问对象的计数器,或者其他任何内容。

唯一的缺点是,如果你的程序使用大量内存并且你有数百万个对象,那么每个标签的4个字节会加起来,特别是如果你不使用它。在这种情况下,对于最多产的对象类型,您可能希望创建自己的版本而不使用标记。

答案 6 :(得分:3)

您的表单上有2个按钮,其中一个设置Tag = 1,另一个设置Tag = 2.现在您将相同的 OnClick事件分配给两个按钮并将代码写入这样:

procedure TForm28.Button1Click(Sender: TObject);
begin
  case (Sender as TButton).Tag of
   1: Caption := 'you pressed button 1';
   2: Caption := 'you pressed button 2';
  end;
end;

或更紧凑:

procedure TForm28.Button1Click(Sender: TObject);
begin
  Caption := 'you pressed button ' + IntToStr((Sender as TButton).Tag);
end;

基本上,Tag会让您识别触发事件的控件。想想你是否有一个带有动态创建按钮的表单......一个包含数据库用户的列表,并在每条记录上放置一个“删除用户”按钮。在这种情况下,您无法为每个按钮创建事件,您将创建一个将分配给所有按钮的事件...例如,您可以在标签中输入用户标识。这样,当您实现事件来处理所有按钮时,您将知道要删除的用户。

答案 7 :(得分:2)

我一直使用标签。 这里有一些例子;

一个简单的示例:你有一个笔记本(就像没有标签的pagecontroll) 所以你可以将按钮定义为标签并写入

NoteBook.ActivePage := TButton(Sender).Tag;

更复杂的样本; 一个整数可以容纳16个按位的bolleans; 然后,我可以检查最多16个条件的发件人,以决定如何继续定价

If (BitCheck (Bit2,TButton(sender).tag=True) And BitCheck(bit12,TButton(Sender).Tag=False) Then
Begin
end;

If (BitCheck (Bit9,TButton(sender).tag=True) Or BitCheck(bit14,TButton(Sender).Tag=True) Then
Begin
end;

你明白了