2012-06-20 15 views
17

Memo.Lines अमूर्त वर्ग TStrings का उपयोग क्यों करता है? इसके बजाय यह TStringList का उपयोग क्यों नहीं करता है?क्यों memo.Lines TStringList के बजाय TStrings का उपयोग करता है?

और क्या इसे इसके साथ काम करने से पहले इसे TStringList में परिवर्तित करना चाहिए?

+2

'TMemo.Lines है TStringList = FALSE'। असल में वास्तविक वस्तु जो इसके पीछे है वह विंडोज एपीआई के चारों ओर एक रैपर है। भंडारण विंडोज ईडीआईटी नियंत्रण द्वारा आयोजित किया जाता है जो 'टीएमईओ' लागू करता है। "क्या इसे इसके साथ काम करने से पहले इसे TStringList में परिवर्तित करना चाहिए?" नहीं, आप ऐसा क्यों करना चाहते हैं? –

+5

टीएसट्रिंग्स एक कम "अनुबंध" है जो डेवलपर के लिए अधिक लचीलापन की अनुमति देता है। आप किसी भी वर्ग से बातचीत कर सकते हैं जो टीएसट्रिंग्स अमूर्त वर्ग लागू करता है। – Simon

उत्तर

21

TMemo.Lines, TListBox.Items, TComboBox.Items, आदि; सभी को TStrings के रूप में घोषित किया गया है। सावधान रहें, संपत्ति के बारे में बात कर रहे हैं! आंतरिक निर्मित प्रकार TMemoStrings, TListBoxStrings और TComboBoxStrings क्रमशः TStrings के सभी वंशज हैं और सभी भंडारण के तरीके में भिन्न हैं।

और क्यों? विनिमयशीलता और अंतःक्रियाशीलता के लिए। इसलिए हर TStrings -descendant एक ही गुण है, और इसलिए आप कर सकते हैं:

Memo1.Lines := ListBox1.Items; 

का उपयोग कैसे करें? खैर, TStringsTMemo.Lines जैसी संपत्ति ठीक काम करती है। आप संपत्ति पर स्ट्रिंग्स (और ऑब्जेक्ट्स) को जोड़, हटा, बदल, नवीनीकृत और साफ़ कर सकते हैं, क्योंकि आंतरिक रूप से यह TMemoStrings है जो इस सभी बातचीत को लागू करता है। घोषणा <> कार्यान्वयन।

लेकिन जब आप कोई विशेष हैंडलिंग चाहते हैं, उदा। सॉर्टिंग की तरह TStringList प्रदान करता है, तो आपको सहायता चाहिए। आप अपने टाइपकास्ट नहीं कर सकते और न ही एक TStringList करने के लिए एक TMemo.Lines कनवर्ट करते हैं, क्योंकि यह एक नहीं है, लेकिन इसके बजाय आप इस विशेष प्रसंस्करण के लिए एक मध्यवर्ती वस्तु बनाने के लिए की जरूरत है:

var 
    Temp: TStringList; 
begin 
    Temp := TStringList.Create; 
    try 
    Temp.Assign(Memo1.Lines); 
    Temp.Sort; 
    Memo1.Lines.Assign(Temp); 
    finally 
    Temp.Free; 
    end; 
end; 
+1

ठीक है धन्यवाद, यह समझ में आता है। तो मुझे लगता है उदा। Memo.Lines.Delete (0) काम करता है क्योंकि यह आंतरिक रूप से टीएसट्रिंग का उपयोग नहीं करता है? – Illiou

+0

हां। आपके फॉर्म पर एक ज्ञापन घटक छोड़ते समय कोई _abstract कंपाइलर त्रुटि_ नहीं होता है, तो मान लीजिए कि कोई सार वस्तु तत्काल नहीं है। ;) – NGLN

+1

निश्चित रूप से जगह-जगह को क्रमबद्ध करने का एक मामूली तरीका है। –

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