2009-05-24 122 views
6

首先,我的英語道歉,我希望這是有道理的,我在這裏寫了。現在到我的問題。變體的內容類型的字符串表示形式?

如何使用TypInfo.GetEnumName()獲取Variant的內容類型的字符串表示形式。我已經嘗試了以下,沒有運氣,我得到一個數字表示。

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

謝謝。

+0

我建議標記The_Fox的答案已被接受。 – mghie 2009-05-25 12:12:56

回答

12

只需使用內置的Delphi函數來獲取Variant類型的字符串表示形式。

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 2009-05-25 12:11:52

3

從2007年德爾福幫助引用:

使用GetEnumName到一個Delphi枚舉值轉換成表示它的代碼符號名。

這意味着,不能將其用於此目的,如TVarData.VType不是的枚舉值,但其被設置爲從它們採取System.pas的一個常量的整數Windows SDK wtypes.h文件。看看GetEnumName()的來源,它立即返回一個包含整數值的字符串。

編輯:

是否有任何其他的方式來獲得TVarData.VType

的字符串表示可以手動確定字符串表示。首先,您需要知道在該整數中編碼了幾個信息位,因此簡單的case語句或數組查找將不起作用。低12位是類型掩碼,高位是對矢量還是數組類型的信息進行編碼,以及是否通過引用給出。最重要的部分是:

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

所以,你可以這樣做:

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的字符串表示形式? – 2009-05-24 16:19:07

1

因爲它不是一個枚舉,你必須做手工。寫這樣的事情:

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

或者,由於在System.pas值的順序列出,你可以嘗試聲明字符串常量數組,有你VariantTypeName函數返回數組的相應成員。

0

下面是德爾福版本思想不支持VarTypeAsText:您可以定義一個羅列自己鍵入下面的Vtype域值:

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

(填寫未使用的枚舉插槽太 - 看到Why do I get "type has no typeinfo" error with an enum type爲此背後的推理)。

接下來,使用這些功能來讀取變類型作爲自己的枚舉類型:

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; 
相關問題