Delphi Record pomagači za setove i druge jednostavne vrste

click fraud protection

Razumijevanje pomagača klase Delphi (i snimanja) uvodi značajku jezika Delphi omogućavajući proširivanje definicije klase ili vrste zapisa dodavanjem funkcija i postupaka (metoda) u postojeće klase i zapise bez baština.

U verziji XE3 Delphi pomagači za snimanje postali su snažniji tako što su omogućili proširenje jednostavnih Delphi tipova kao što su žice, cijeli brojevi, enumi, skupovi i slično.

Sustav. SysUtils jedinica, iz Delphi XE3, implementira zapis pod nazivom "TStringHelper" koji je zapravo rekordni pomagač za žice.

Pomoću Delphi XE3 možete sastaviti i koristiti sljedeći kod:

var
s: string; početi
s: = 'Delphi XE3'; a. Zamijenite ('XE3', 'pravila', []). kraj; 

Da bi to bilo moguće, napravljen je novi konstrukt u Delphiju "rekorder pomagač [jednostavnom tipu]". Za žice je ovo "upišite TStringHelper = pomagalo za snimanje niza". Naziv navodi "pomagač u snimanju", ali ne radi se o produženju ploče - radije o proširivanju jednostavnih vrsta poput nizova, cijelih brojeva i slično.

U sustavu i sustavu. SysUtils postoje i drugi unaprijed definirani pomagači za jednostavne tipove, uključujući: TSingleHelper, TDoubleHelper, TExtendedHelper, TGuidHelper (i nekoliko drugih). Iz imena možete dobiti ono što je jednostavna vrsta pomoćnika.

instagram viewer

Postoje i neki zgodni pomagači otvorenog koda, poput TDateTimeHelper.

Enumerations? Pomoćnik za nabrajanje?

enumerations
setovi

Nabrojavanja i skupovi koji se tretiraju kao jednostavni tipovi također se sada mogu (u XE3 i šire) proširiti funkcionalnostima koje vrsta zapisa može imati: funkcije, postupci i slično.

Evo jednostavnog nabrajanja ("TDay") i rekordnog pomagača:

tip
TDay = (ponedjeljak = 0, utorak, srijeda, četvrtak, petak, subota, nedjelja); TDayHelper = rekord pomagač za TDay. funkcija AsByte: bajt; funkcija ToString: niz; kraj; 
funkcija TDayHelper. AsByte: bajt; početi
rezultat: = bajt (samo); kraj; funkcija TDayHelper. ToString: niz; početislučaj sam od
Ponedjeljak: rezultat: = 'Ponedjeljak'; Utorak: rezultat: = 'Utorak'; Srijeda: rezultat: = 'srijeda'; Četvrtak: rezultat: = 'četvrtak'; Petak: rezultat: = 'petak'; Subota: rezultat: = 'subota'; Nedjelja: rezultat: = 'Nedjelja'; kraj; kraj; 
var
aDan: TDay; s: string; početi
aDan: = TDay. Ponedjeljak; s: = aDan. ToString. Spustiti; kraj; 
pretvorite Delphi Enum u nizu predstav

Setovi? Pomoć za setove?

TDays = set od TDay; 
var
dana: TDays; s: string; početi
dana: = [ponedjeljak.. Srijeda]; dana: = dani + [nedjelja]; kraj; 

Ali kako bi bilo VELIKO da biste to mogli učiniti:

var
dana: TDays; b: boolov; početidana: = [ponedjeljak, utorak] b: = dana. Presijecajte ([ponedjeljak, četvrtak]).
tip
TDaysHelper = rekord pomagač za TDays. funkcija Sjecište (const dana: TDays): TDays; funkcija IsEmpty: boolean; kraj;... funkcija TDaysHelper. Sjecište (const dana: TDays): TDays; početi
rezultat: = samo * dana; kraj; funkcija TDaysHelper. IsEmpty: boolean; početi
rezultat: = samo = []; kraj; 

Za svaki tip skupa sastavljen oko nabrajanja potreban vam je poseban pomoćnik jer nažalost nabrajanje i skupovi ne idu zajedno generičke i generičke vrste.

To znači da se ne može sastaviti sljedeće:

// NEMA KOMPILA ALIKE!
TGenericSet = skup od ; 
Primjer TEnum Simple generički Enum

