Delphi Record Helpers za komplete in druge enostavne vrste

Razumevanje pomočnikov razreda Delphi (in snemanje) uvaja funkcijo jezika Delphi, ki omogoča razširitev definicije razreda ali vrste zapisa z dodajanjem funkcij in postopkov (metod) v obstoječe razrede in zapise brez dedovanje.

V različici XE3 Delphi so pripomočki za zapisovanje postali močnejši, saj omogočajo razširitev preprostih vrst Delphi, kot so strune, cela števila, enumi, množice in podobno.

Sistem. Enota SysUtils iz Delphi XE3 izvaja zapis z imenom "TStringHelper", ki je pravzaprav pomočnik strun.

S pomočjo Delphi XE3 lahko sestavite in uporabite naslednjo kodo:

var
s: niz; začeti
s: = 'Delphi XE3'; s. Nadomestite ('XE3', 'pravila', []). konec; 

Da bi to bilo mogoče, je bil v Delphiju narejen nov konstrukt "rekorder pomagač [preprost tip]". Za strune je to "tip TStringHelper = pomočnik zapisa za niz". Ime navaja "pomagati pri zapisovanju", vendar ne gre za razširitev zapisi - raje o razširitvi preprostih vrst, kot so strune, cela števila in podobno.

V sistem in sistem. SysUtils obstajajo tudi drugi vnaprej določeni pomočniki za zapisovanje enostavnih vrst, vključno s: TSingleHelper, TDoubleHelper, TExtendedHelper, TGuidHelper (in še nekaj drugih). Iz imena lahko dobite, kakšen preprost tip pomaga pomočnik.

instagram viewer

Obstaja tudi nekaj priročnih odprtokodnih pomočnikov, kot so TDateTimeHelper.

Poštevanja? Pomoč pri naštevanju?

naštevanja
kompleti

Naštevanja in nabori, ki se obravnavajo kot preprosti tipi, se lahko zdaj (v XE3 in pozneje) razširijo z funkcionalnostmi, ki jih ima lahko vrsta zapisa: funkcije, postopki in podobno.

Tukaj je preprosto naštevanje ("TDay") in pomočnik pri zapisu:

tip
TDay = (ponedeljek = 0, torek, sreda, četrtek, petek, sobota, nedelja); TDayHelper = zapisovalka za TDay. funkcijo AsByte: bajt; funkcijo ToString: vrvica; konec; 
funkcijo TDayHelper. AsByte: bajt; začeti
rezultat: = bajt (samo); konec; funkcijo TDayHelper. ToString: vrvica; začetiOvitek jaz od
Ponedeljek: rezultat: = 'ponedeljek'; Torek: rezultat: = 'Torek'; Sreda: rezultat: = 'sreda'; Četrtek: rezultat: = 'četrtek'; Petek: rezultat: = 'petek'; Sobota: rezultat: = 'sobota'; Nedelja: rezultat: = 'nedelja'; konec; konec; 
var
dan: TDay; s: niz; začeti
aDay: = TDay. Ponedeljek; s: = aDnevi. ToString. Znižati; konec; 
pretvorite Delphi Enum v predstavitev strune

Kompleti? Pomoč pri kompletih?

TDays = niz TDay; 
var
dnevi: TDays; s: niz; začeti
dni: = [ponedeljek.. Sreda]; dni: = dnevi + [nedelja]; konec; 

Toda kako ZELO bi bilo to zmožno:

var
dnevi: TDays; b: boolov; začetidni: = [ponedeljek, torek] b: = dni. Križišče ([ponedeljek, četrtek]).
tip
TDaysHelper = zapisovalka za TDays. funkcijo Presečišče (konst dnevi: TDays): TDays; funkcijo IsEmpty: boolean; konec;... funkcijo TDaysHelper. Presečišče (konst dnevi: TDays): TDays; začeti
rezultat: = self * dni; konec; funkcijo TDaysHelper. IsEmpty: boolean; začeti
rezultat: = self = []; konec; 

Za vsak tip niza, sestavljen okoli naštevanja, bi morali imeti ločenega pomočnika, saj naštevanja in množice žal ne gredo skupaj generiki in generične vrste.

To pomeni, da ni mogoče sestaviti naslednjega:

