Delphi Record Helpers pre sady a ďalšie jednoduché typy

Pochopenie pomocníkov triedy Delphi (a záznamov) predstavuje funkciu jazyka Delphi, ktorá vám umožňuje rozšíriť definíciu triedy alebo typu záznamu pridaním funkcií a postupov (metód) k existujúcim triedam a záznamom bez dedičstvo.

Vo verzii XE3 Delphi sa pomocníci pri nahrávaní stali silnejšími tým, že umožnili rozširovať jednoduché typy Delphi, ako sú reťazce, celá čísla, výčty, množiny a podobne.

Systém. Jednotka SysUtils od Delphi XE3 implementuje záznam s názvom „TStringHelper“, ktorý je v skutočnosti pomocníkom záznamu pre reťazce.

Pomocou Delphi XE3 môžete zostaviť a použiť nasledujúci kód:

var
s: string; začať
s: = 'Delphi XE3'; s. Nahradiť („XE3“, „pravidlá“, []). koniec; 

Aby to bolo možné, bol vyrobený nový konštrukt v Delphi „rekordný pomocník pre [jednoduchý typ]“. Pre reťazce je to „typ TStringHelper = pomocník záznamu pre reťazec“. Názov uvádza „pomocník s nahrávaním“, ale nejde o predĺženie záznamy - skôr o rozširovaní jednoduchých typov, ako sú reťazce, celé čísla a podobne.

instagram viewer

V systéme a systéme. SysUtils existujú ďalšie preddefinované pomocníkov záznamu pre jednoduché typy, vrátane: TSingleHelper, TDoubleHelper, TExtendedHelper, TGuidHelper (a niekoľko ďalších). Z názvu môžete zistiť, aký jednoduchý typ pomocník rozširuje.

Existuje aj niekoľko užitočných pomocníkov s otvoreným zdrojom, ako napríklad TDateTimeHelper.

Enumerácie? Pomocník pre enumerácie?

výpočty
súpravy

Výpočty a množiny, ktoré sa považujú za jednoduché typy, sa dajú teraz (v XE3 a ďalej) rozšíriť o funkcie, ktoré môže mať typ záznamu: funkcie, postupy a podobne.

Toto je jednoduché vymenovanie („TDay“) a pomocník s záznamom:

typ
TDay = (pondelok = 0, utorok, streda, štvrtok, piatok, sobota, nedeľa); TDayHelper = rekordný pomocník pre TDay. funkcie AsByte: byte; funkcie Natiahnuť: povrázok; koniec; 
funkcie TDayHelper. AsByte: byte; začať
výsledok: = Byte (samostatne); koniec; funkcie TDayHelper. Natiahnuť: povrázok; začaťpúzdro sám z
Pondelok: výsledok: = 'pondelok'; Utorok: výsledok: = 'Utorok'; Streda: výsledok: = 'Streda'; Štvrtok: výsledok: = 'Štvrtok'; Piatok: výsledok: = 'Piatok'; Sobota: výsledok: = 'Sobota'; Nedeľa: výsledok: = 'nedeľa'; koniec; koniec; 
var
aDay: TDay; s: string; začať
aDay: = TDay. pondelok; s: = aDeň. Natiahnuť. Znížiť; koniec; 
previesť Delphi Enum na String Representation

Sety? Pomocník pre sady?

TDays = sada TDay; 
var
dní: TDays; s: string; začať
dní: = [pondelok.. Streda]; dni: = dni + [nedeľa]; koniec; 

VUT v Brne, aké veľké by to bolo urobiť:

var
dní: TDays; b: boolovský; začaťdní: = [pondelok, utorok] b: = dni. Priesečník ([pondelok, štvrtok]). IsEmpty;
typ
TDaysHelper = rekordný pomocník pre TDays. funkcie prienik (const dni: TDays): TDays; funkcie IsEmpty: boolean; koniec;... funkcie TDaysHelper. prienik (const dni: TDays): TDays; začať
výsledok: = vlastné * dni; koniec; funkcie TDaysHelper. IsEmpty: boolean; začať
výsledok: = self = []; koniec; 

Pre každý typ množiny konštruovaný okolo výčtu by ste mali mať samostatného pomocníka, pretože, bohužiaľ, výčty a množiny nechodia spolu generiká a generické typy.

To znamená, že nie je možné zostaviť:

