2009-05-24 1 views
6

まず、私の英語の謝罪、私はここで書いたことが意味を成就することを願っています。今私の問題に。バリアントのコンテンツタイプの文字列表現ですか?

TypInfo.GetEnumName()を使用して、バリアント型の文字列表現を取得するにはどうすればよいですか。私は運がなければ、次のように試してみました。

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

ありがとうございます。

+0

私はマークすることをお勧め受け入れられたThe_Foxによる答え。 – mghie

答えて

12

Variant型の文字列表現を取得するには、Delphiの組み込み関数を使用してください。ここで

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

ああ、それはDelphi 2007にありますが、Delphi 5ではありません。どのバージョンが利用可能になったのか偶然知っていますか? – mghie

+0

ここでDelphi 7を使用すると、関数はおそらくVariantsユニットに付属しています。 –

3

デルファイ2007のヘルプからの引用:コードで、それを表すシンボル名にデルファイの列挙値に変換するために

使用GetEnumName。あなたは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の文字列表現を取得する他の方法はありますか? –

1

を。

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

か、はSystem.pasの値が順にリストされているので、あなたは、文字列のconstの配列を宣言しようとすると、あなたのVariantTypeName関数は、配列の適切なメンバーを返すかもしれない。このような何かを書きます。

0

はVarTypeAsTextをサポートしていませんDelphiのバージョンのための思考です:あなたは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; 
関連する問題