Setler ve Diğer Basit Tipler İçin Delphi Kayıt Yardımcıları

Delphi Sınıfı (ve Kayıt) Yardımcılarını Anlama mevcut sınıflara ve kayıtlara işlevler ve yordamlar (yöntemler) ekleyerek sınıf veya kayıt türünün tanımını genişletmenize olanak tanıyan Delphi dilinin bir özelliğini sunar miras.

XE3 Delphi sürümünde, kayıt yardımcıları, dizeler, tamsayılar, numaralar, kümeler ve benzerleri gibi basit Delphi türlerini genişletmeye izin vererek daha güçlü hale geldi.

Sistem. Delphi XE3'ten SysUtils birimi, aslında dizeler için bir kayıt yardımcısı olan "TStringHelper" adlı bir kayıt uygular.

Delphi XE3'ü kullanarak bir sonraki kodu derleyebilir ve kullanabilirsiniz:

var
s: dize; başla
s: = 'Delphi XE3'; s. Değiştirin ('XE3', 'kurallar', []). son; 

Bunun mümkün olması için Delphi'de "[basit tip] için kayıt yardımcısı" nda yeni bir yapı yapıldı. Dizeler için bu "type TStringHelper = dize için kayıt yardımcısı" dır. Adında "kayıt yardımcısı" yazıyor ancak bu genişletmeyle ilgili değil kayıtlar - dizeler, tamsayılar ve benzerleri gibi basit türleri genişletmekle ilgilidir.

instagram viewer

Sistem ve Sistemde. SysUtils, basit türler için önceden tanımlanmış başka kayıt yardımcıları da vardır: TSingleHelper, TDoubleHelper, TExtendedHelper, TGuidHelper (ve birkaç tanesi). Yardımcıdan ne kadar basit bir tipte olduğunu isminden alabilirsiniz.

Bazı kullanışlı açık kaynak yardımcıları da var. TDateTimeHelper.

Numaralandırma? Numaralandırma için Yardımcı?

numaralandırma
kümeler

Basit türler olarak kabul edilen numaralandırmalar ve kümeler artık (XE3 ve sonrasında) bir kayıt türünün sahip olabileceği işlevsellik ile genişletilebilir: fonksiyonlar, prosedürler ve benzerleri.

İşte basit bir numaralandırma ("TDay") ve bir kayıt yardımcısı:

tip
TDay = (Pazartesi = 0, Salı, Çarşamba, Perşembe, Cuma, Cumartesi, Pazar); TDayHelper = için kayıt yardımcısı TDay. fonksiyon AsByte: bayt; fonksiyon ToString: sicim; son; 
fonksiyon TDayHelper. AsByte: bayt; başla
sonuç: = Bayt (kendi kendine); son; fonksiyon TDayHelper. ToString: sicim; başladurum öz nın-nin
Pazartesi: sonuç: = 'Pazartesi'; Salı: sonuç: = 'Salı'; Çarşamba: sonuç: = 'Çarşamba'; Perşembe: sonuç: = 'Perşembe'; Cuma: sonuç: = 'Cuma'; Cumartesi: sonuç: = 'Cumartesi'; Pazar: sonuç: = 'Pazar'; son; son; 
var
aGün: TDay; s: dize; başla
aDay: = TDay. Pazartesi; s: = aGün. ToString. Daha düşük; son; 
Delphi Enum'unu Dize Temsiline Dönüştürme

Kümeler? Setler için Yardımcı?

TDays = kümesi TDay; 
var
günler: TDays; s: dize; başla
gün: = [Pazartesi.. Çarşamba]; gün: = gün + [Pazar]; son; 

ANCAK, bunu yapabilmek ne kadar BÜYÜK olurdu:

var
günler: TDays; b: boole; başlagün: = [Pazartesi, Salı] b: = gün. Kesişim ([Pazartesi, Perşembe]).
tip
TDaysHelper = için kayıt yardımcısı TDays. fonksiyon Kesişim (const günler: TDays): TDays; fonksiyon Boş: boolean; son;... fonksiyon TDaysHelper. Kesişim (const günler: TDays): TDays; başla
sonuç: = öz * gün; son; fonksiyon TDaysHelper. Boş: boolean; başla
sonuç: = öz = []; son; 

Bir numaralandırma etrafında inşa edilen her set türü için, maalesef numaralandırmalar ve setler devam etmediği için ayrı bir yardımcıya ihtiyacınız olacaktır. jenerik ve jenerik tipler.

