2009-08-21 9 views
5

डेल्फी में, सभी TEDIT और TComboBox नियंत्रण डिफ़ॉल्ट रूप से 21 पिक्सल ऊंचे होते हैं। टीसीम्बोबॉक्स के मामले में, यह आकार पूर्ण है और इसे बड़े पैमाने पर खींचने की कोशिश कर रहा है जो काम नहीं करता है। हालांकि TComboBoxEx के मामले में, डिफ़ॉल्ट ऊंचाई 22 पिक्सल है, जो इसे किसी भी रूप में थोड़ा सा खड़ा करती है जहां आप इसका उपयोग करते हैं। अब Microsoft docs के अनुसार, कॉम्बोबॉक्सएक्स अनिवार्य रूप से एक कॉम्बोबॉक्स है जिसमें छवियों और इंडेंटेशन की अनुमति देने के लिए मालिक द्वारा तैयार की गई कार्यक्षमता को संभाला जा रहा है।क्या मैं TComboBoxEx को TComboBox के समान ऊंचाई के लिए प्राप्त कर सकता हूं?

तो क्या मेरा टीसीम्बोबॉक्सएक्स 21 पिक्सेल ऊंचा नियंत्रण करना संभव है? यह किस पर निर्भर करता है?

अपडेट: मैंने रॉडी द्वारा सुझाए गए अनुसार इस मुद्दे पर Quality Central report जोड़ा। इसके अलावा, मुझे एक फिक्स मिला। जाहिर है, आकार combobox में आइटम -1 के आकार पर निर्भर करता है। तो आप उस आकार को 15 (या डिफ़ॉल्ट आकार से एक पिक्सेल कम) पर सेट करते हैं और बॉक्स अधिक परिचित 21 पिक्सल तक छोटा हो जाता है।

+0

वाह:

तो ठीक है तो, इस कोड को कॉल करने के लिए है! मेरा सुझाव है कि आप इसे अपने स्वयं के प्रश्न के लिए "स्वीकृत उत्तर" के रूप में जोड़ें। एक उथल-पुथल के लायक! – Roddy

+0

उत्तर जोड़ा गया, लेकिन मैं इसे केवल एक या दो दिनों में स्वीकार कर सकता हूं। एक चेतावनी भी है जिसमें छवि का प्रदर्शन शामिल है - नीचे मेरा जवाब देखें। –

उत्तर

6

मुझे एक फिक्स मिला। क्योंकि TComboBoxEx वर्ग GetItemHt समारोह को ओवरराइड करता है एक हार्ड-कोडेड 16. कोई संबंध जो भी हो,

  1. प्रकाशित ItemHeight संपत्ति के मूल्य के लिए मजबूर है 16 होने के लिए: डेल्फी इस से संबंधित कीड़े की एक जोड़ी के लिए लगता है आइटम के वास्तविक आकार के लिए - अजीब, क्योंकि यह पूरी तरह से TComboBox पर काम करता है। मुझे नहीं पता कि उन्होंने इस रणनीति के साथ क्यों जाने का फैसला किया। शायद यह सुनिश्चित करने के लिए कि छवियां हमेशा फिट होंगी।
  2. डेल्फी वास्तव में CB_SETITEMHEIGHT संदेश नहीं कॉल करता है, इसलिए यदि आप इस फ़ंक्शन को ओवरराइड करते हैं तो कुछ भी नहीं बदलता है।

अद्यतन:

रूप mghie से बताया, संदेश बुला विभिन्न डीपीआई सेटिंग्स पर अच्छी तरह से काम नहीं करता है में 15 की एक हार्ड-कोडेड मूल्य का उपयोग कर के अपने प्रारंभिक विचार। तो अब मैं ऊंचाई निर्धारित करने के लिए GetTextMetrics के लिए एक कॉलल का उपयोग कर रहा हूँ। फ़ॉन्ट की ऊंचाई में जोड़ा गया GetSystemMetrics (SM_CYBORDER) का मान है।

यह वीसीएल एक टीडीआईटी के आकार को निर्धारित करने के तरीके पर आधारित है।मुझे नहीं लगता कि यह काफी सही है, लेकिन चूंकि लक्ष्य कॉम्बोबॉक्सएक्स को टीडीआईटी के समान आकार रखना है, इसलिए यह संभवतः उतना करीब है जितना हम प्राप्त करेंगे। और यह 96, 120, 144 और 1 9 2 की डीपीआई सेटिंग्स में काम करता है।

कॉम्बोबॉक्सएक्स की ऊंचाई आइटम -1 की ऊंचाई से निर्धारित होती है। तो गिनती -1 के लिए आइटम 0 वास्तविक सूची आइटम हैं, लेकिन आइटम -1 संपादक के लिए उपयोग की जाने वाली ऊंचाई है। यदि आप उस ऊंचाई को 15 तक सेट करते हैं, तो नियंत्रण की ऊंचाई 21 पिक्सल (समस्याओं को स्केल करने के लिए ऊपर अपडेट देखें) को सही किया गया है। मुझे लगता है कि मेसन सही हो सकता है कि फ़ॉन्ट का आकार यहां एक हिस्सा निभाता है (शायद आइटम का आकार बदलता है), लेकिन आप इसे आइटम आकार को समायोजित करके ठीक काम कर सकते हैं।

