2012-05-14 17 views
20

क्या किसी प्रोजेक्ट में उपयोग किए जाने वाले वैश्विक फ़ॉन्ट को लागू करने का एक त्वरित और प्रभावी तरीका है?परियोजना के दौरान फ़ॉन्ट स्थिरता?

इस मेरा मतलब है मुझे लगता है कि मेरी परियोजना में सभी नियंत्रण ऐसे TButton, TEdit, TLabel आदि के रूप में इस्तेमाल करेगा एक विशिष्ट फ़ॉन्ट का नाम सेट करना चाहते हैं के द्वारा

आम तौर पर एक विशिष्ट से फार्म के लिए फ़ॉन्ट स्थापित करने के बजाय नियंत्रण उस प्रपत्र पर निर्दिष्ट सभी फ़ॉन्टों को निर्दिष्ट फ़ॉन्ट में बदल देगा।

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

आइडिया 1

मैं जैसे पाश के लिए एक का उपयोग कर और मेरी फार्म पर प्रत्येक घटक के माध्यम से पुनरावृत्ति और फ़ॉन्ट की स्थापना इस तरह की सोच रहा था,:

procedure TForm1.FormCreate(Sender: TObject); 
var 
    i: Integer; 
begin 
    with TForm(Self) do 
    begin 
    for i := 0 to ComponentCount - 1 do 
    begin 
     if Components[i] is TButton then 
     begin 
     TButton(Components[i]).Font.Name := 'MS Sans Serif'; 
     TButton(Components[i]).Font.Size := 8; 
     TButton(Components[i]).Font.Style := [fsBold]; 
     end; 

     if Components[i] is TLabel then 
     begin 
     TLabel(Components[i]).Font.Name := 'MS Sans Serif'; 
     TLabel(Components[i]).Font.Size := 8; 
     TLabel(Components[i]).Font.Style := [fsBold]; 
     end; 
    end; 
    end; 
end; 

लेकिन ऐसा करने से बहुत लगता है गन्दा, यह एक साधारण कार्य के लिए भी काफी मात्रा में कोड होगा।

आइडिया 2

मैं जानता हूँ कि मैं मैन्युअल रूप से, प्रत्येक नियंत्रण के लिए एक के बाद डिजाइन समय से एक में फ़ॉन्ट बदल सकता है, लेकिन कई रूपों के साथ इस के माध्यम से जाने के लिए समय ले सकता है और फिर भी मैं एक नियंत्रण याद की हो सकती है ।

आइडिया 3

आइडिया 2 की तरह, एक और तरीका पाठ (DFM) के रूप में पर्चा देख सकते हैं और पता लगाएं और फ़ॉन्ट उस तरह की जगह हो सकती है।


मूल रूप से मैं अपने आवेदन के भीतर स्थिरता के लिए जा रहा हूं, और एक फ़ॉन्ट का उपयोग पूरे रूप में किया जा रहा है जो मैं प्राप्त करना चाहता था।

क्या मुझे यहां कुछ पूरी तरह से स्पष्ट याद आ रही है, क्या मैं इस तरह के कार्य के लिए ओवरकिल करने की कोशिश कर रहा हूं?

+6

यदि आप मैन्युअल रूप से नियंत्रण का फ़ॉन्ट बदलते हैं तो आप अपनी 'पेरेंटफॉन्ट' प्रॉपर्टी को 'गलत' पर भी सेट करते हैं; डिफ़ॉल्ट (माता-पिता) फ़ॉन्ट को वापस करने के लिए इसे 'True' सेट करें – kludg

+1

स्नीकी, मुझे नहीं पता था कि यह संपत्ति बदल रही है! –

+9

कोई भी फॉर्म बनाने से पहले, 'Application.DefaultFont.Name: =' MS Sans Serif 'सेट करें;' पेरेंटफॉन्ट के रूप में आपके रूपों में सत्य के रूप में सेट होने के साथ सेट करें। संदेश संवाद में फ़ॉन्ट सेट करने के लिए, 'Screen.MessageFont.Name'property सेट करें। –

उत्तर

22

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

Application.DefaultFont 

