2011-06-02 14 views
6

से फ़ॉर्म आकार के मुद्दों से निपटने के लिए कैसे करें मेरे पास डेल्फी 6 में लिखा गया एक एप्लीकेशन है और विंडोज एक्सपी पर संकलित है। आमतौर पर मैं नियंत्रणों और किनारों के किनारों के बीच 8px मुक्त छोड़ देता हूं।डेल्फी 6 और विनएक्सपी से डेल्फी 2007 और Vista/Win7

जब यह ऐप Vista या Win 7 पर चलता है तो यह अंतर छोटा या बिल्कुल मौजूद नहीं होता है। मुझे लगता है कि ऐसा इसलिए हो सकता है क्योंकि विंडोज के इन संस्करणों में मोटी रूप सीमाएं हैं।

अब मैं ऐप को डेल्फी 2007 में ले जा रहा हूं। फॉर्म डिज़ाइनर में फॉर्मों ने नीचे और दाएं अंतराल खो दिए हैं।

मुझे इससे कैसे निपटना चाहिए? मेरे पास सैकड़ों रूप हैं और वे सभी को बदलना नहीं चाहते हैं। साथ ही, हमारे अधिकांश उपयोगकर्ता Win XP पर ऐप चलाते हैं, इसलिए मैं इसे XP में खराब दिखाना नहीं चाहता हूं।

+2

कुछ और है जो आप हमें नहीं बता रहे हैं। मैंने हाल ही में d6 से d2010 तक पोर्ट किया है और ऐसी कोई समस्या नहीं थी –

+0

क्या आपने या मैनिफेस्ट का उपयोग करने का प्रयास किया है? शायद आप एक्सपी संगतता मोड निर्दिष्ट कर सकते हैं? – Tom

+0

@ डेविड हेफरन "इस तरह से कुछ बुरा लगता है"। बस दीवार पर हिट करें, कि TForm.ClientWidth डीपीआई के बावजूद Win8.x पर पूरी तरह से पागल परिणाम देता है .... –

उत्तर

11

लघु संस्करण: AutoScroll = False


करने के लिए सभी प्रपत्र के बदलने समस्या प्रपत्र के AutoScroll संपत्ति है, और यह जो फार्म आकार DFM में संग्रहित है कैसे प्रभावित करता।

तो AutoScrollसच (डिफ़ॉल्ट) है DFM Width और Height स्टोर करेगा:

object Form1: TForm1 
    Left = 192 
    Top = 114 
    Width = 544 
    Height = 375 
    Caption = 'Form1' 
    ... 

तो AutoScrollझूठी है (वरीय सेटिंग) DFM ClientWidth और ClientHeight स्टोर करेगा:

object frmSplash: TfrmSplash 
    Left = 192 
    Top = 114 
    ClientWidth = 536 
    ClientHeight = 348 
    Caption = 'Form1' 

Height को संग्रहीत करने में समस्या तब होती है जब उपयोगकर्ता का कैप्शन बार आपकी विकास मशीन से भिन्न आकार है, उदाहरण के लिए

  • आप Windows 2000 पर विकसित करने, कार्यक्रम Windows XP पर
  • आप Windows XP पर विकसित चलाता है, कार्यक्रम Windows Vista पर चलता है
  • आप छोटे फोंट के साथ विकसित करने, कार्यक्रम बड़े फ़ॉन्ट के साथ चलाता है

विंडोज 2000 में 23 पिक्सेल कैप्शन बार के साथ 4 पिक्सेल सीमा थी। डीएफएम 375 के Height को संग्रहीत करने के साथ, यह फॉर्म क्लाइंट क्षेत्र के लिए 348px छोड़ देता है।

विंडोज एक्सपी पर एक ही प्रोग्राम चलाएं, जिसमें एक लंबा (28 पिक्सेल) कैप्शन बार है। डीएफएम के साथ 375 पिक्सेल के Height भंडारण के साथ, यह ग्राहक क्षेत्र के लिए 343 पीएक्स छोड़ देता है।

आपका फॉर्म "5 पिक्सल छोटा हो गया"।

AutoScroll बंद करके डीएफएम में ClientWidth और ClientHeight स्टोर करने के लिए आपको डेल्फी को मजबूर करने की आवश्यकता है।

अब जब आप विंडोज एक्सपी पर अपना 348 पीएक्स लंबा फॉर्म बनाते हैं, तो क्लाइंट एरिया में 348 पिक्सल जारी रहेगा - और कैप्शन बार रखने के लिए अतिरिक्त लंबा होना आवश्यक है।

मैं अब तक मेरी सहायक पुस्तकालय कोड किसी भी रूप गलती से AutoScroll सेट करने के लिए सच है कि यह पता लगता है के रूप में एक OutputDebugString और एक ब्रेकपाइंट ट्रिगर करने के लिए जाना।


संपादित करें: के बाद से मैं एक अच्छा डेवलपर बनने की कोशिश, मैं अपने रूप के उपयोगकर्ता के फ़ॉन्ट वरीयता सम्मान करते हैं।

  • मापता प्रपत्र उपयोगकर्ता के डिफ़ॉल्ट फ़ॉन्ट आकार मिलान करने के लिए
  • उपयोगकर्ता की प्राथमिकता को
  • मुद्दों फार्म पर सभी नियंत्रणों पर फ़ॉन्ट परिवर्तन: अपने सभी रूपों में से OnCreate के दौरान मैं एक StandardizeForm(Self) समारोह है कि फोन एक ODS प्रपत्र गलती से Scaled
  • मुद्दों एक ODS और ब्रेकप्वाइंट AutoScroll सच (और गलत पर यह सेट) यदि
  • मुद्दों एक ODS करने के लिए सेट सेट है, तो और ब्रेकप्वाइंट अगर ShowHint गलत है (और उस पर बदल जाता है)
  • आदि

तो आपको कुछ ऐसा कर सकते हैं। हां आपको जोड़ना होगा:

procedure TCustomerEditForm.FormCreat(Sender: TObject); 
begin 
    StandardizeForm(Self); //Pay your taxes! 
    ... 
end; 

लेकिन यह मेरे लिए लायक है।

+0

शानदार। धन्यवाद। – cja

+0

इसके अलावा, आपके पास अपनी कर-मुक्त फॉर्म क्लास क्यों नहीं है? – cja

+1

@cja: सभी को एक नया डिज़ाइन-टाइम पैकेज स्थापित करने के लिए मजबूर कर थोड़ा सा मूल्य प्राप्त हुआ है। इस तरह *** बहुत *** आसान है। –