2012-05-02 13 views
17

प्रक्रियाओं/कार्यों के लिए फ़ाइल नाम पैरामीटर पास करते समय, मुझे TFilename या String का उपयोग करना चाहिए।क्या मुझे TFilename की बजाय स्ट्रिंग का उपयोग करना चाहिए?

यदि कोई अंतर है, तो यह क्या है, और String का उपयोग करते समय संभावित विध्वंस क्या हैं?

उदा।

procedure TForm1.OpenFile(const AFilename : String); 
begin 
    //Open the file if it exists 
    ... 
end; 

उत्तर

20

मुझे लगता है कि TFilename क्योंकि इस तरह आईडीई यह संपत्ति संपादक (TOpenDialog जब गुण निरीक्षक में अंडाकार पर क्लिक किया दिखाया जाएगा) है दिखा सकते हैं जब घटकों को विकसित करने के लिए इस्तेमाल किया जाना चाहिए।

इसके अलावा मूल रूप से कोई अंतर नहीं है जिसका उपयोग करना है। याद रखें कि यदि आप TFilename का उपयोग करते हैं तो आपको अपने उपयोग खंड में SysUtils जोड़ना होगा।

10

सादा कोड में string और TFileName प्रकारों के बीच एकमात्र व्यावहारिक अंतर संदर्भ द्वारा एक तर्क पारित करने में है; निम्नलिखित कोड

procedure GetFileName(var FileName: TFileName); 
begin 
    FileName:= 'abcd.abc'; 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
var 
    S: string; 

begin 
    GetFileName(S); 
end; 

त्रुटि

[DCC Error] E2033 Types of actual and formal var parameters must be identical 
2

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

इसी सिद्धांत Integer, Cardinal, Double आदि जैसे अन्य बुनियादी प्रकार के लिए applys इसके बजाय आप इन अधिक स्पष्ट संवाद के रूप में TCustomerID की तरह इन कल्पित नामों का उपयोग करते हुए, THashValue, TInterestRate, आदि पर विचार करना चाहते हो सकता है इनमें से इरादा उपयोग चर है।

यह पठनीयता में सुधार करता है, और जब भी प्रकार का उपयोग कर किसी भी कोड को स्पर्श किए बिना बेस-प्रकार को बदलने की अनुमति देता है ... बस एक पुन: संकलित करें और आप कर चुके हैं (लेकिन बाइनरी संगतता के साथ सावधान रहें) ।

1

हम्म, मेरे मजबूत वरीयता, const AFilename: String; कारण यह है कि विशेष रूप से बड़ी परियोजनाओं के लिए, यदि आप कभी एक और सांकेतिक शब्दों में बदलनेवाला से स्रोत कोड को जोड़ने के लिए, की जरूरत है अगर वे TCustomerID, THashValue, TInterestRate तरह कस्टम प्रकार के बहुत सारे का इस्तेमाल किया है के लिए के लिए है बजाय इंटीजर, कार्डिनल, डबल, तो आपके पास हल करने के लिए ऊपर उल्लिखित E2033 में से बहुत सारे हैं। अगर मैं एक चर AFileName: TFileName; तरह परिभाषित किया है

function MatchesMask(const Filename, Mask: string): Boolean; 

इसके अलावा तो इसकी स्पष्ट इसकी एक फ़ाइल नाम & नामित प्रकार नहीं जोड़ता है:

यहां तक ​​कि डेल्फी के बहुत सारे स्रोत कोड में बनाया TFileName, की तरह उपयोग नहीं करता है मेरे लिए कोई पठनीयता, अगर कुछ मामलों में कुछ भी कोड को कम पठनीय बनाता है, क्योंकि आपको यह देखने के लिए क्लिक करना होगा कि इसका वास्तविक चर क्या है।

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