سؤال

أولا، اعتذار لغتي الإنجليزية، آمل أن يكون منطقيا ما كتبته هنا. الآن لمشكلتي.

كيف يمكنني الحصول على تمثيل سلسلة المحتوى اكتب من البديل باستخدام 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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top