Bu, aşağıdakilerin derlenemeyeceği anlamına gelir:

// ALIKE DERLEME YOK!
TGenericSet = dizi ; 
TEnum Basit jenerikler Enum örneği

Bayt Seti İçin Kayıt Yardımcısı!

tip
TByteSet = kümesi Bayt; TByteSetHelper = için kayıt yardımcısı TByteSet. 

TByteSetHelper tanımında aşağıdakilere sahip olabiliriz:

halka açıkprosedür Açık; prosedür Dahil etmek(const değer: Bayt); aşırı yükleme; Çizgide; prosedür Dahil etmek(const değerler: TByteSet); aşırı yükleme; Çizgide; prosedür Dışlama (const değer: Bayt); aşırı yükleme; Çizgide; prosedür Dışlama (const değerler: TByteSet); aşırı yükleme; Çizgide; fonksiyon Kesişim (const değerler: TByteSet): TByteSet; Çizgide; fonksiyon Boş: boolean; Çizgide; fonksiyon İçerir(const değer: Bayt): boolean; aşırı yükleme; Çizgide;fonksiyon İçerir(const değerler: TByteSet): boolean; aşırı yükleme; Çizgide;fonksiyon IsSuperSet (const değerler: TByteSet): boolean; Çizgide; fonksiyon IsSubSet (const değerler: TByteSet): boolean; Çizgide; fonksiyon Eşittir (const değerler: TByteSet): boolean; Çizgide; fonksiyon ToString: sicim; Çizgide; son; 
{TByteSetHelper}prosedür TByteSetHelper. Include (const değeri: Byte); başla
Sistemi. Dahil et (benlik, değer); son; prosedür TByteSetHelper. Hariç tut (sabit değer: Bayt); başla
Sistemi. Hariç tut (benlik, değer); son; prosedür TByteSetHelper. Açık; başla
self: = []; son; fonksiyon TByteSetHelper. Eşittir (sabit değerler: TByteSet): boolean; başla
sonuç: = öz = değerler; son; prosedür TByteSetHelper. Hariç tut (const değerleri: TByteSet); başla
benlik: = benlik değerleri; son; prosedür TByteSetHelper. Include (const değerleri: TByteSet); başla
self: = self + değerler; son; fonksiyon TByteSetHelper. İçerir (sabit değerler: TByteSet): boolean; başla
sonuç: = IsSuperSet (değerler); son; fonksiyon TByteSetHelper. Kesişim (sabit değerler: TByteSet): TByteSet; başla
sonuç: = öz * değerler; son; fonksiyon TByteSetHelper. İçerir (const değeri: Byte): boolean; başla
sonuç: = benlik değeri; son; fonksiyon TByteSetHelper. Boş: boolean; başla
sonuç: = öz = []; son; fonksiyon TByteSetHelper. IsSubSet (sabit değerler: TByteSet): boolean; başla
sonuç: = öz <= değerler; son; fonksiyon TByteSetHelper. IsSuperSet (sabit değerler: TByteSet): boolean; başla
sonuç: = öz> = değerler; son; fonksiyon TByteSetHelper. ToString: string; var
b: Bayt; başlaiçin b içinde öz yapmak
sonuç: = sonuç + IntToStr (b) + ','; sonuç: = Kopyala (sonuç, 1, -2 + Uzunluk (sonuç)); son; 
var
daysAsByteSet: TByteSet; başla
daysAsByteSet. Açık; daysAsByteSet. Dahil et (Pazartesi. AsByte); daysAsByteSet. Dahil et (Tamsayı (Cumartesi); daysAsByteSet. Dahil et (Bayt (TDay. Salı)); daysAsByteSet. Dahil et (Tamsayı (TDay. Çarşamba)); daysAsByteSet. Dahil et (Tamsayı (TDay. Çarşamba)); // 2. kez - anlamsız. daysAsByteSet. Hariç tut (TDay. Salı. AsByte); ShowMessage (daysAsByteSet.) ) ToString; ShowMessage (BoolToStr (daysAsByteSet.) IsSuperSet ([pazartesi. AsByte, Cumartesi. AsByte]), true)); son; 

Bir ama var :(

TByteSet'in bayt değerlerini kabul ettiğini ve böyle bir değerin burada kabul edileceğini unutmayın. Yukarıda uygulandığı şekliyle TByteSetHelper sayma türü katı değildir (yani TDay olmayan bir değerle besleyebilirsiniz)... ama farkında olduğum sürece.. benim için çalışıyor.

instagram story viewer