2015-01-13 10 views
6

मैं TValueTValue वापस स्ट्रिंग <--> बूलियन और पीछे

साथ arround खेल रहा हूँ मैं एक खाली परियोजना में इस कोड लिखा है:

uses 
    RTTI; 

procedure TForm1.FormCreate(Sender: TObject); 
var 
    s: string; 
    b: Boolean; 
begin 
    s := TValue.From<Boolean > (True).ToString; 
    b := TValue.From<string > (s).AsType<Boolean>; 
end; 

लेकिन मैं स्ट्रिंग से वापस नहीं बदल सकते बूलियन करने के लिए; मुझे दूसरी पंक्ति में एक अवैध टाइपकास्ट अपवाद मिलता है।

मैं डेल्फी एक्सई का उपयोग कर रहा हूं लेकिन यह डेल्फी Xe6 में एक ही परिणाम है जो मुझे निष्कर्ष तक ले जाता है: मैं टीवील्यू गलत का उपयोग कर रहा हूं।

तो कृपया मैं क्या गलत कर रहा हूं।

+0

'TValue.ToString() 'में बूलियन आरटीटीआई का विशिष्ट ज्ञान है और इस तरह के मान को स्ट्रिंग में बदलने के लिए' GetEnumName() 'को कॉल करना जानता है। 'TValue.AsType()' दूसरी तरफ, किसी भी 'स्ट्रिंग'-> एनम रूपांतरण को परिभाषित नहीं करता है (' System.Rtti.pas' में विशाल 'रूपांतरण [] [] 'सरणी देखें)। यह केवल एनम रूपांतरणों का समर्थन करता है जब स्रोत और dest प्रकार एक ही enum प्रकार होते हैं, या जब दोनों बूलियन प्रकार होते हैं (वे अलग बाइट आकार हो सकते हैं)। –

उत्तर

4

हालांकि आप अपने प्रश्न में उदाहरण के रूप में Boolean देते हैं, लेकिन मुझे लगता है कि आप वास्तव में समृद्ध प्रकार की पूर्ण सामान्यता में रूचि रखते हैं। अन्यथा आप केवल StrToBool पर कॉल करेंगे।

TValue आपके द्वारा किए जा रहे रूपांतरण को करने के लिए डिज़ाइन नहीं किया गया है। आखिरकार, निम्न स्तर पर, GetEnumValue और GetEnumNameSystem.TypInfo इकाई में फ़ंक्शंस वे रूपांतरण हैं जो इन रूपांतरणों को निष्पादित करते हैं।

डेल्फी के आधुनिक संस्करण में आप TRttiEnumerationType उपयोग कर सकते हैं पाठ से एक enumerated प्रकार मान को बदलने के लिए:

b := TRttiEnumerationType.GetValue<Boolean>(s); 

आप इस तरह दूसरी दिशा में ले जा सकते हैं:

s := TRttiEnumerationType.GetName<Boolean>(b); 

ये तरीके हैं GetEnumValue और GetEnumName पर कॉल के साथ क्रमशः लागू किया गया।

डेल्फी के पुराने संस्करण TRttiEnumerationType.GetValue और TRttiEnumerationType.GetName निजी विधियों के रूप में छिपाते हैं। यदि आप डेल्फी के ऐसे संस्करण का उपयोग कर रहे हैं तो आपको GetEnumName का उपयोग करना चाहिए।

+0

मैं ऐसा करने की कोशिश करूंगा लेकिन TRttiEnumerationType.GetValue और GetName दोनों निजी हैं।मुझे लगता है कि मुझे GetEnumValue –

+0

के साथ जाना होगा फिर भी मुझे अजीब लगता है कि मैं टीवीएयू –

+0

का उपयोग नहीं कर सकता हूं, वे आरटीटीआई के संस्करण में सार्वजनिक हैं जो मैं देख रहा हूं। आपने संस्करण टैग नहीं जोड़ा है। हालांकि, मैं देख सकता हूं कि आप टेक्स्ट में XE का उल्लेख करते हैं। हां, निजी –

5

TValue उन प्रकारों को परिवर्तित करने के लिए नहीं है जो असाइनमेंट संगत नहीं हैं। इसे आरटीटीआई में परिवहन करते समय मूल्यों को पकड़ने के लिए डिज़ाइन किया गया था और डेल्फी के असाइनमेंट नियमों का सम्मान करता था।

केवल ToString कुछ स्ट्रिंग प्रस्तुति में मान को आउटपुट कर सकता है लेकिन एक प्रकार जिसे आप केवल एक स्ट्रिंग असाइन नहीं कर सकते हैं, TValue के साथ ऐसा करने में भी विफल हो जाएगा।

TValueVariant नहीं है।

यदि आप एक स्ट्रिंग को बूलियन में परिवर्तित करना चाहते हैं और फिर StrToBool और BoolToStr का उपयोग करें।

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