2009-05-24 16 views
6

सबसे पहले, मेरी अंग्रेजी के लिए क्षमा चाहते हैं, मुझे आशा है कि यह समझ में आता है कि मैंने यहां क्या लिखा है। अब मेरी समस्या के लिए।एक प्रकार के सामग्री प्रकार का स्ट्रिंग प्रतिनिधित्व?

मैं TypInfo.GetEnumName() का उपयोग कर एक संस्करण के प्रकार सामग्री का स्ट्रिंग प्रतिनिधित्व कैसे प्राप्त कर सकता हूं। मैंने भाग्य के बिना निम्नलिखित कोशिश की है, मुझे एक संख्यात्मक प्रतिनिधित्व मिलता है।

myString := GetEnumName(TypeInfo(TVarType), TVarData(myVar).VType); 

धन्यवाद।

+0

मैं चिह्नित करने के लिए सुझाव है स्वीकार किए गए The_Fox द्वारा उत्तर। – mghie

उत्तर

12

बस एक प्रकार प्रकार के स्ट्रिंग प्रस्तुति के लिए बिल्ड-इन डेल्फी फ़ंक्शन का उपयोग करें।

var 
    MyVariantType: string; 
    MyVariant: Variant; 
begin 
    MyVariant := 'Hello World'; 
    MyVariantType := VarTypeAsText(VarType(MyVariant)); 
    ShowMessage(MyVariantType); //displays: String 

    MyVariant := 2; 
    MyVariantType := VarTypeAsText(VarType(MyVariant)); 
    ShowMessage(MyVariantType); //displays: Byte 
end; 
+0

+1, इस फ़ंक्शन के बारे में नहीं पता था। – mghie

+0

आह, यह डेल्फी 2007 में है, लेकिन डेल्फी 5 में नहीं। क्या आपको यह पता चलता है कि यह किस संस्करण में उपलब्ध हो गया है? – mghie

+0

डेल्फी 7 का उपयोग करके, फ़ंक्शन शायद वेरिएंट यूनिट के साथ आया था। –

3

डेल्फी 2007 मदद से हवाला देते हुए:

उपयोग GetEnumName प्रतीकात्मक नाम है कि यह कोड में प्रतिनिधित्व में एक डेल्फी प्रगणित मूल्य कन्वर्ट करने के लिए।

इसका मतलब है कि आप उस उद्देश्य के लिए इसका इस्तेमाल नहीं कर सकते हैं, TVarData.VType के रूप में एक enumerated मूल्य नहीं है, लेकिन एक पूर्णांक जो System.pas में स्थिरांक कि से लिया जाता है में से एक के लिए सेट है विंडोज एसडीके wtypes.h फ़ाइल। GetEnumName() के स्रोत को देखें, यह तुरंत पूर्णांक के मान वाले स्ट्रिंग को वापस कर देता है।

संपादित करें:

वहाँ TVarData.VType

की स्ट्रिंग प्रतिनिधित्व आप स्ट्रिंग प्रतिनिधित्व मैन्युअल रूप से निर्धारित कर सकते हैं पाने के लिए किसी भी अन्य तरीका है। सबसे पहले आपको इस बात से अवगत होना चाहिए कि उस पूर्णांक में एन्कोड किए गए जानकारी के कई बिट्स हैं, इसलिए एक साधारण केस स्टेटमेंट या सरणी लुकअप काम नहीं करेगा। निचले 12 बिट्स प्रकार मुखौटा हैं, और ऊपरी बिट्स इस बारे में जानकारी एन्कोड करते हैं कि यह एक वेक्टर या सरणी प्रकार है या नहीं और यह संदर्भ द्वारा दिया गया है या नहीं। महत्वपूर्ण हिस्से हैं:

const 
    varTypeMask = $0FFF; 
    varArray = $2000; 
    varByRef = $4000; 

तो तुम जैसे कुछ कर सकता है: यह एक enum नहीं है के बाद से

function VariantTypeName(const AValue: TVarData): string; 
begin 
    case AValue.VType and varTypeMask of 
    vtInteger: Result := 'integer'; 
    // ... 
    end; 

    if AValue.VType and varArray <> 0 then 
    Result := 'array of ' + Result; 
    if AValue.VType and varByRef <> 0 then 
    Result := Result + ' by ref'; 
end; 
+0

उत्तर के लिए धन्यवाद ... क्या TVarData.VType की स्ट्रिंग प्रस्तुति प्राप्त करने का कोई और तरीका है? –

1

, आप इसे मैन्युअल रूप से करना होगा। कुछ इस तरह लिखें:

function VariantTypeName(const value: TVarData): string; 
begin 
    case value.VType of 
    vtInteger: result := 'integer'; 
    //and so on 
end; 

या, के बाद से System.pas में मानों क्रम में सूचीबद्ध हैं, तो आप तार का एक स्थिरांक सरणी घोषित करने की कोशिश और अपने VariantTypeName समारोह सरणी के उचित सदस्य वापसी हो सकती है।

0

यहाँ डेल्फी संस्करणों के लिए एक विचार है कि VarTypeAsText समर्थन नहीं करते हैं:

type 
    {$TYPEINFO ON} 
    TMyVarType = (
    varEmpty = System.varEmpty, 
    varNull = System.varNull, 
    // etc... 
    ); 

(अप्रयुक्त enum स्लॉट भी भरें - Why do I get "type has no typeinfo" error with an enum type देखें: तुम एक की गणना कि VType मान निम्नानुसार खुद टाइप निर्धारित कर सकते हैं इसके पीछे तर्क के लिए)।

इसके बाद, इन कार्यों का उपयोग अपने स्वयं के गणना प्रकार के रूप में प्रकार 'प्रकार पढ़ने के लिए:

function MyVarType(VType: TVarType): TMyVarType; overload; 
begin 
    Result := TMyVarType(VType); 
end; 

function MyVarType(V: Variant): TMyVarType; overload; 
begin 
    Result := TMyVarType(TVarData(V).VType); 
end; 

और फिर आप इसे इस तरह एक स्ट्रिंग के लिए कनवर्ट कर सकते हैं:

function VarTypeToString(aValue: TMyVarType): string; 
begin 
    Result := GetEnumName(TypeInfo(TMyVarType), Ord(aValue)); 
end; 
संबंधित मुद्दे