首先,我的英語道歉,我希望這是有道理的,我在這裏寫了。現在到我的問題。變體的內容類型的字符串表示形式?
如何使用TypInfo.GetEnumName()獲取Variant的內容類型的字符串表示形式。我已經嘗試了以下,沒有運氣,我得到一個數字表示。
myString := GetEnumName(TypeInfo(TVarType), TVarData(myVar).VType);
謝謝。
首先,我的英語道歉,我希望這是有道理的,我在這裏寫了。現在到我的問題。變體的內容類型的字符串表示形式?
如何使用TypInfo.GetEnumName()獲取Variant的內容類型的字符串表示形式。我已經嘗試了以下,沒有運氣,我得到一個數字表示。
myString := GetEnumName(TypeInfo(TVarType), TVarData(myVar).VType);
謝謝。
只需使用內置的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;
+1,不知道這個功能。 – mghie 2009-05-25 12:11:52
從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;
謝謝你的回答...是否有其他方式獲得TVarData.VType的字符串表示形式? – 2009-05-24 16:19:07
因爲它不是一個枚舉,你必須做手工。寫這樣的事情:
function VariantTypeName(const value: TVarData): string;
begin
case value.VType of
vtInteger: result := 'integer';
//and so on
end;
或者,由於在System.pas值的順序列出,你可以嘗試聲明字符串常量數組,有你VariantTypeName函數返回數組的相應成員。
下面是德爾福版本思想不支持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;
我建議標記The_Fox的答案已被接受。 – mghie 2009-05-25 12:12:56