Delphi Record Hjelpere for sett og andre enkle typer

Forståelse av Delphi Class (og ta opp) hjelpere introduserer en funksjon i Delphi-språket som lar deg utvide definisjonen av en klasse eller en posttype ved å legge til funksjoner og prosedyrer (metoder) til eksisterende klasser og poster uten arv.

I XE3 Delphi-versjonen ble platehjelpere kraftigere ved å la utvide enkle Delphi-typer som strenger, heltall, enums, sett og likt.

Systemet. SysUtils-enheten, fra Delphi XE3, implementerer en post som heter "TStringHelper" som faktisk er en rekordhjelper for strenger.

Ved hjelp av Delphi XE3 kan du sammenstille og bruke neste kode:

Var
s: streng; begynne
s: = 'Delphi XE3'; s. Erstatt ('XE3', 'regler', []). ToUpper; slutt; 

For at dette skulle være mulig, ble det laget en ny konstruksjon i Delphi "platehjelper for [enkel type]". For strenger er dette "type TStringHelper = record helper for string". Navnet oppgir "rekordhjelper", men dette handler ikke om å utvide poster - snarere om å utvide enkle typer som strenger, heltall og like.

I system og system. SysUtils det er andre forhåndsdefinerte platehjelpere for enkle typer, inkludert: TSingleHelper, TDoubleHelper, TExtendedHelper, TGuidHelper (og noen få andre). Du kan få fra navnet hvilken enkel type hjelperen forlenger.

instagram viewer

Det er også noen nyttige open source-hjelpere, som TDateTimeHelper.

Enumerations? Hjelper for oppregninger?

enumerations
settene

Enumerasjoner og sett som behandles som enkle typer kan også nå (i XE3 og utover) utvides med funksjonalitet en posttype kan ha: funksjoner, prosedyrer og likt.

Her er en enkel oppregning ("TDay") og en rekordhjelper:

type
TDay = (mandag = 0, tirsdag, onsdag, torsdag, fredag, lørdag, søndag); TDayHelper = rekordhjelper for Tday. funksjon AsByte: byte; funksjon toString: string; slutt; 
funksjon TDayHelper. AsByte: byte; begynne
resultat: = Byte (egen); slutt; funksjon TDayHelper. toString: string; begynnesak selv- av
Mandag: resultat: = 'Mandag'; Tirsdag: resultat: = 'tirsdag'; Onsdag: resultat: = 'Onsdag'; Torsdag: resultat: = 'Torsdag'; Fredag: resultat: = 'fredag'; Lørdag: resultat: = 'lørdag'; Søndag: resultat: = 'søndag'; slutt; slutt; 
Var
aDay: TDay; s: streng; begynne
aDay: = TDay. Mandag; s: = aDay. ToString. Å senke; slutt; 
konvertere en Delphi Enum til en strengrepresentasjon

Settene? Hjelper for sett?

TDager = sett med tday; 
Var
dager: TDager; s: streng; begynne
dager: = [Mandag.. Onsdag]; dager: = dager + [søndag]; slutt; 

MEN, hvor STOR ville det være å kunne gjøre:

Var
dager: TDager; b: boolsk; begynnedager: = [Mandag, tirsdag] b: = dager. Kryss ((mandag, torsdag)). IsEmpty;
type
TDaysHelper = rekordhjelper for TDays. funksjon Krysse(konst dager: TDays): TDays; funksjon IsEmpty: boolean; slutt;... funksjon TDaysHelper. Krysse(konst dager: TDays): TDays; begynne
resultat: = selv * dager; slutt; funksjon TDaysHelper. IsEmpty: boolean; begynne
resultat: = selv = []; slutt; 

For hver settype som er konstruert rundt en oppregning, trenger du å ha en egen hjelper, som, dessverre, oppregninger og sett ikke følger med generiske og generiske typer.

Dette betyr at følgende ikke kan settes sammen:

// INGEN SAMMENSETNING AV LIKE!
TGenericSet = sett med ; 
TEnum Enkel generikk Enum eksempel

Record Helper For Set Byte!

