2009-11-06 74 views
21

Delphi VCL組件的'Tag'屬性是否有特定的用途? 我用谷歌搜索了一些例子,例如,'color'屬性或者使用該值作爲指針地址,但是使用它是'好做法',還是被認爲是'壞習慣'程序邏輯到UI?Delphi VCL組件的'Tag'屬性的用途是什麼?

+0

這不適用於-just-德爾福,但它仍然是一個非常好的問題,同樣有很好的答案。舉個例子,只是單挑 – Kawa 2009-11-09 19:30:03

回答

36

「標籤」屬性作爲「貨物集裝箱」存在,無論您想要如何處理它,

當你有很多類似的組件共享一個事件處理程序時,它經常用於事件處理程序。事件處理程序可以找到它的調用者,然後查詢它的標籤值以獲得更多關於它應該採取行動的信息。

編輯:

例子:一個計算器應用程序,可將其標記各自的數...愚蠢和不完整的示例將數字按鍵,但你的想法。然後事件處理程序可以將數字從標籤中拉出到顯示和累加器中,而不必去確定哪個按鈕是做什麼的。

+0

+1。 – 2011-10-05 20:06:31

11

即使您沒有該組件的源代碼,它也可以將信息添加到任何組件。應該小心使用它,因爲每個組件只能用於一個目的。出於這個原因,圖書館不應該使用它。

+0

只用過一次?因爲在你只能改變一次標籤信息?所以如果我要做一些像TCard.tag:= 3;我以後不能做TCard.tag:= 5; ? – 2013-11-24 04:23:46

+0

您一次只能用於一個目的。假設您將THelper放置在開始將幫助文本分配給每個可找到的標籤的表單上。 – 2013-11-24 09:39:49

4

正如其他人所說,這是一個放置任何東西的地方。通常這在通過對象引用或指針關聯兩個對象時派上用場。這個標籤的大小恰好可以容納一個指針,所以如果你需要將一個對象綁定到一個列表框中,它變得非常簡單。

+2

,並希望當64位德爾福到達時指針仍然適合標籤... – frogb 2009-11-06 23:07:14

+1

@frogb:這樣做! – 2011-10-05 20:06:54

3

此外,它可以用於分組目的,比如說你想要訪問具有特定標籤值的所有組件,而不管組件的類型如何。

3

太棒了!免費贈品。我一直使用它來存儲一個與對象相關的附加信息。

通常我會存儲一個指向關聯數據結構的指針,有時也可能是一個整數,它可能是某個其他數組的索引。

你可以用它作爲訪問對象時間的計數器,或者其他任何東西。

唯一的缺點是如果你的程序使用大量內存,並且你有數百萬個對象,那麼每個標記的4個字節會加起來,特別是如果你不使用它。在這種情況下,對於最多產的對象類型,您可能希望創建不帶標籤的自己的版本。

+2

這不太可能是一個嚴重的問題,因爲您的「數百萬個對象」不太可能具有Tag屬性。只有VCL類擁有它,而且你並不傾向於將它們中的很多都同時實例化。 – 2009-11-07 02:11:17

+0

哦,你是對的。標準Delphi中的大多數樹和列表項都沒有標籤。我將它與我使用的LMDInnovative的ElTree軟件包混合在一起,它在樹中的每個項目上都有一個標籤。我的樹可以有數百萬個物品,因此,我擁有數百萬個標籤。但真正的重點是我喜歡這種能力 – lkessler 2009-11-07 03:48:17

+0

樹和列表項有一個'數據'屬性,這相當於'標籤'。 – 2009-11-08 06:29:17

3

你有你的窗體上的2個按鈕,一個你設置的標籤= 1,和另外一個標籤= 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; 

基本上,標籤會讓你確定哪些控制觸發事件。想想如果你有一個帶有動態創建按鈕的表單...一個包含數據庫用戶的列表,並在每個記錄上放置一個按鈕「刪除用戶」。在這種情況下,您無法爲每個按鈕創建一個事件,您將創建一個將分配給所有按鈕的事件...並且您可以將標記放入用戶標識中。這樣,當你實現事件來處理所有的按鈕時,你會知道要刪除的用戶。

+0

代碼中有編譯錯誤:'(發件人爲TButton)'應該是'(發件人爲TButton).Tag'。 – ZzZombo 2016-03-15 08:20:00

+0

@ZzZombo你是對的,謝謝 – 2016-03-15 16:11:33

2

我一直使用標籤。 這裏是一些例子;

一個簡單的示例:您有筆記本(像沒有選項卡的pagecontroll) 所以可以定義按鈕用作標籤和寫入

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

一個更復雜的樣品; 一個整數可以容納16位bolleans; 我可以再檢查發件人多達16個條件來決定如何繼續pricedure

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; 

你的想法

5

我有標記屬性的一些基本問題。 不完全這個屬性本身,因爲它按預期工作。

一般來說,我認爲使用任何通用/一般/多用途變量作爲「不良做法」。 它們在調試過程中很有用,但在生產/任務關鍵環境中非常有害。 它們減少了代碼的可讀性和可理解性,因爲沒有人知道名爲屬性或屬性的'標籤'是什麼。當然你知道你爲什麼使用這個變量。但遲早你會忘記(我知道你會的),依靠這個價值會讓事情變得更加複雜。 這就是爲什麼我們應該正確地命名每個變量和屬性來幫助我們理解代碼的作用。

使用標籤屬性只是一個解決方法/快捷方式,以避免實現可理解和寫得很好的代碼。 這是實踐,它是令人上癮的。 下一次需要存儲綁定到組件的新整數值時,您將使用Tag屬性,而不考慮任何其他方式來存儲所需的值。 並且在Tag屬性中存儲一個指針是一個可怕的想法:每次調試指針時都必須施加此值。

告訴我:您發現自己有多少次想要在Tag屬性中存儲新值,但您意識到此屬性已用於其他目的(如果只有'Tag2 '在每個組件中的財產......)。

+2

標籤已經使用?沒問題。使用HelpContext 是的,但我明白你的觀點。 – 2013-08-12 15:33:03