2009-11-06 14 views
21

क्या डेल्फी वीसीएल घटकों की 'टैग' संपत्ति के लिए कोई विशिष्ट उद्देश्य है? मैंने इसका उपयोग कुछ उदाहरणों के लिए किया है, उदाहरण के लिए, एक 'रंग' संपत्ति या मूल्य का उपयोग सूचक के पते के रूप में करते हुए, लेकिन इसका उपयोग करने के लिए यह 'अच्छा अभ्यास' है, या इसे 'खराब अभ्यास' माना जाता है क्योंकि यह संबंध है यूआई को प्रोग्राम तर्क?डेल्फी वीसीएल घटकों की 'टैग' संपत्ति का उद्देश्य क्या है?

+0

यह -just-Delphi पर लागू नहीं होता है, लेकिन यह अभी भी समान अच्छे उत्तरों के साथ एक बिल्कुल अच्छा सवाल है। उदाहरण के लिए बस एक सिर-अप – Kawa

उत्तर

36

"टैग" संपत्ति उस चीज़ के लिए "कार्गो कंटेनर" के रूप में है जो आप इसके साथ करना चाहते हैं।

कुछ घटनाओं के लिए अक्सर इसका उपयोग किया जाता है जब आपके पास एक ईवेंट हैंडलर साझा करने वाले बहुत से समान घटक होते हैं। इवेंट हैंडलर अपना कॉलर ढूंढ सकता है और उसके बाद इसके टैग वैल्यू से पूछताछ कर सकता है कि उसे क्या काम करना है इसके बारे में कुछ और जानकारी प्राप्त करें।

संपादित करें:

उदाहरण: एक कैलकुलेटर अनुप्रयोग उनके संबंधित संख्या ... मूर्खतापूर्ण और अधूरा उदाहरण के साथ संख्या बटन टैग कर सकते हैं, लेकिन आप विचार मिलता है। इवेंट हैंडलर उस नंबर को खींचने के बजाय टैग के बाहर डिस्प्ले और एक्सीम्युलेटर में जोड़ने के लिए नंबर खींच सकता है, यह जानने के लिए कि कौन सा बटन है।

+0

+1। –

11

यह किसी भी घटक को जानकारी का एक टुकड़ा जोड़ने का एक स्थान है, भले ही आपके पास उस घटक का स्रोत न हो। इसका सावधानी से उपयोग किया जाना चाहिए, क्योंकि आप प्रति घटक केवल एक उद्देश्य के लिए इसका उपयोग कर सकते हैं। इसी कारण से पुस्तकालयों का कभी भी इसका उपयोग नहीं करना चाहिए।

+0

केवल एक बार इस्तेमाल किया जाता है? जैसा कि आप केवल एक बार टैग जानकारी बदल सकते हैं? तो अगर मैं कुछ ऐसा करना चाहता था जैसे TCard.tag: = 3; मैं बाद में TCard.tag नहीं कर सकता: = 5; ? –

+0

आप इसे एक समय में केवल एक उद्देश्य के लिए उपयोग कर सकते हैं। मान लीजिए कि आप एक थैपर को उसी फॉर्म पर छोड़ देते हैं जो प्रत्येक टैग को सहायता-ग्रंथों को निर्दिष्ट करना शुरू कर देता है। –

4

जैसा कि अन्य ने कहा है, यह कुछ भी लगाने का स्थान है। आमतौर पर यह ऑब्जेक्ट संदर्भ या पॉइंटर के माध्यम से दो ऑब्जेक्ट्स को जोड़ते समय आसान होता है। टैग को पॉइंटर रखने के लिए पूरी तरह से आकार दिया जाता है, इसलिए यदि आपको किसी ऑब्जेक्ट को किसी सूची बॉक्स में किसी ऑब्जेक्ट से बंधे रखना है, तो यह बहुत सरल हो जाता है।

+2

और आशा है कि 64-बिट डेल्फी आने पर एक सूचक अभी भी टैग में फिट होगा ... – frogb

+1

@frogb: और ऐसा करता है! –

3

इसके अलावा इसका उपयोग समूह उद्देश्यों के लिए भी किया जा सकता है, कहें कि आप घटक के प्रकार के बावजूद किसी विशिष्ट टैग मान वाले सभी घटकों तक पहुंच बनाना चाहते हैं।

3

यह बढ़िया है! एक फ्रीबी मैं ऑब्जेक्ट से जुड़े जानकारी के एक अतिरिक्त टुकड़े को स्टोर करने के लिए हर समय इसका इस्तेमाल करता हूं।

अक्सर मैं एक संबंधित डेटा संरचना में एक सूचक को स्टोर करता हूं, या कभी-कभी एक पूर्णांक जो किसी अन्य सरणी में एक सूचकांक हो सकता है।

आप इसे ऑब्जेक्ट तक पहुंचने के लिए काउंटर के रूप में उपयोग कर सकते हैं, या जो भी हो।

