まず、私の英語の謝罪、私はここで書いたことが意味を成就することを願っています。今私の問題に。バリアントのコンテンツタイプの文字列表現ですか?
TypInfo.GetEnumName()を使用して、バリアント型の文字列表現を取得するにはどうすればよいですか。私は運がなければ、次のように試してみました。
myString := GetEnumName(TypeInfo(TVarType), TVarData(myVar).VType);
ありがとうございます。
まず、私の英語の謝罪、私はここで書いたことが意味を成就することを願っています。今私の問題に。バリアントのコンテンツタイプの文字列表現ですか?
TypInfo.GetEnumName()を使用して、バリアント型の文字列表現を取得するにはどうすればよいですか。私は運がなければ、次のように試してみました。
myString := GetEnumName(TypeInfo(TVarType), TVarData(myVar).VType);
ありがとうございます。
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;
デルファイ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;
答えをありがとう... TVarData.VTypeの文字列表現を取得する他の方法はありますか? –
を。
function VariantTypeName(const value: TVarData): string;
begin
case value.VType of
vtInteger: result := 'integer';
//and so on
end;
か、はSystem.pasの値が順にリストされているので、あなたは、文字列のconstの配列を宣言しようとすると、あなたのVariantTypeName関数は、配列の適切なメンバーを返すかもしれない。このような何かを書きます。
は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;
私はマークすることをお勧め受け入れられたThe_Foxによる答え。 – mghie