Delphi Record Helpers pentru seturi și alte tipuri simple

Înțelegerea asistenților din clasa Delphi (și înregistrare) introduce o caracteristică a limbajului Delphi care vă permite să extindeți definiția unei clase sau a unui tip de înregistrare adăugând funcții și proceduri (metode) la clase și înregistrări existente fără moştenire.

În versiunea XE3 Delphi, asistenții de înregistrare au devenit mai puternici permițând extinderea tipurilor Delphi simple precum șiruri, întregi, enume, seturi și deopotrivă.

Sistemul. Unitatea SysUtils, de la Delphi XE3, implementează o înregistrare numită "TStringHelper", care este de fapt un ajutor pentru înregistrări.

Folosind Delphi XE3 puteți compila și utiliza următorul cod:

var
s: șir; începe
s: = 'Delphi XE3'; s. Înlocuiți ('XE3', 'reguli', []). ToUpper; Sfârșit; 

Pentru ca acest lucru să fie posibil, în Delphi a fost realizat un „record helper pentru [tip simplu]”. Pentru șiruri, acesta este "tip TStringHelper = înregistrare ajutor pentru șir". Numele menționează „record helper”, dar nu este vorba despre extindere

instagram viewer
înregistrări - mai degrabă despre extinderea tipurilor simple precum șiruri, întregi și deopotrivă.

În sistem și sistem. SysUtils există și alte ajutoare de înregistrare predefinite pentru tipuri simple, inclusiv: TSingleHelper, TDoubleHelper, TExtendedHelper, TGuidHelper (și alte câteva). Puteți obține de la nume ce tip simplu se extinde asistentul.

Există, de asemenea, unii ajutoare open source utile, cum ar fi TDateTimeHelper.

Enumerările? Ajutor pentru Enumerații?

enumerările
seturi

Enumerațiile și seturile tratate ca tipuri simple pot fi extinse și acum (în XE3 și nu numai) cu funcționalitate pe care un tip de înregistrare le poate avea: funcții, proceduri și deopotrivă.

Iată o enumerare simplă („TDay”) și un ajutor de înregistrare:

tip
TDay = (luni = 0, marți, miercuri, joi, vineri, sâmbătă, duminică); TDayHelper = înregistrare ajutor pentru TDay. funcţie AsByte: byte; funcţie ToString: şir; Sfârșit; 
funcţie TDayHelper. AsByte: byte; începe
rezultat: = Byte (sine); Sfârșit; funcţie TDayHelper. ToString: şir; începecaz de sine de
Luni: rezultat: = 'Luni'; Marți: rezultat: = 'marți'; Miercuri: rezultat: = 'Miercuri'; Joi: rezultat: = 'joi'; Vineri: rezultat: = 'Vineri'; Sâmbătă: rezultat: = 'sâmbătă'; Duminică: rezultat: = 'Duminică'; Sfârșit; Sfârșit; 
var
aDay: TDay; s: șir; începe
aDay: = TDay. Luni; s: = aDay. ToString. Pentru a reduce; Sfârșit; 
convertiți un Delphi Enum într-o reprezentare cu șiruri

Seturi? Ajutor pentru seturi?

TDays = set de TDay; 
var
zile: TDays; s: șir; începe
zile: = [luni.. Miercuri]; zile: = zile + [duminică]; Sfârșit; 

DAR, cât de grozav ar fi să poți face:

var
zile: TDays; b: boolean; începezile: = [luni, marți] b: = zile. Intersect ([luni, joi]). IsEmpty;
tip
TDaysHelper = înregistrare ajutor pentru TDays. funcţie Intersect (const zile: TDays): TDays; funcţie IsEmpty: boolean; Sfârșit;... funcţie TDaysHelper. Intersect (const zile: TDays): TDays; începe
rezultat: = auto * zile; Sfârșit; funcţie TDaysHelper. IsEmpty: boolean; începe
rezultat: = self = []; Sfârșit; 

Pentru fiecare tip de set construit în jurul unei enumerări, va trebui să aveți un ajutor separat, deoarece, din păcate, enumerațiile și seturile nu merg de-a lungul generice și tipuri generice.

