24

Delphi VCL 组件的“标签”属性有什么特定用途吗?我已经用谷歌搜索了一些使用它作为“颜色”属性或使用值作为指针地址的示例,但是使用它是“好习惯”,还是因为它与UI 的程序逻辑?

4

8 回答 8

37

“标签”属性作为“货物容器”存在,无论您想用它做什么。

当您有许多类似的组件共享一个事件处理程序时,它通常用于事件处理程序。事件处理程序可以找到它的调用者,然后查询它的标记值以获取更多关于它应该作用的信息。

编辑:

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

于 2009-11-06T22:01:00.317 回答
11

它是向任何组件添加一条信息的地方,即使您没有该组件的源。应该小心使用它,因为每个组件只能用于一个目的。出于这个原因,图书馆不应该使用它。

于 2009-11-06T22:01:41.540 回答
6

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

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

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

告诉我:有多少次你发现自己想在 Tag 属性中存储一个新值,但你意识到这个属性已经用于不同的目的(如果每个属性中都有一个“Tag2”属性就好了)零件...)。

于 2013-08-12T10:16:23.597 回答
5

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

于 2009-11-06T22:02:34.403 回答
3

它还可以用于分组目的,例如您想要访问具有特定标签值的所有组件,而不管组件的类型如何。

于 2009-11-06T22:03:32.860 回答
3

这很棒!免费赠品。我一直使用它来存储与对象关联的另一条信息。

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

您可以将它用作对象被访问次数的计数器,或者其他任何东西。

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

于 2009-11-07T00:10:08.580 回答
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;

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

于 2009-11-09T19:23:26.177 回答
2

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

一个简单的示例:您有一个笔记本(就像没有标签的页面控件),因此您可以将按钮定义为标签并编写

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

更复杂的样本;一个整数可以容纳 16 个按位布尔值;然后我可以检查发件人最多 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;

你明白了

于 2012-01-26T16:44:38.500 回答