Delphi Record Helpers pro sady a další jednoduché typy

click fraud protection

Porozumění pomocníkům třídy Delphi (a záznamu) zavádí funkci jazyka Delphi, která vám umožňuje rozšířit definici třídy nebo typu záznamu přidáním funkcí a postupů (metod) do stávajících tříd a záznamů bez dědictví.

Ve verzi XE3 Delphi se pomocníci s nahráváním stali silnějšími tím, že umožnili rozšířit jednoduché typy Delphi, jako jsou řetězce, celá čísla, výčty, sady a podobně.

Systém. Jednotka SysUtils od Delphi XE3 implementuje záznam s názvem "TStringHelper", který je ve skutečnosti pomocníkem záznamu pro řetězce.

Pomocí Delphi XE3 můžete kompilovat a používat následující kód:

var
s: string; začít
s: = 'Delphi XE3'; s. Nahradit („XE3“, „pravidla“, []). konec; 

Aby to bylo možné, byl v Delphi vytvořen nový konstrukt „pomocník záznamu pro [jednoduchý typ]“. U řetězců se jedná o „typ TStringHelper = pomocník záznamu pro řetězec“. Název uvádí „pomocník s nahráváním“, ale nejde o prodloužení evidence - spíše o rozšiřování jednoduchých typů, jako jsou řetězce, celá čísla a podobně.

V systému a systému. SysUtils existují další předdefinované pomocníky záznamu pro jednoduché typy, včetně: TSingleHelper, TDoubleHelper, TExtendedHelper, TGuidHelper (a několik dalších). Z názvu můžete zjistit, jaký jednoduchý typ pomocník rozšiřuje.

instagram viewer

Existuje také několik užitečných pomocníků s otevřeným zdrojovým kódem TDateTimeHelper.

Výpočty? Pomocník pro výčet?

výčty
sady

Výpočty a množiny považované za jednoduché typy lze nyní také (v XE3 a dále) rozšířit o funkce, které může mít typ záznamu: funkce, procedury a podobně.

Zde je jednoduchý výčet („TDay“) a pomocník záznamu:

typ
TDay = (pondělí = 0, úterý, středa, čtvrtek, pátek, sobota, neděle); TDayHelper = rekordní pomocník pro TDay. funkce AsByte: byte; funkce ToString: tětiva; konec; 
funkce TDayHelper. AsByte: byte; začít
výsledek: = Byte (self); konec; funkce TDayHelper. ToString: tětiva; začítpouzdroz
Pondělí: výsledek: = 'pondělí'; Úterý: výsledek: = 'úterý'; Středa: výsledek: = 'Středa'; Čtvrtek: výsledek: = 'Čtvrtek'; Friday: result: = 'Friday'; Sobota: výsledek: = 'Sobota'; Neděle: výsledek: = 'neděle'; konec; konec; 
var
aDay: TDay; s: string; začít
aDay: = TDay. Pondělí; s: = aDay. ToString. Snížit; konec; 
převést Delphi Enum na String Representation

Sady? Pomocník pro sady?

TDays = sada TDay; 
var
dny: TDays; s: string; začít
dny: = [pondělí.. Středa]; dny: = dny + [neděle]; konec; 

VUT v Brně, jak by to bylo skvělé:

var
dny: TDays; b: boolean; začítdny: = [pondělí, úterý] b: = dny. Protínat ([pondělí, čtvrtek]). IsEmpty;
typ
TDaysHelper = rekordní pomocník pro TDays. funkce Průnik (konst dny: TDays): TDays; funkce IsEmpty: boolean; konec;... funkce TDaysHelper. Průnik (konst dny: TDays): TDays; začít
výsledek: = vlastní * dny; konec; funkce TDaysHelper. IsEmpty: boolean; začít
výsledek: = self = []; konec; 

Pro každý typ množiny sestrojený kolem výčtu byste potřebovali samostatného pomocníka, protože bohužel výčty a množiny bohužel nepřicházejí generiky a generické typy.

To znamená, že nelze kompilovat následující:

// ŽÁDNÁ SLOŽKA ALIKE!
TGenericSet = sada ; 
TEnum Simple generics Příklad Enum