Aceasta înseamnă că nu pot fi compilate următoarele:

// NICI UN COMPIL DE ALICI!
TGenericSet = set de ; 
TEnum Generic simplu Exemplu enum

Record Helper pentru setul de byte!

tip
TByteSet = set de byte; TByteSetHelper = înregistrare ajutor pentru TByteSet. 

Putem avea următoarele în definiția TByteSetHelper:

publicprocedură Clar; procedură Include(const valoare: octet); suprasarcină; in linie; procedură Include(const valori: TByteSet); suprasarcină; in linie; procedură Exclude(const valoare: octet); suprasarcină; in linie; procedură Exclude(const valori: TByteSet); suprasarcină; in linie; funcţie Intersect (const valori: TByteSet): TByteSet; in linie; funcţie IsEmpty: boolean; in linie; funcţie include (const valoare: Byte): boolean; suprasarcină; in linie;funcţie include (const valori: TByteSet): boolean; suprasarcină; in linie;funcţie IsSuperSet (const valori: TByteSet): boolean; in linie; funcţie IsSubSet (const valori: TByteSet): boolean; in linie; funcţie equals (const valori: TByteSet): boolean; in linie; funcţie ToString: şir; in linie; Sfârșit; 
{TByteSetHelper}procedură TByteSetHelper. Includeți (valoarea const: Byte); începe
Sistem. Includeți (auto, valoare); Sfârșit; procedură TByteSetHelper. Excludeți (valoarea const: Byte); începe
Sistem. Excludeți (sinele, valoarea); Sfârșit; procedură TByteSetHelper. Clar; începe
sine: = []; Sfârșit; funcţie TByteSetHelper. Egale (valori const: TByteSet): boolean; începe
rezultat: = self = valori; Sfârșit; procedură TByteSetHelper. Excludeți (valorile const: TByteSet); începe
sine: = valori de sine; Sfârșit; procedură TByteSetHelper. Includeți (valorile const: TByteSet); începe
self: = auto + valori; Sfârșit; funcţie TByteSetHelper. Include (valorile const: TByteSet): boolean; începe
rezultat: = IsSuperSet (valori); Sfârșit; funcţie TByteSetHelper. Intersect (valori const: TByteSet): TByteSet; începe
rezultat: = valori auto *; Sfârșit; funcţie TByteSetHelper. Include (valoarea const: Byte): boolean; începe
rezultat: = valoare în sine; Sfârșit; funcţie TByteSetHelper. IsEmpty: boolean; începe
rezultat: = self = []; Sfârșit; funcţie TByteSetHelper. IsSubSet (valori const: TByteSet): boolean; începe
rezultat: = auto <= valori; Sfârșit; funcţie TByteSetHelper. IsSuperSet (valori const: TByteSet): boolean; începe
rezultat: = self> = valori; Sfârșit; funcţie TByteSetHelper. ToString: string; var
b: Byte; începepentru b în de sine do
rezultat: = rezultat + IntToStr (b) + ','; rezultat: = Copiere (rezultat, 1, -2 + Lungime (rezultat)); Sfârșit; 
var
daysAsByteSet: TByteSet; începe
daysAsByteSet. Clar; daysAsByteSet. Includeți (luni. AsByte); daysAsByteSet. Includeți (Integer (sâmbătă); daysAsByteSet. Includeți (Byte (TDay). Marţi)); daysAsByteSet. Includeți (Integer (TDay). Miercuri)); daysAsByteSet. Includeți (Integer (TDay). Miercuri)); // A doua oară - nu are sens. daysAsByteSet. Excludeți (TDay). Marţi. AsByte); ShowMessage (daysAsByteSet. ToString); ShowMessage (BoolToStr (daysAsByteSet). IsSuperSet ([luni. AsByte, sâmbătă. AsByte]), adevărat)); Sfârșit; 

Există un but :(

Rețineți că TByteSet acceptă valorile de byte - și orice astfel de valoare ar fi acceptată aici. TByteSetHelper, astfel cum a fost implementat mai sus, nu este strict tip de enumerare (adică îl puteți alimenta cu o valoare non TDay)... dar atâta timp cât sunt conștient.. funcționează pentru mine.

instagram story viewer