دلفي سجل المساعدون للمجموعات وأنواع بسيطة أخرى

فهم دلفي فئة (وتسجيل) المساعدين يقدم ميزة في لغة دلفي تتيح لك توسيع تعريف فئة أو نوع سجل بإضافة وظائف وإجراءات (طرق) إلى الفئات والسجلات الموجودة دون ميراث.

في إصدار XE3 Delphi ، أصبح المساعدون في التسجيل أكثر قوة من خلال السماح بتوسيع أنواع Delphi البسيطة مثل الأوتار والأعداد الصحيحة والتعدادات والمجموعات على حد سواء.

النظام. تقوم وحدة SysUtils ، من Delphi XE3 ، بتنفيذ سجل باسم "TStringHelper" وهو في الواقع مساعد سجل للسلاسل.

باستخدام Delphi XE3 ، يمكنك تجميع واستخدام الكود التالي:

فار
s: string؛ ابدأ
s: = 'Delphi XE3' ؛ س. استبدال ('XE3' ، 'القواعد' ، []). النهاية; 

لكي يكون هذا ممكنًا ، تم إنشاء بنية جديدة في دلفي "مساعد سجل لـ [نوع بسيط]". للسلاسل ، هذا هو "اكتب TStringHelper = سجل المساعد للسلسلة". يذكر الاسم "مساعد سجل" ولكن هذا لا يتعلق بالتمديد السجلات - بدلاً من توسيع أنواع بسيطة مثل الأوتار والأعداد الصحيحة على حد سواء.

في النظام والنظام. هناك SysUtils مساعدين آخرين محددين سلفًا للأنواع البسيطة ، بما في ذلك: TSingleHelper و TDoubleHelper و TExtendedHelper و TGuidHelper (وعدد قليل آخر). يمكنك الحصول من الاسم على نوع بسيط يمتد المساعد.

instagram viewer

هناك أيضا بعض المساعدين مفتوحة المصدر مفيد ، مثل TDateTimeHelper.

التعدادات؟ مساعد لتعدادات؟

التعدادات
مجموعات

يمكن الآن توسيع التعدادات والمجموعات التي يتم التعامل معها على أنها أنواع بسيطة (في XE3 وما بعده) مع وظائف يمكن أن يكون لنوع السجل: وظائف وإجراءات وما شابه.

إليك تعداد بسيط ("TDay") ومساعد تسجيل:

اكتب
TDay = (الاثنين = 0 ، الثلاثاء ، الأربعاء ، الخميس ، الجمعة ، السبت ، الأحد) ؛ TDayHelper = سجل المساعد ل TDay. وظيفة AsByte: byte؛ وظيفة إلى سلسلة: خيط; النهاية; 
وظيفة TDayHelper. AsByte: byte؛ ابدأ
النتيجة: = البايت (الذات) ؛ النهاية; وظيفة TDayHelper. إلى سلسلة: خيط; ابدأقضية الذات من
الاثنين: النتيجة: = 'الاثنين' ؛ الثلاثاء: النتيجة: = 'الثلاثاء' ؛ الأربعاء: النتيجة: = 'الأربعاء' ؛ الخميس: النتيجة: = 'الخميس' ؛ الجمعة: النتيجة: = 'الجمعة' ؛ السبت: النتيجة: = 'السبت' ؛ الأحد: النتيجة: = 'الأحد' ؛ النهاية; النهاية; 
فار
اليوم: TDay ؛ s: string؛ ابدأ
اليوم: = TDay. الإثنين؛ s: = يوم. إلى سلسلة. لخفض؛ النهاية; 
تحويل دلفي التعداد إلى تمثيل سلسلة

مجموعات؟ مساعد للمجموعات؟

TDays = مجموعة من TDay 
فار
الايام: s: string؛ ابدأ
أيام: = [الاثنين.. الأربعاء]؛ أيام: = أيام + [الأحد] ؛ النهاية; 

ولكن ، كيف سيكون الأمر رائعًا أن تكون قادرًا على القيام بما يلي:

فار
الايام: ب: منطقية ؛ ابدأأيام: = [الاثنين ، الثلاثاء] ب: = أيام. تقاطع ([الاثنين ، الخميس]).
اكتب
TDaysHelper = سجل المساعد ل TDays. وظيفة تتقاطع(مقدار ثابت أيام: TDays): TDays ؛ وظيفة IsEmpty: منطقية؛ النهاية؛... وظيفة TDaysHelper. تتقاطع(مقدار ثابت أيام: TDays): TDays ؛ ابدأ
النتيجة: = أيام * النفس ؛ النهاية; وظيفة TDaysHelper. IsEmpty: منطقية؛ ابدأ
النتيجة: = الذات = [] ؛ النهاية; 

لكل نوع محدد مبني حول تعداد ، ستحتاج إلى مساعد منفصل ، لسوء الحظ ، لا تتوافق التعدادات والمجموعات معًا الوراثة وأنواع عامة.

هذا يعني أنه لا يمكن تجميع ما يلي:

// لا يوجد ترجمة من على السواء!
TGenericSet = مجموعة من ; 
TEnum الأدوية البسيطة مثال التعداد