Rekordní pomocník pro sadu bajtů!

typ
TByteSet = sada Byte; TByteSetHelper = rekordní pomocník pro TByteSet. 

V definici TByteSetHelper můžeme mít následující:

veřejnostpostup Průhledná; postup Zahrnout(konst hodnota: Byte); přetížení; v souladu; postup Zahrnout(konst hodnoty: TByteSet); přetížení; v souladu; postup Vyloučit(konst hodnota: Byte); přetížení; v souladu; postup Vyloučit(konst hodnoty: TByteSet); přetížení; v souladu; funkce Průnik (konst hodnoty: TByteSet): TByteSet; v souladu; funkce IsEmpty: boolean; v souladu; funkce Zahrnuje(konst hodnota: Byte): boolean; přetížení; v souladu;funkce Zahrnuje(konst hodnoty: TByteSet): boolean; přetížení; v souladu;funkce IsSuperSet (konst hodnoty: TByteSet): boolean; v souladu; funkce IsSubSet (konst hodnoty: TByteSet): boolean; v souladu; funkce Rovná se(konst hodnoty: TByteSet): boolean; v souladu; funkce ToString: tětiva; v souladu; konec; 
{TByteSetHelper}postup TByteSetHelper. Zahrnout (hodnota konstanty: Byte); začít
Systém. Zahrnout (vlastní, hodnota); konec; postup TByteSetHelper. Vyloučit (hodnota const: Byte); začít
Systém. Vyloučit (vlastní, hodnota); konec; postup TByteSetHelper. Průhledná; začít
self: = []; konec; funkce TByteSetHelper. Rovná se (konstantní hodnoty: TByteSet): boolean; začít
výsledek: = self = hodnoty; konec; postup TByteSetHelper. Vyloučit (hodnoty const: TByteSet); začít
self: = self - hodnoty; konec; postup TByteSetHelper. Zahrnout (hodnoty konstanty: TByteSet); začít
self: = self + hodnoty; konec; funkce TByteSetHelper. Zahrnuje (hodnoty konstanty: TByteSet): boolean; začít
result: = IsSuperSet (hodnoty); konec; funkce TByteSetHelper. Průnik (konstantní hodnoty: TByteSet): TByteSet; začít
výsledek: = vlastní * hodnoty; konec; funkce TByteSetHelper. Zahrnuje (konstantní hodnota: Byte): boolean; začít
result: = value in self; konec; funkce TByteSetHelper. IsEmpty: boolean; začít
výsledek: = self = []; konec; funkce TByteSetHelper. IsSubSet (konstantní hodnoty: TByteSet): boolean; začít
výsledek: = vlastní <= hodnoty; konec; funkce TByteSetHelper. IsSuperSet (konstantní hodnoty: TByteSet): boolean; začít
výsledek: = vlastní> = hodnoty; konec; funkce TByteSetHelper. ToString: string; var
b: Byte; začítpro b vdělat
result: = result + IntToStr (b) + ','; výsledek: = Kopie (výsledek, 1, -2 + Délka (výsledek)); konec; 
var
daysAsByteSet: TByteSet; začít
daysAsByteSet. Průhledná; daysAsByteSet. Zahrnout (pondělí. AsByte); daysAsByteSet. Zahrnout (celé číslo (sobota); daysAsByteSet. Zahrnout (Byte (TDay). Úterý)); daysAsByteSet. Zahrnout (celé číslo (TDay). Středa)); daysAsByteSet. Zahrnout (celé číslo (TDay). Středa)); // podruhé - žádný smysl. daysAsByteSet. Vyloučit (TDay. Úterý. AsByte); ShowMessage (daysAsByteSet. ToString); ShowMessage (BoolToStr (daysAsByteSet. IsSuperSet ([pondělí. AsByte, sobota. AsByte]), true)); konec; 

Je tu ale :(

Uvědomte si, že TByteSet přijímá hodnoty bajtů - a jakákoli taková hodnota by zde byla akceptována. TByteSetHelper, jak je implementován výše, není typ výčtu striktní (tj. Můžete ho nakládat s jinou hodnotou než TDay)... ale pokud jsem si vědom.. funguje to pro mě.

instagram story viewer