تمثيل سلسلة نوع المحتوى من البديل؟
-
05-09-2019 - |
سؤال
أولا، اعتذار لغتي الإنجليزية، آمل أن يكون منطقيا ما كتبته هنا. الآن لمشكلتي.
كيف يمكنني الحصول على تمثيل سلسلة المحتوى اكتب من البديل باستخدام typinfo.getenumname (). لقد جربت ما يلي، دون حظ، أحصل على تمثيل رقمي.
myString := GetEnumName( TypeInfo(TVarType), TVarData(myVar).VType );
شكرا لك.
المحلول
ما عليك سوى استخدام دالة 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:
استخدم GetenNumname لتحويل قيمة تعداد Delphi إلى الاسم الرمزي الذي يمثله في التعليمات البرمجية.
هذا يعني أنك لا تستطيع استخدامه لهذا الغرض، كما TVARDATA.VTYPE. ليست قيمة تعداد، ولكن عدد صحيح يتم تعيينه على أحد الثوابت في System.PAS الذي تم نقله من Windows SDK WTYPES.H. ملف. انظر إلى مصدر getennumname (), ، يقوم على الفور بإرجاع سلسلة تحتوي على قيمة عدد صحيح.
يحرر:
هل هناك أي طريقة أخرى للحصول على تمثيل سلسلة TVARDATA.VTYPE
يمكنك تحديد تمثيل السلسلة يدويا. تحتاج أولا إلى أن تكون على دراية بوجود العديد من المعلومات من المعلومات المشفرة في هذا الأعداد الصحيحة، لذلك لن يعمل بيان حالة بسيطة أو بحث صفيف. أسفل 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 مدرجة بالترتيب، فيمكنك تجربة تعريف مجموعة متناسب من الأوتار ولديك وظيفة VariantTypename الخاصة بك عودة العضو المناسب في الصفيف.
إليك فكر في إصدارات Delphi التي لا تدعم vartypeastext: يمكنك تحديد نوع التعداد بنفسك تتبع قيم VTYPE:
type
{$TYPEINFO ON}
TMyVarType = (
varEmpty = System.varEmpty,
varNull = System.varNull,
// etc...
);
(املأ فتحات المعهد غير المستخدمة أيضا - انظر لماذا أحصل على خطأ "نوع ليس لديه TypeInfo" مع نوع Enum للسيطرة وراء هذا).
بعد ذلك، استخدم هذه الوظائف لقراءة نوع المتغيرات كنوع تعداد خاص بك:
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;