Snimite pomoćnika za skup bajtova!

tip
TByteSet = set od Bajt; TByteSetHelper = rekord pomagač za TByteSet. 

U definiciji TByteSetHelper možemo imati sljedeće:

javnostpostupak Čisto; postupak Uključi (const vrijednost: bajt); preopterećenje; u redu; postupak Uključi (const vrijednosti: TByteSet); preopterećenje; u redu; postupak Isključiti(const vrijednost: bajt); preopterećenje; u redu; postupak Isključiti(const vrijednosti: TByteSet); preopterećenje; u redu; funkcija Sjecište (const vrijednosti: TByteSet): TByteSet; u redu; funkcija IsEmpty: boolean; u redu; funkcija uključuje (const vrijednost: byte): boolean; preopterećenje; u redu;funkcija uključuje (const vrijednosti: TByteSet): boolean; preopterećenje; u redu;funkcija IsSuperSet (const vrijednosti: TByteSet): boolean; u redu; funkcija IsSubSet (const vrijednosti: TByteSet): boolean; u redu; funkcija equals (const vrijednosti: TByteSet): boolean; u redu; funkcija ToString: niz; u redu; kraj; 
{TByteSetHelper}postupak TByteSetHelper. Uključi (vrijednost const: bajt); početi
Sustav. Uključiti (samo, vrijednost); kraj; postupak TByteSetHelper. Isključi (vrijednost const: bajt); početi
Sustav. Isključiti (sebe, vrijednost); kraj; postupak TByteSetHelper. Čisto; početi
samo: = []; kraj; funkcija TByteSetHelper. Jednake (vrijednosti const: TByteSet): boolean; početi
rezultat: = samo = vrijednosti; kraj; postupak TByteSetHelper. Isključi (vrijednosti const: TByteSet); početi
self: = samo-vrijednosti; kraj; postupak TByteSetHelper. Uključi (vrijednosti const: TByteSet); početi
samo: vrijednosti + vrijednosti; kraj; funkcija TByteSetHelper. Sadrži (vrijednosti const: TByteSet): boolean; početi
rezultat: = IsSuperSet (vrijednosti); kraj; funkcija TByteSetHelper. Presijecanje (vrijednosti const: TByteSet): TByteSet; početi
rezultat: = self * vrijednosti; kraj; funkcija TByteSetHelper. Sadrži (vrijednost const: bajt): boolean; početi
rezultat: = vrijednost u sebi; kraj; funkcija TByteSetHelper. IsEmpty: boolean; početi
rezultat: = samo = []; kraj; funkcija TByteSetHelper. IsSubSet (vrijednosti const: TByteSet): boolean; početi
rezultat: = samo <= vrijednosti; kraj; funkcija TByteSetHelper. IsSuperSet (vrijednosti const: TByteSet): boolean; početi
rezultat: = samo> = vrijednosti; kraj; funkcija TByteSetHelper. ToString: string; var
b: bajt; početiza b u sam čini
rezultat: = rezultat + IntToStr (b) + ','; rezultat: = Kopiraj (rezultat, 1, -2 + duljina (rezultat)); kraj; 
var
daysAsByteSet: TByteSet; početi
daysAsByteSet. Čisto; daysAsByteSet. Uključi (ponedjeljak). AsByte); daysAsByteSet. Uključi (Integer (subota); daysAsByteSet. Uključi (bajt (TDay). Utorak)); daysAsByteSet. Uključi (Integer (TDay). Srijeda)); daysAsByteSet. Uključi (Integer (TDay). Srijeda)); // 2. put - nema smisla. daysAsByteSet. Isključite (TDay). Utorak. AsByte); ShowMessage (daniAsByteSet). ToString); ShowMessage (BoolToStr (daniAsByteSet). IsSuperSet ([ponedjeljak. AsByte, subota. AsByte]), istina)); kraj; 

Postoji samo :(

Imajte na umu da TByteSet prihvaća bajtne vrijednosti - i svaka takva vrijednost bila bi prihvaćena ovdje. TByteSetHelper kao što je ranije implementirano nije strogo nabrojavanje (tj. Možete ga hraniti sa ne-TDay vrijednošću)... ali koliko sam svjestan.. meni djeluje.

instagram story viewer