2013-02-28 10 views
8
uses 
    SysUtils, Variants; 

var 
    VariantSingle: Variant; 
    VTSingle: TVarType; 
    SingleTest: Single; 
    VariantDouble: Variant; 
    DoubleTest: Double; 
    VTDouble: TVarType; 

begin 
    SingleTest := 1.234; 
    VariantSingle := SingleTest; 
    VTSingle := VarType(VariantSingle) and varTypeMask; 

    DoubleTest := 1.23456; 
    VariantDouble := DoubleTest; 
    VTDouble := VarType(VariantDouble) and varTypeMask; 

    WriteLn(Format('VarType: Single: %d, Double %d', [VTSingle, VTDouble])); 
end. 

कोड इच्छा उत्पादन ऊपर:एक भिन्न संस्करण में एक संस्करण को एक varDouble संस्करण में असाइन क्यों करता है?

VarType: एकल: 5, डबल 5

System.pas से

varSingle = $0004; { vt_r4   4 } 
varDouble = $0005; { vt_r8   5 } 

इस प्रकार, मैं करने के लिए VTSingle उम्मीद थी - 5
मुझे क्या याद आ रही है?

उत्तर

5

डेल्फी पुस्तकालय _VarFromReal पर कॉल के माध्यम से सभी फ़्लोटिंग पॉइंट असाइनमेंट को लागू करने का विकल्प चुनते हैं। और उस समारोह इस तरह दिखता है:

procedure _VarFromReal(var V: TVarData; const Value: Real); 
begin 
    if (V.VType and varDeepData) <> 0 then 
    VarClearDeep(V); 
    V.VType := varDouble; 
    V.VDouble := Value; 
end; 

ध्यान दें कि यह varDouble का एक प्रकार का उपयोग करता है। और इसमें Real पर एक अंतर्निहित रूपांतरण शामिल है जो Double के लिए उपनाम है। मुझे यकीन नहीं है कि डिजाइनरों ने उस विशेष मार्ग का चयन क्यों किया, लेकिन उस विकल्प का परिणाम वह व्यवहार है जिसे आप देखते हैं।

एक आसान तरीका एक varSingle संस्करण आप उपयोग कर सकते हैं बनाने के लिए:

VariantSingle := VarAsType(SingleTest, varSingle); 

हालांकि इस Single को फिर से वापस Double को SingleTest में परिवर्तित कर देंगे, और फिर।

कि अनावश्यक रूपांतरण से बचने के लिए अपने स्वयं के सहायक लिखें:

function VarFromSingle(const Value: Single): Variant; 
begin 
    VarClear(Result); 
    TVarData(Result).VSingle := Value; 
    TVarData(Result).VType := varSingle; 
end; 

जो आप इस तरह कॉल कर सकते हैं:

VariantSingle := VarFromSingle(SingleTest); 

यह बाद दृष्टिकोण मेरी राय में सही समाधान है।

+0

क्या आपने '_VarFromReal' प्रक्रिया को एएसएम से पास्कल में अनुवादित किया था? कम से कम डेल्फी 200 9 में, इसे 'एएसएम' प्रक्रिया के रूप में लागू किया गया है। –

+0

@AndreasRejbrand आधुनिक डेल्फ़िस में नए गैर x86 लक्ष्यों के लाभ के लिए पास्कल संस्करण भी हैं। तो मैंने यहां पास्कल संस्करण का उपयोग किया। –

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