سجل المساعد لمجموعة من بايت!

اكتب
TByteSet = مجموعة من بايت TByteSetHelper = سجل المساعد ل TByteSet. 

يمكننا الحصول على ما يلي في تعريف TByteSetHelper:

عامةإجراء واضح؛ إجراء تتضمن(مقدار ثابت القيمة: بايت) ؛ الزائد; في النسق; إجراء تتضمن(مقدار ثابت القيم: TByteSet) ؛ الزائد; في النسق; إجراء استبعاد (مقدار ثابت القيمة: بايت) ؛ الزائد; في النسق; إجراء استبعاد (مقدار ثابت القيم: TByteSet) ؛ الزائد; في النسق; وظيفة تتقاطع(مقدار ثابت القيم: TByteSet): TByteSet؛ في النسق; وظيفة IsEmpty: منطقية؛ في النسق; وظيفة يشمل(مقدار ثابت القيمة: بايت): منطقية؛ الزائد في النسق؛وظيفة يشمل(مقدار ثابت القيم: TByteSet): منطقية. الزائد في النسق؛وظيفة IsSuperSet (مقدار ثابت القيم: TByteSet): منطقية. في النسق; وظيفة IsSubSet (مقدار ثابت القيم: TByteSet): منطقية. في النسق; وظيفة يساوي (مقدار ثابت القيم: TByteSet): منطقية. في النسق; وظيفة إلى سلسلة: خيط; في النسق; النهاية; 
{TByteSetHelper}إجراء TByteSetHelper. تشمل (قيمة const: بايت) ؛ ابدأ
النظام. تشمل (الذات ، القيمة) ؛ النهاية; إجراء TByteSetHelper. استثناء (القيمة const: Byte) ؛ ابدأ
النظام. استبعاد (الذات ، القيمة) ؛ النهاية; إجراء TByteSetHelper. واضح؛ ابدأ
النفس: = [] ؛ النهاية; وظيفة TByteSetHelper. يساوي (القيم const: TByteSet): منطقية ؛ ابدأ
النتيجة: = الذات = القيم ؛ النهاية; إجراء TByteSetHelper. استثناء (قيم القيم: TByteSet) ؛ ابدأ
الذات: = القيم الذاتية؛ النهاية; إجراء TByteSetHelper. تضمين (القيم const: TByteSet) ؛ ابدأ
الذات: = الذات + القيم ؛ النهاية; وظيفة TByteSetHelper. يتضمن (القيم const: TByteSet): منطقية ؛ ابدأ
النتيجة: = IsSuperSet (القيم) ؛ النهاية; وظيفة TByteSetHelper. تقاطع (القيم const: TByteSet): TByteSet؛ ابدأ
النتيجة: = القيم الذاتية ؛ النهاية; وظيفة TByteSetHelper. يتضمن (قيمة const: بايت): منطقية؛ ابدأ
النتيجة: = القيمة في النفس ؛ النهاية; وظيفة TByteSetHelper. IsEmpty: منطقية؛ ابدأ
النتيجة: = الذات = [] ؛ النهاية; وظيفة TByteSetHelper. IsSubSet (قيم const: TByteSet): منطقية؛ ابدأ
النتيجة: = الذات <= القيم ؛ النهاية; وظيفة TByteSetHelper. IsSuperSet (قيم const: TByteSet): منطقية؛ ابدأ
النتيجة: = الذات> = القيم ؛ النهاية; وظيفة TByteSetHelper. ToString: سلسلة ؛ فار
ب: بايت ؛ ابدأإلى عن على ب في الذات فعل
النتيجة: = النتيجة + IntToStr (b) + '،'؛ النتيجة: = نسخة (النتيجة ، 1 ، -2 + الطول (النتيجة)) ؛ النهاية; 
فار
daysAsByteSet: TByteSet؛ ابدأ
daysAsByteSet. واضح؛ daysAsByteSet. تشمل (الاثنين. AsByte) ؛ daysAsByteSet. تشمل (عدد صحيح (السبت) ؛ daysAsByteSet. تشمل (بايت (TDay. الثلاثاء))؛ daysAsByteSet. تشمل (عدد صحيح (TDay. الأربعاء))؛ daysAsByteSet. تشمل (عدد صحيح (TDay. الأربعاء))؛ / / 2nd الوقت - لا معنى له. daysAsByteSet. استبعاد (TDay. الثلاثاء. AsByte) ؛ ShowMessage (daysAsByteSet. إلى سلسلة)؛ ShowMessage (BoolToStr (daysAsByteSet. IsSuperSet ([الاثنين. AsByte ، السبت. AsByte]) ، صحيح)) ؛ النهاية; 

هناك ولكن :(

لاحظ أن TByteSet يقبل قيم البايتات - وأي قيمة من هذا القبيل سيتم قبولها هنا. TByteSetHelper كما هو مطبق أعلاه ليس نوع التعداد صارمًا (أي يمكنك إطعامه بقيمة غير TDay)... ولكن طالما أنا على علم.. أنها لا تعمل بالنسبة لي.