type
TByteSet = sett med byte; TByteSetHelper = rekordhjelper for TByteSet. 

Vi kan ha følgende i definisjonen av TByteSetHelper:

offentligfremgangsmåte Klar; fremgangsmåte Inkludere(konst verdi: Byte); overbelastning; på linje; fremgangsmåte Inkludere(konst verdier: TByteSet); overbelastning; på linje; fremgangsmåte Utelukke(konst verdi: Byte); overbelastning; på linje; fremgangsmåte Utelukke(konst verdier: TByteSet); overbelastning; på linje; funksjon Krysse(konst verdier: TByteSet): TByteSet; på linje; funksjon IsEmpty: boolean; på linje; funksjon inkluderer (konst verdi: Byte): boolsk; overbelastning; på linje;funksjon inkluderer (konst verdier: TByteSet): boolsk; overbelastning; på linje;funksjon IsSuperSet (konst verdier: TByteSet): boolsk; på linje; funksjon IsSubSet (konst verdier: TByteSet): boolsk; på linje; funksjon Er lik(konst verdier: TByteSet): boolsk; på linje; funksjon toString: string; på linje; slutt; 
{TByteSetHelper}fremgangsmåte TByteSetHelper. Inkluder (const-verdi: Byte); begynne
System. Inkluder (egen, verdi); slutt; fremgangsmåte TByteSetHelper. Ekskluder (const-verdi: Byte); begynne
System. Ekskluder (egen, verdi); slutt; fremgangsmåte TByteSetHelper. Klar; begynne
selv: = []; slutt; funksjon TByteSetHelper. Lik (konstverdier: TByteSet): boolsk; begynne
resultat: = selv = verdier; slutt; fremgangsmåte TByteSetHelper. Ekskluder (const-verdier: TByteSet); begynne
selv: = selvverdier; slutt; fremgangsmåte TByteSetHelper. Inkluder (const-verdier: TByteSet); begynne
jeget: = selv + verdier; slutt; funksjon TByteSetHelper. Inkluderer (const-verdier: TByteSet): boolsk; begynne
resultat: = IsSuperSet (verdier); slutt; funksjon TByteSetHelper. Kryss (const-verdier: TByteSet): TByteSet; begynne
resultat: = selv * verdier; slutt; funksjon TByteSetHelper. Inkluderer (const-verdi: Byte): boolsk; begynne
resultat: = verdi i seg selv; slutt; funksjon TByteSetHelper. IsEmpty: boolean; begynne
resultat: = selv = []; slutt; funksjon TByteSetHelper. IsSubSet (konstverdier: TByteSet): boolsk; begynne
resultat: = selv <= verdier; slutt; funksjon TByteSetHelper. IsSuperSet (konstverdier: TByteSet): boolsk; begynne
resultat: = selv> = verdier; slutt; funksjon TByteSetHelper. ToString: streng; Var
b: Byte; begynnetil b i selv- gjøre
resultat: = resultat + IntToStr (b) + ','; resultat: = Kopier (resultat, 1, -2 + Lengde (resultat)); slutt; 
Var
dagerAsByteSet: TByteSet; begynne
daysAsByteSet. Klar; daysAsByteSet. Inkluder (mandag. AsByte); daysAsByteSet. Inkluder (heltall (lørdag); daysAsByteSet. Inkluder (Byte (TDay. Tirsdag)); daysAsByteSet. Inkluder (heltall (TDay. Onsdag)); daysAsByteSet. Inkluder (heltall (TDay. Onsdag)); // 2. gang - ingen mening. daysAsByteSet. Ekskluder (TDay. Tirsdag. AsByte); ShowMessage (dagerAsByteSet. ToString); ShowMessage (BoolToStr (dager SomByteSet). IsSuperSet ([mandag. AsByte, lørdag. AsByte]), sann)); slutt; 

Det er en :(

Merk at TByteSet godtar byteverdier - og en slik verdi vil bli akseptert her. TByteSetHelper som implementert ovenfor er ikke enumeration type streng (dvs. du kan mate den med en ikke-TDay-verdi)... men så lenge jeg er klar.. det fungerer for meg.