संशोधित डिफ़ॉल्ट ज्यादातर घटक True को ParentFont सेट और इसलिए आप कुछ नहीं करना तक पूरे आवेदन के लिए फ़ॉन्ट बदल सकते हैं। हालांकि TForm है अजीब एक। एक ब्रांड के नए डिफॉल्ट फॉर्म में ParentFontFalse पर सेट है। यह कुछ हद तक निराशाजनक है लेकिन मुझे संदेह है कि वीसीएल के मूल डिजाइनरों ने यह अनुमान नहीं लगाया था और ParentFont वीसीएल के विकास में अपेक्षाकृत देर से तैयार किया गया था।

कोई फर्क नहीं पड़ता, एक आदर्श दुनिया में, आपके आवेदन में सभी रूपों को आपके द्वारा नियंत्रित एक सामान्य बेस क्लास से लिया जाना चाहिए।यदि ऐसा है तो आप बस वहां परिवर्तन कर सकते हैं, ParentFontTrue पर सेट करें, सुनिश्चित करें कि आपके द्वारा किसी भी घटक पर कोई स्पष्ट फ़ॉन्ट सेटिंग्स लागू नहीं की गई हैं, और आप सुनहरे हैं। एक ही संपत्ति के माध्यम से पूरे एप्लिकेशन के फोंट को नियंत्रित करें। यदि आपके पास अपने फॉर्म के लिए सामान्य आधार श्रेणी नहीं है, तो इसे जोड़ने के लिए यहां एक आदर्श समय है। यदि आप ऐसा नहीं करना चाहते हैं तो आपको प्रत्येक फॉर्म के लिए ParentFont सेट करने की आवश्यकता है।

अन्य संबंधित गुण Screen.MessageFont और Screen.MenuFont हैं। ये संदेश बॉक्स और मेनू में इस्तेमाल किए गए फ़ॉन्ट्स पर वैश्विक नियंत्रण प्रदान करते हैं। हालांकि, डेल्फी के हाल के संस्करणों ने संदेश बॉक्स और मेनू के चित्रकला पर विंडोज नियंत्रण को वापस सौंप दिया है और इसलिए इन गुणों का कोई प्रभाव नहीं पड़ता है।

+0

वास्तव में कुछ भी नहीं है जो आपने और दूसरों ने पहले ही टिप्पणी की है। यह अच्छा नहीं होगा अगर परियोजना विकल्प में एक फ़ॉन्ट शैली सेट करने और इसे प्रोजेक्ट पर लागू करने के लिए एक विकल्प था, वैसे ही 'application.DefaultFont' काम करता है - अगर मुझे इस अंतर्निहित से अनजान है फ़ंक्शन, वैश्विक रूप से फ़ॉन्ट को बदलने के लिए दृश्य सेटिंग रखने से यह बहुत आसान हो जाएगा। वैसे भी मैं आपका जवाब स्वीकार करता हूं क्योंकि जानकारी अच्छी तरह से लिखी जाती है, और संदेश और मेनू को हाइलाइट करने के लिए +1 होती है। –

+10