ऐसा लगता है कि 9 6 डीपीआई 16-पिक्सेल उच्च छवियों में एक नया (मेरे दृश्य में, छोटी) समस्या पेश करने लगती है, जब संपादक भाग में दिखाया गया है, लेकिन यह शायद ही ध्यान देने योग्य है। - साफ ठीक

GetTextMetrics(Canvas.Handle, TM); 
SendMessage(Handle, CB_SETITEMHEIGHT, -1, 
    GetSystemMetrics(SM_CYBORDER) * 2 + TM.tmHeight); 
+0

124 की डीपीआई सेटिंग के साथ मेरे लैपटॉप पर एक टेडिट निश्चित रूप से 21 पिक्सेल ऊंचा नहीं है। हार्ड-कोडेड हाइट्स सिर्फ गलत हैं, चाहे वे आपके लिए काम करें या नहीं, और 15 लौटने से वास्तव में 16 लौटने से बेहतर नहीं होता है। विभिन्न फोंट या डीपीआई सेटिंग्स के बारे में क्या? एक वास्तविक फिक्स में फ़ॉन्ट की ऊंचाई प्राप्त करना और उस पर आधारित आइटम ऊंचाई की गणना करना शामिल होगा। – mghie

+0

-1 हार्डीडेड स्थिरांक के लिए जैसे मागी ने –

+0

डीपीआई सेटिंग के बारे में बताया। तो अब मुझे यह जानने की जरूरत है कि एक संपादन बॉक्स की ऊंचाई की गणना कैसे की जाती है। मैंने फ़ॉन्ट ऊंचाई के आधार पर आइटम ऊंचाई की गणना करने पर ध्यान दिया, लेकिन मुझे नहीं लगता कि यह उन्हें पहले स्थान पर कैसे मिला - मुझे वास्तव में लगता है कि यह चुना गया था इसलिए 16x16 ग्लाइफ फिट होगा। 96 डीपीआई और 120 दोनों पर काम करने के लिए प्रतीत होता है, GetTextMetric को कॉल कर रहा है और tmHeight + 2 का उपयोग कर रहा है। मैंने सोचा कि टीएमएचइट + टीएम इंटीरियर लेडिंग का उपयोग सही होगा, लेकिन यह केवल 120 डीपीआई पर काम करता है। मैं 15 से शुरू कर सकता हूं और स्केल करता हूं कि 96 से 120 तक, लेकिन यह सही नहीं लगता है। कोई विचार? –

1

टीसीम्बोबॉक्स की ऊंचाई पूर्ण नहीं है; यह आपके द्वारा उपयोग किए जाने वाले फ़ॉन्ट की ऊंचाई से जुड़ा हुआ है। TComboBoxEx एक ही तरीके से काम करता है, लेकिन ऐसा लगता है कि "ओवरहेड" का एक अतिरिक्त पिक्सेल है, जैसा कि आपने नोट किया है, और ऐसा करने के लिए कोई आसान तरीका प्रतीत नहीं होता है। यदि यह अंतर्निहित विंडोज नियंत्रण के लिए एक रैपर है, तो डेल्फी स्तर, अवधि में इसे बदलने का कोई तरीका नहीं हो सकता है।

+0

जब तक आप अपना खुद का संस्करण बनाना नहीं चाहते हैं, लेकिन मुझे नहीं लगता कि यह एक वैध विकल्प है ;-)। –

1

TComboBoxEx की ऊंचाई को बदलने के दो तरीके, दुर्भाग्यवश न तो शायद आप जो चाहते हैं।

  • font.size संपत्ति को छोटा सेट करें - बॉक्स कम हो जाएगा। (हालांकि, आपका टेक्स्ट छोटा है)

  • StyleEx.csExNoSizeLimit सेट करें: = झूठी, फिर ऊंचाई सेट करें: = 21 वांछित के रूप में। दुर्भाग्य से, यह सिर्फ आपके बॉक्स को फिसलने का कारण बनता है, इसलिए नीचे का बेज़ल गायब हो जाता है।

मैं शायद TComboBoxEx के साथ सभी TComboBoxes की जगह चाहते हैं - GExperts एक शानदार ऐसा करने के लिए जादूगर 'घटकों की जगह' है।

यह डेल्फी बग की तरह दिखता है। क्या आपने इसे क्यूसी के माध्यम से रिपोर्ट किया है?

+0

क्यूसी रिपोर्ट जोड़ा गया। लिंक प्रश्न में जोड़ा गया। –

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

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