// NI KOMPILA ALIKE!
TGenericSet = niz ; 
TEnum Simple generics Enum primer

Snemite pomočnika za nabor bajtov!

tip
TByteSet = niz Bajta; TByteSetHelper = zapisovalka za TByteSet. 

V definiciji TByteSetHelper imamo naslednje:

javnostipostopek Jasno; postopek Vključi (konst vrednost: bajt); preobremeniti; v vrsti; postopek Vključi (konst vrednosti: TByteSet); preobremeniti; v vrsti; postopek Izključi (konst vrednost: bajt); preobremeniti; v vrsti; postopek Izključi (konst vrednosti: TByteSet); preobremeniti; v vrsti; funkcijo Presečišče (konst vrednosti: TByteSet): TByteSet; v vrsti; funkcijo IsEmpty: boolean; v vrsti; funkcijo Vključuje (konst vrednost: bajt): boolean; preobremenitev; v vrsti;funkcijo Vključuje (konst vrednosti: TByteSet): boolean; preobremenitev; v vrsti;funkcijo IsSuperSet (konst vrednosti: TByteSet): boolean; v vrsti; funkcijo IsSubSet (konst vrednosti: TByteSet): boolean; v vrsti; funkcijo Enako (konst vrednosti: TByteSet): boolean; v vrsti; funkcijo ToString: vrvica; v vrsti; konec; 
{TByteSetHelper}postopek TByteSetHelper. Vključi (vrednost const: bajt); začeti
Sistem. Vključi (samo, vrednost); konec; postopek TByteSetHelper. Izključi (vrednost const: bajt); začeti
Sistem. Izključite (samo, vrednost); konec; postopek TByteSetHelper. Jasno; začeti
self: = []; konec; funkcijo TByteSetHelper. Enako (vrednosti const: TByteSet): boolean; začeti
rezultat: = self = vrednosti; konec; postopek TByteSetHelper. Izključi (vrednosti const: TByteSet); začeti
self: = samovrednotenje; konec; postopek TByteSetHelper. Vključi (vrednosti const: TByteSet); začeti
self: = samo + vrednosti; konec; funkcijo TByteSetHelper. Vključuje (vrednosti const: TByteSet): boolean; začeti
rezultat: = IsSuperSet (vrednosti); konec; funkcijo TByteSetHelper. Presek (vrednosti const: TByteSet): TByteSet; začeti
rezultat: = vrednosti * *; konec; funkcijo TByteSetHelper. Vključuje (vrednost const: bajt): boolean; začeti
rezultat: = vrednost v sebi; konec; funkcijo TByteSetHelper. IsEmpty: boolean; začeti
rezultat: = self = []; konec; funkcijo TByteSetHelper. IsSubSet (vrednosti const: TByteSet): boolean; začeti
rezultat: = self <= vrednosti; konec; funkcijo TByteSetHelper. IsSuperSet (vrednosti const: TByteSet): boolean; začeti
rezultat: = self> = vrednosti; konec; funkcijo TByteSetHelper. ToString: string; var
b: bajt; začetiza b v jaz stori
rezultat: = rezultat + IntToStr (b) + ','; rezultat: = Kopiraj (rezultat, 1, -2 + Dolžina (rezultat)); konec; 
var
dniAsByteSet: TByteSet; začeti
dniAsByteSet Jasno; dniAsByteSet Vključi (ponedeljek) AsByte); dniAsByteSet Vključi (Integer (sobota); dniAsByteSet Vključi (bajt (TDay). Torek)); dniAsByteSet Vključi (Integer (TDay). Sreda)); dniAsByteSet Vključi (Integer (TDay). Sreda)); // 2. čas - brez smisla. dniAsByteSet Izključi (TDay). Torek. AsByte); ShowMessage (dneviAsByteSet) ToString); ShowMessage (BoolToStr (dniAsByteSet) IsSuperSet ([ponedeljek. AsByte, sobota. AsByte]), resnično)); konec; 

Obstaja pa :(

Upoštevajte, da TByteSet sprejema bajtne vrednosti - in takšna vrednost bi bila tukaj sprejeta. TByteSetHelper, kot je implementirano zgoraj, ni strog tip oštevilčenja (tj. Lahko ga hranite z vrednostjo, ki ni TDay)... ampak dokler se zavedam.. meni deluje.