文字列表現は、コンテンツタイプの異形?
-
05-09-2019 - |
質問
最初に、今回の私の英語、あなたにとってどんな年でした意味をなんどろ風mikiモデルを作ってみる。今の私の問題です。
どうすれば文字列表現は、コンテンツ タイプ の変異体を用い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コードでそれを表すシンボル名に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;
は、手動で行う必要があるでしょう。このような何かを書く:
function VariantTypeName(const value: TVarData): string;
begin
case value.VType of
vtInteger: result := 'integer';
//and so on
end;
あるいは、はSystem.pasの値が順にリストされているので、あなたは、文字列のconstの配列を宣言しようとすると、あなたのVariantTypeName関数は、配列の適切なメンバーを返す可能性があります。
ことを考えてデるバージョンをサポートしないVarTypeAsText:きの定義列挙型を自分のVType値:
type
{$TYPEINFO ON}
TMyVarType = (
varEmpty = System.varEmpty,
varNull = System.varNull,
// etc...
);
(記入の未使用の列挙型スロットにも見 なぜか"タイプはtypeinfo"エラーの列挙型 の背後にある。
次に、これらの機能を使用されるの異'タイプとしての自分の列挙型
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;