// ŽIADNA KOMPLETNÁ INFORMÁCIA!
TGenericSet = sada ; 
TEnum Jednoduché generiká Príklad Enum

Rekordný pomocník pre sadu bajtov!

typ
TByteSet = sada byte; TByteSetHelper = rekordný pomocník pre TByteSet. 

V definícii TByteSetHelper môžeme mať nasledujúce:

verejnosťprocedúra Jasný; procedúra include (const hodnota: bajt); preťaženie; v rade; procedúra include (const hodnoty: TByteSet); preťaženie; v rade; procedúra vylúčiť (const hodnota: bajt); preťaženie; v rade; procedúra vylúčiť (const hodnoty: TByteSet); preťaženie; v rade; funkcie prienik (const hodnoty: TByteSet): TByteSet; v rade; funkcie IsEmpty: boolean; v rade; funkcie zahŕňa (const hodnota: Byte): boolean; preťaženia; v rade;funkcie zahŕňa (const hodnoty: TByteSet): boolean; preťaženia; v rade;funkcie IsSuperSet (const hodnoty: TByteSet): boolean; v rade; funkcie IsSubSet (const hodnoty: TByteSet): boolean; v rade; funkcie rovní (const hodnoty: TByteSet): boolean; v rade; funkcie Natiahnuť: povrázok; v rade; koniec; 
{TByteSetHelper}procedúra TByteSetHelper. Zahrnúť (konštantná hodnota: Byte); začať
Systém. Zahrnúť (vlastné, hodnota); koniec; procedúra TByteSetHelper. Vylúčiť (konštantná hodnota: Byte); začať
Systém. Vylúčiť (vlastné, hodnota); koniec; procedúra TByteSetHelper. Jasný; začať
self: = []; koniec; funkcie TByteSetHelper. Rovná sa (konštantné hodnoty: TByteSet): boolean; začať
result: = self = hodnoty; koniec; procedúra TByteSetHelper. Vylúčiť (konštantné hodnoty: TByteSet); začať
self: = self - value; koniec; procedúra TByteSetHelper. Zahrnúť (konštantné hodnoty: TByteSet); začať
self: = self + hodnoty; koniec; funkcie TByteSetHelper. Zahŕňa (konštantné hodnoty: TByteSet): boolean; začať
result: = IsSuperSet (hodnoty); koniec; funkcie TByteSetHelper. Priesečník (konštantné hodnoty: TByteSet): TByteSet; začať
result: = self * value; koniec; funkcie TByteSetHelper. Zahŕňa (konštantná hodnota: bajt): boolean; začať
result: = hodnota samostatne; koniec; funkcie TByteSetHelper. IsEmpty: boolean; začať
výsledok: = self = []; koniec; funkcie TByteSetHelper. IsSubSet (konštantné hodnoty: TByteSet): boolean; začať
výsledok: = samostatne <= hodnoty; koniec; funkcie TByteSetHelper. IsSuperSet (konštantné hodnoty: TByteSet): boolean; začať
výsledok: = samostatne> = hodnoty; koniec; funkcie TByteSetHelper. ToString: string; var
b: bajt; začaťpre b v sám robiť
result: = result + IntToStr (b) + ','; výsledok: = kópia (výsledok, 1, -2 + dĺžka (výsledok)); koniec; 
var
daysAsByteSet: TByteSet; začať
daysAsByteSet. Jasný; daysAsByteSet. Zahrnúť (pondelok. Asby); daysAsByteSet. Zahrnúť (celé číslo (sobota); daysAsByteSet. Zahrnúť (Byte (TDay). Utorok)); daysAsByteSet. Zahrnúť (celé číslo (TDay). Streda)); daysAsByteSet. Zahrnúť (celé číslo (TDay). Streda)); // druhýkrát - nemá zmysel. daysAsByteSet. Vylúčiť (TDay. Utorok. Asby); ShowMessage (daysAsByteSet. Natiahnuť); Zobraziť správu (BoolToStr (daysAsByteSet. IsSuperSet ([pondelok. AsByte, sobota. AsByte]), true)); koniec; 

Je tu ale :(

Všimnite si, že TByteSet akceptuje bajtové hodnoty - a akákoľvek takáto hodnota by tu bola akceptovaná. TByteSetHelper, ako je implementovaný vyššie, nie je typ výčtu striktný (t. J. Môžete ho kŕmiť hodnotou, ktorá nie je TDay)... ale pokiaľ som si vedomý.. funguje to pre mňa.