2011-12-14 17 views
10

मेरे पास एक मालिक कॉम्बो बॉक्स तैयार है जो कॉलम में स्ट्रिंग प्रदर्शित करता है। ड्राइंग रूटीन को combos में साझा किया जा सकता है यदि मैं किसी भी तरह से OnDrawItem ईवेंट में कॉलम विनिर्देशों को पार कर सकता हूं। ऐसा करने का एक स्वाभाविक तरीका, कॉम्बोबॉक्स में कॉलम चौड़ाई की सरणी को पास करना होगा। संपत्ति को रीग करें और फिर उसे सरणी में डालें।डेल्फी में पॉइंटर और वापस एक सरणी डालने के लिए कैसे?

जब मैं के रूप में स्तंभ सरणी को परिभाषित:

const arrWidth :array[1..4] of integer = (100,100,100,70); 

और करने के लिए टैग गुण सेट:

: OnDrawItem घटना में

ComboBox.Tag := integer(@arrWidth); 

और उसके बाद, इसे वापस एक सरणी के लिए डाली

Widths :array of integer; 
Widths := pointer(ComboBox.Tag); 

मैं सरणी तत्वों को ठीक देख सकता हूं, लेकिन सरणी को इसकी लंबाई नहीं पता है। यह यादृच्छिक मूल्यों के सभी प्रकार के साथ बहुत लंबा प्रतीत होता है।

मैंने गतिशील सरणी का उपयोग करने का प्रयास किया है, लेकिन फिर मुझे उचित कॉलम मान भी नहीं मिलते हैं।

+4

वैकल्पिक कि टैग में सरणी संकेत भंडारण शामिल नहीं है एक वंशज है कि एक संपत्ति कार्य के लिए समर्पित में मान संग्रहीत कर लेता लेखन में शामिल हैं, और एक साहचर्य सरणी (TDictionary की तरह) में स्तंभ चौड़ाई भंडारण कि combo- नक्शे चौड़ाई सरणी के लिए बॉक्स उदाहरण। –

+0

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

उत्तर

19

जानवर खतरनाक हैं क्योंकि आप प्रकार की जांच प्रणाली के बाहर जाते हैं। उसने आपको यहां पकड़ा है। मुद्दा यह है कि array[1..4] of integer और array of integer समान प्रकार नहीं हैं।

const 
    arrWidth: TWidthArray = (100,100,100,70); 

जब आप कॉम्बो बॉक्स से सरणी को निकालने के लिए की जरूरत है यह कार्य करें:

आप इस

TWidthArray = array [1..4] of Integer; 
PWidthArray = ^TWidthArray; 

की तरह एक अलग प्रकार के रूप में अपने सरणी घोषित करने के लिए तो इस तरह से अपनी लगातार करने की ज़रूरत इस तरह:

Widths: TWidthArray; 
... 
Widths := PWidthArray(ComboBox.Tag)^; 

यदि आपको गतिशील सरणी लंबाई का उपयोग करने में सहायता करने की आवश्यकता है तो आप woul इसे प्रतिबिंबित करने के लिए आपके सामान्य प्रकार को बदलने की आवश्यकता है। हालांकि, सावधान रहें कि Tag में डालने के लिए Integer पर कास्टिंग गतिशील सरणी के संदर्भ गणना को बाईपास कर देगा। इसलिए यदि आप उस मार्ग पर जाते हैं तो आपको वास्तव में समझना होगा कि आप क्या कर रहे हैं।

एक अंतिम बिंदु। कभी आप 64 बिट के लिए इस कोड को संकलित करने के लिए चाहते हैं, तो यह इस लाइन की वजह से असफल हो जायेगी:

ComboBox.Tag := integer(@arrWidth); 

integer के बाद से एक 32 बिट डेटा प्रकार है। इसके बजाय आपको NativeInt का उपयोग करना चाहिए जो एक सूचक के समान चौड़ाई है।

ComboBox.Tag := NativeInt(@arrWidth);