2012-03-12 6 views
8

वेरिएंट हमेशा मजेदार होते हैं, आह?कैसे बताना है कि डेल्फी संस्करण एक खाली स्ट्रिंग है या नहीं?

मैं एक लीगेसी एप्लिकेशन पर काम कर रहा हूं जो डीएफ 7 में आखिरी बार डेल्फी एक्सई में माइग्रेट करने के लिए था।

अंतरिम में भिन्नताएं काफी बदल गई हैं।

कोड की यह पंक्ति:

if (VarType(Value) = varString) and (Value = '') then 
    Exit; 

सच लौट आए और D2007 में से बाहर निकल गया, लेकिन डेल्फी XE में नहीं है।

मैं इस के लिए यह बदल गया है:

if VarIsStr(Value) and (VarToStr(Value) = '') then 
    Exit; 

मैं आश्वस्त नहीं कर रहा हूँ इस "सर्वश्रेष्ठ" रास्ता तय करना है। वेरिएंट यूनिट में ऐसा करने के लिए एक विशिष्ट कॉल नहीं है, और मुझे निश्चित रूप से यह याद है कि यह अतीत में लोगों के लिए एक मुद्दा है। हालांकि, एक खोज ने कोई लाइब्रेरी फ़ंक्शन या कोई अन्य स्वीकार्य तरीका नहीं बताया।

क्या कोई "सही" या बेहतर तरीका है?

+0

संयोग से 'v = '' 'सच है, अगर मैं इसे स्पष्ट रूप से' v: = '' पर असाइन करता हूं; '- मेरा अनुमान है कि एक से अधिक संस्करण स्ट्रिंग उप प्रकार, शायद B_STR और कुछ और है, और इसलिए तत्व तुलना विफल रहता है, भले ही सामग्री समान है। –

+0

वॉन 'अगर VarToStr (मूल्य) = '' अकेले नौकरी करते हैं? – kobik

+1

@kobik यह विफल रहता है, उदाहरण के लिए, जब 'Value'' Null' के बराबर होता है। –

उत्तर

3

अपडेट किया गया: स्ट्रिंग विशेष से बचने के लिए अपवाद:

if VarIsStr(Value) and (Length(VarToStr(v))=0) then ... 

Update3: यदि आप चाहते हैं बेहतर प्रदर्शन और कम स्ट्रिंग ढेर स्मृति बेकार इस प्रयास करें। कल्पना कीजिए कि तार 64K लंबाई में हैं। उपरोक्त कोड एक VarToStr करता है और डेटा को पकड़ने के लिए शायद यूनिकोडस्ट्रिंग हीप स्पेस के 64K आवंटित करता है, बस हम केवल BSTR के लिए स्ट्रिंग के अंत में नल टर्मिनेटर की तलाश कर सकते हैं, और अन्य प्रकार के लिए शून्य-पॉइंटर्स के लिए देख सकते हैं।

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

function VarStrEmpty(v:Variant):Boolean; 
var 
    data:PVarData; 
begin 
    data := FindVarData(V); 
    case data^.VType of 
    varOleStr: 
      result := (data^.VOleStr^=#0); 
    varString: 
      result := (data^.VString=nil); 
    varUString: 
      result := (data^.VUString=nil); 
    else 
     result := false; 
    end; 
end; 
+2

निक उन अपवादों से बचने की कोशिश कर रहा है जो उत्पन्न होते हैं जब संस्करण को स्ट्रिंग में नहीं जोड़ा जा सकता है। यही कारण है कि उन्हें पहले चेक और शॉर्ट सर्किट मूल्यांकन की आवश्यकता है। –

+1

मैं यह देखने के लिए संघर्ष कर रहा हूं कि सभी अतिरिक्त जटिलताएं यहां क्या लाती हैं। यह एक खाली ओलेएसआरआर के लिए एक गलत जवाब भी देगा जो मुझे लगता है क्योंकि उन्हें एक एकल शून्य wchar_t के रूप में दर्शाया जाता है। या क्या मुझे यह गलत लगता है? '' के खिलाफ तुलना करने के बारे में इतना बुरा क्या है? –

+0

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

12

VarIsStr ऐसा करने का एक बिल्कुल व्यावहारिक तरीका है। इस कार्यान्वित किया जाता है के रूप में:

function VarTypeIsStr(const AVarType: TVarType): Boolean; 
begin 
    Result := (AVarType = varOleStr) or (AVarType = varString) 
    or (AVarType = varUString); 
end; 

function VarIsStr(const V: Variant): Boolean; 
begin 
    Result := VarTypeIsStr(FindVarData(V)^.VType); 
end; 

परिवर्तन आप देख रहे हैं निश्चित रूप से, है, यूनिकोड वास्तव में कारण वेरिएंट में परिवर्तन D2009 के बजाय में बदल जाता है। आपकी स्ट्रिंग varUString, उर्फ ​​UnicodeString होगी। बेशक, VarIsStr भी AnsiString/varString और WideString/BSTR/varOleStr उठाता है।

आप अपने डेल्फी 2007 कोड का एक सही मायने में वफादार रूपांतरण तो आप लिखते थे चाहते हैं:

if (VarType(Value) = varUString) and (Value = '') then 
    Exit; 

वास्तव में आप क्या करने की जरूरत है, केवल आप पता कर सकते हैं, लेकिन मुख्य बात आप खाते में है कि है नए आने के लिए varUString

0

प्रकार एक संख्या या एक स्ट्रिंग हो सकता है।

कोई समस्या हो सकती है जब Variant (संख्या) का नकारात्मक मान (-15) हो।

इसके अलावा अपने लाइन

(VarType(Value) = varString) and (Value = '') 

मैं हमेशा डाल करने के लिए ()

((VarType(Value) = varString) and (Value = '')) 
+1

आपने सवाल को गलत समझा। नकारात्मक संख्या यहां प्रासंगिक नहीं है। इसके बारे में आपका दूसरा बिंदु भी गलत है। –

-1
if VarToStrDef(value, '') = '' then 

मेरे लिए चाल करता है।

+1

जब आप 'value' सत्य को स्ट्रिंग नहीं करते हैं तो आप सभी मामलों को डिफ़ॉल्ट कर देंगे। वह तर्क प्रश्न से मेल नहीं खाता है। –

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