याद रखें कि वीसीएल फॉर्म स्विंग (जावा) या डब्ल्यूपीएफ (सी #/नेट) जैसे "लेआउट प्रबंधित" नहीं हैं और रनटाइम पर बदलते फ़ॉन्ट्स फ़ॉन्ट-क्लिपिंग का एक सही नरक बनते हैं, और आपके यूआई को एक अपठनीय गड़बड़ बनाता है। सौभाग्य। पठनीयता के लिए हाथ से परिणामों, फ़ॉर्म के रूप में परिणामों की समीक्षा किए बिना अनुप्रयोग फोंट को बदलने का कोई व्यावहारिक तरीका नहीं है। –

+3

@ वॉरेन यह एक अच्छा मुद्दा है और मैं इसे अपने उत्तर में उल्लेख करना चाहता था, लेकिन भूल गया। मेरे ऐप में, मैं XP के लिए ताहोमा 8 या Vista + के लिए सेगो यूआई 9 में फोंट दिखाता हूं। फॉर्म लेआउट बदलने के लिए इसे चेंजस्केल पर कॉल की आवश्यकता है। लेकिन हाँ आपको दोनों प्रकारों में फॉर्मों को देखना होगा। जब तक आप एक दूसरे के खिलाफ अपने लेबल को कठोर नहीं करते हैं, तब तक कोई समस्या नहीं होती है। पेरेंटफॉन्ट इस सब में चमत्कार करता है। –

1

आप इस क्रम करना है, जैसे आप आइडिया 1 में यह वर्णन चाहते हैं, आप इसे एक पुनरावर्ती समारोह बनाने विचार करना चाहिए, इस तरह:

procedure SetFontProperties(Control: TControl; Name: TFontName; Size: Integer; Styles: TFontStyles); 
// Set font properties 
var 
    Index: Integer; 
    Font: TFont; 
    AnObject: TObject; 
    ChildControl: TControl; 
begin 
    // Set font properties 
    AnObject := GetObjectProp(Control, 'Font', nil); 
    if AnObject is TFont then 
    begin 
    // Set properties 
    Font := TFont(AnObject); 
    Font.Name := Name; 
    Font.Size := Size; 
    Font.Style := Styles; 
    end; 

    // Set child font properties 
    if Control is TWinControl then 
    begin 
    // Set 
    for Index := 0 to TWinControl(Control).ControlCount - 1 do 
    begin 
     // Child control 
     ChildControl := TWinControl(Control).Controls[Index]; 

     // Set font properties 
     SetFontProperties(ChildControl, Name, Size, Styles); 
    end; 
    end; 
end; 

फिर आप फोंट सभी नियंत्रण के लिए एक फार्म के भीतर बदल सकते हैं इस तरह यह का उपयोग करके:

SetFontProperties(Self, 'Courier', 14, []); 

समारोह तो प्रपत्र के फॉन्ट गुण, और TPanels या अन्य कंटेनर नियंत्रण के भीतर नेस्ट नियंत्रण सहित फार्म, पर सभी बच्चे नियंत्रण के फॉन्ट गुण सेट हो जाएगा।

हालांकि मैं आपसे सहमत हूं कि यह ऐसा करने का आधा गंदा तरीका है।

+0

यह ऐसी चीज आदर्श कोडिंग नहीं है, लेकिन आपका उत्तर कम उपयोगी है :) –

+3

दुर्भाग्यवश सभी फ़ॉन्ट गुणों को 'फ़ॉन्ट' नाम नहीं दिया गया है ... –

+0

@ मारजन वेनेमा यह केवल एक उदाहरण के रूप में था। यदि आपके पास अन्य फ़ॉन्ट प्रॉपर्टी नामों को तैनात करने वाले गैर-वीसीएल घटक हैं, तो आपको निश्चित रूप से उन संपत्ति नामों के साथ फ़ंक्शन का विस्तार करना होगा। हालांकि इस चर्चा में मुख्य बिंदु ऊपर टिप्पणी में वॉरेन पी द्वारा उल्लिखित बिंदु है: आमतौर पर फ़ॉन्ट गुणों को रनटाइम को बदलने के लिए व्यवहार्य नहीं है, क्योंकि यह संरेखण को बदलता है, फ़ॉन्ट-क्लिपिंग इत्यादि प्रस्तुत करता है। – Elling

2

वास्तविक कुंजी, जैसा कि बताया गया था, यह सुनिश्चित करना है कि आपके सभी रूप आपके आवेदन आधार फॉर्म से निकल जाएं।

फिर, आप प्रत्येक फॉर्म और बटन आदि देख सकते हैं, और गुणों की समीक्षा कर सकते हैं, जहां किसी भी संशोधित फ़ॉन्ट प्रॉपर्टी को बोल्ड में प्रदर्शित किया जाना चाहिए, और आसानी से पहचाना जा सकता है। अधिकांश गुणों में "विरासत में वापस लौटें" मेनू विकल्प होता है। इसे संपादन के लिए पाठ संस्करण पर जाने के बिना, किसी भी पिछले चयन को अनिवार्य रूप से पूर्ववत करना चाहिए। (हालांकि यह संभवतः वही करता है, पिछले फ़ॉन्ट सेटिंग से उत्पन्न किसी भी पाठ प्रविष्टि को हटा रहा है)।

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

+0

युक्तियों के लिए धन्यवाद। –

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