एकमात्र नकारात्मकता यह है कि यदि आपका प्रोग्राम बहुत मेमोरी का उपयोग करता है और आपके पास लाखों ऑब्जेक्ट्स हैं, तो प्रत्येक टैग के लिए उन 4 बाइट्स जोड़ते हैं, खासकर यदि आप इसका उपयोग नहीं कर रहे हैं। उस स्थिति में, आपके सबसे शानदार वस्तु प्रकार के लिए, आप टैग के बिना अपना स्वयं का संस्करण बनाना चाह सकते हैं।

+2

यह एक गंभीर समस्या होने की संभावना नहीं है, क्योंकि आपके "लाखों ऑब्जेक्ट्स" टैग संपत्ति होने की संभावना नहीं है। केवल वीसीएल कक्षाओं में यह है, और आप उनमें से कई को एक बार में तत्काल नहीं रखते हैं। –

+0

ओह आप सही हैं। मानक डेल्फी में अधिकांश पेड़ और सूची आइटम में टैग नहीं होते हैं। मैं एलएमडीएनओवीवेटिव द्वारा एलटीरी पैकेज के साथ मिश्रण कर रहा था जिसका उपयोग मैं करता हूं, जिसमें पेड़ में प्रत्येक आइटम पर टैग होता है। मेरे पेड़ों में लाखों आइटम हो सकते हैं, और नतीजतन, मेरे पास लाखों टैग हैं। लेकिन वास्तविक बात यह है कि मुझे यह क्षमता – lkessler

+0

होने से प्यार है वृक्ष और सूची वस्तुओं में 'डेटा' संपत्ति होती है, जो 'टैग' के बराबर होती है। –

3

आप अपने फार्म पर 2 बटन है आप टैग = 1, और अन्य एक टैग सेट एक पर = 2. अब आप दोनों बटन के लिए एक ही ऑनक्लिक ईवेंट निर्दिष्ट करेंगे और इस तरह कोड writhe:

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

कोड में संकलन त्रुटि है: '(टीबीटन के रूप में प्रेषक)' होना चाहिए (टीबीटन के रूप में प्रेषक)। टैग करें। – ZzZombo

+0

@ZzZombo आप सही हैं, धन्यवाद –

2

मैं हर समय टैग का उपयोग करता हूं। यहां कुछ उदाहरण दिए गए हैं;

एक सरल नमूना: आप (टैब के बिना एक pagecontroll की तरह) एक नोटबुक है ताकि आप टैब के रूप में बटन को परिभाषित करने और

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

एक अधिक जटिल नमूना लिख ​​सकते हैं; एक पूर्णांक 16 बिटवाइज बोलेन धारण कर सकता है; मैं तो प्रेषकों 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

मैं टैग संपत्ति के साथ कुछ बुनियादी समस्या है जाओ तय करने के लिए देख सकते हैं। ठीक उसी संपत्ति को ठीक नहीं है क्योंकि यह इरादे के अनुसार काम करता है।

सामान्य रूप से मैं किसी भी सार्वभौमिक/सामान्य/बहु-उद्देश्य चर का उपयोग 'खराब अभ्यास' के रूप में करने पर विचार करता हूं। वे डिबगिंग के दौरान उपयोगी हो सकते हैं लेकिन उत्पादन/मिशन महत्वपूर्ण वातावरण में बहुत हानिकारक हैं। वे कोड पठनीयता और समझदारी को कम करते हैं क्योंकि कोई भी नहीं जानता कि विशेषता 'संपत्ति' नाम या संपत्ति क्या करती है। बेशक आप जानते हैं कि आप इस चर का उपयोग क्यों कर रहे हैं। लेकिन जल्दी या बाद में आप भूल जाएंगे (मुझे पता है कि आप करेंगे) और इस मूल्य पर भरोसा करने से कुछ और जटिल हो जाता है। यही कारण है कि कोड को क्या समझने में हमारी सहायता करने के लिए हमें हर चर और संपत्ति का उचित नाम देना चाहिए।

टैग संपत्ति का उपयोग करना समझने योग्य और अच्छी तरह से लिखित कोड को लागू करने से बचने के लिए सिर्फ एक कामकाज/शॉर्टकट है। यह प्रैक्टिस है और यह नशे की लत है। अगली बार जब आपको किसी घटक को बाध्य एक नया पूर्णांक मान स्टोर करने की आवश्यकता होती है तो आप वांछित मानों को संग्रहीत करने के किसी अन्य तरीके पर विचार किए बिना टैग प्रॉपर्टी का उपयोग करेंगे। और टैग संपत्ति में एक पॉइंटर संग्रहीत करना एक भयानक विचार है: जब भी आप पॉइंटर्स डीबग करते हैं तो आपको यह मान डालना होगा।

मुझे बताएं: आपने कितनी बार खुद को ऐसी स्थिति में पाया जहां आप टैग संपत्ति में एक नया मूल्य स्टोर करना चाहते थे, लेकिन आपको एहसास हुआ कि यह संपत्ति पहले से ही एक अलग उद्देश्य के लिए उपयोग की जा रही है (यदि केवल 'टैग 2' 'हर घटक में संपत्ति ...)।

+2

टैग पहले से ही इस्तेमाल किया गया है? कोई बात नहीं। HelpContext हाँ का उपयोग करें, हालांकि मैं आपका बिंदु देखता हूं। –

संबंधित मुद्दे