Grundlegendes zu Delphi Class (und Record) -Helfern führt eine Funktion der Delphi-Sprache ein, mit der Sie die Definition einer Klasse oder eines Datensatztyps erweitern können, indem Sie vorhandenen Klassen und Datensätzen ohne Funktionen und Prozeduren (Methoden) hinzufügen Erbe.
In der XE3 Delphi-Version wurden Datensatz-Helfer leistungsfähiger, indem einfache Delphi-Typen wie Zeichenfolgen, Ganzzahlen, Aufzählungen, Mengen und ähnliches erweitert werden konnten.
Das System. Die SysUtils-Einheit von Delphi XE3 implementiert einen Datensatz mit dem Namen "TStringHelper", der eigentlich ein Datensatz-Helfer für Zeichenfolgen ist.
Mit Delphi XE3 können Sie den nächsten Code kompilieren und verwenden:
var
s: string; Start
s: = 'Delphi XE3'; s. Ersetzen ('XE3', 'Regeln', []). ToUpper; Ende;
Damit dies möglich ist, wurde in Delphi ein neues Konstrukt "record helper for [simple type]" erstellt. Für Zeichenfolgen ist dies "Typ TStringHelper = Aufzeichnungshelfer für Zeichenfolge". Der Name lautet "Record Helper", aber es geht nicht um Erweiterung
Aufzeichnungen - eher über das Erweitern einfacher Typen wie Zeichenfolgen, Ganzzahlen und dergleichen.In System und System. SysUtils gibt es andere vordefinierte Datensatzhilfen für einfache Typen, darunter: TSingleHelper, TDoubleHelper, TExtendedHelper, TGuidHelper (und einige andere). Sie können dem Namen entnehmen, welchen einfachen Typ der Helfer erweitert.
Es gibt auch einige praktische Open Source-Helfer wie TDateTimeHelper.
Aufzählungen? Helfer für Aufzählungen?
Aufzählungen und Sätze, die als einfache Typen behandelt werden, können jetzt (in XE3 und darüber hinaus) auch um Funktionen erweitert werden, die ein Datensatztyp haben kann: Funktionen, Prozeduren und dergleichen.
Hier ist eine einfache Aufzählung ("TDay") und ein Aufzeichnungshelfer:
Art
TDay = (Montag = 0, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag, Sonntag); TDayHelper = Rekordhelfer für TDay. Funktion AsByte: Byte; Funktion ToString: Zeichenfolge; Ende;
Funktion TDayHelper. AsByte: Byte; Start
Ergebnis: = Byte (Selbst); Ende; Funktion TDayHelper. ToString: Zeichenfolge; StartFall selbst von
Montag: Ergebnis: = 'Montag'; Dienstag: Ergebnis: = 'Dienstag'; Mittwoch: Ergebnis: = 'Mittwoch'; Donnerstag: Ergebnis: = 'Donnerstag'; Freitag: Ergebnis: = 'Freitag'; Samstag: Ergebnis: = 'Samstag'; Sonntag: Ergebnis: = 'Sonntag'; Ende; Ende;
var
aTag: TDay; s: string; Start
aDay: = TDay. Montag; s: = aDay. ToString. Zu senken; Ende;
Sets? Helfer für Sets?
TDays = Satz von TDay;
var
Tage: TDays; s: string; Start
Tage: = [Montag.. Mittwoch]; Tage: = Tage + [Sonntag]; Ende;
ABER, wie großartig wäre es, in der Lage zu sein:
var
Tage: TDays; b: Boolescher Wert; StartTage: = [Montag, Dienstag] b: = Tage. Schnittpunkt ([Montag, Donnerstag]). IsEmpty;
Art
TDaysHelper = Rekordhelfer für TDays. Funktion Sich schneiden(const Tage: Tage): Tage; Funktion IsEmpty: boolean; Ende;... Funktion TDaysHelper. Sich schneiden(const Tage: Tage): Tage; Start
Ergebnis: = Selbst * Tage; Ende; Funktion TDaysHelper. IsEmpty: boolean; Start
Ergebnis: = self = []; Ende;
Für jeden Satztyp, der um eine Aufzählung herum aufgebaut ist, benötigen Sie einen separaten Helfer, da Aufzählungen und Sätze leider nicht zusammenpassen Generika und generische Typen.
Dies bedeutet, dass Folgendes nicht kompiliert werden kann:
// KEINE KOMPILE VON ALIKE!
TGenericSet = Satz von ;
Rekordhelfer für Bytesatz!
Art
TByteSet = Satz von Byte; TByteSetHelper = Rekordhelfer für TByteSet.
In der Definition des TByteSetHelper können wir Folgendes haben:
ÖffentlichkeitVerfahren Klar; Verfahren Umfassen(const Wert: Byte); Überlast; in der Reihe; Verfahren Umfassen(const Werte: TByteSet); Überlast; in der Reihe; Verfahren Ausschließen(const Wert: Byte); Überlast; in der Reihe; Verfahren Ausschließen(const Werte: TByteSet); Überlast; in der Reihe; Funktion Sich schneiden(const Werte: TByteSet): TByteSet; in der Reihe; Funktion IsEmpty: boolean; in der Reihe; Funktion Beinhaltet (const Wert: Byte): Boolescher Wert; Überlast; in der Reihe;Funktion Beinhaltet (const Werte: TByteSet): boolean; Überlast; in der Reihe;Funktion IsSuperSet (const Werte: TByteSet): boolean; in der Reihe; Funktion IsSubSet (const Werte: TByteSet): boolean; in der Reihe; Funktion Gleich (const Werte: TByteSet): boolean; in der Reihe; Funktion ToString: Zeichenfolge; in der Reihe; Ende;
{TByteSetHelper}Verfahren TByteSetHelper. Include (konstanter Wert: Byte); Start
System. Include (Selbst, Wert); Ende; Verfahren TByteSetHelper. Ausschließen (const Wert: Byte); Start
System. Ausschließen (Selbst, Wert); Ende; Verfahren TByteSetHelper. Klar; Start
Selbst: = []; Ende; Funktion TByteSetHelper. Gleich (konstante Werte: TByteSet): boolean; Start
Ergebnis: = Selbst = Werte; Ende; Verfahren TByteSetHelper. Ausschließen (const-Werte: TByteSet); Start
Selbst: = Selbstwerte; Ende; Verfahren TByteSetHelper. Include (const-Werte: TByteSet); Start
Selbst: = Selbst + Werte; Ende; Funktion TByteSetHelper. Includes (const-Werte: TByteSet): boolean; Start
Ergebnis: = IsSuperSet (Werte); Ende; Funktion TByteSetHelper. Schnittpunkt (konstante Werte: TByteSet): TByteSet; Start
Ergebnis: = Selbst * Werte; Ende; Funktion TByteSetHelper. Includes (const value: Byte): boolean; Start
Ergebnis: = Wert in sich selbst; Ende; Funktion TByteSetHelper. IsEmpty: boolean; Start
Ergebnis: = self = []; Ende; Funktion TByteSetHelper. IsSubSet (konstante Werte: TByteSet): boolean; Start
Ergebnis: = Selbst <= Werte; Ende; Funktion TByteSetHelper. IsSuperSet (konstante Werte: TByteSet): boolean; Start
Ergebnis: = Selbst> = Werte; Ende; Funktion TByteSetHelper. ToString: string; var
b: Byte; Startzum b im selbst tun
Ergebnis: = Ergebnis + IntToStr (b) + ','; Ergebnis: = Kopieren (Ergebnis, 1, -2 + Länge (Ergebnis)); Ende;
var
daysAsByteSet: TByteSet; Start
daysAsByteSet. Klar; daysAsByteSet. Include (Montag. AsByte); daysAsByteSet. Include (Integer (Samstag); daysAsByteSet. Include (Byte (TDay). Dienstag)); daysAsByteSet. Include (Integer (TDay). Mittwoch)); daysAsByteSet. Include (Integer (TDay). Mittwoch)); // 2. Mal - kein Sinn. daysAsByteSet. Ausschließen (TDay. Dienstag. AsByte); ShowMessage (daysAsByteSet. ToString); ShowMessage (BoolToStr (daysAsByteSet. IsSuperSet ([Montag. AsByte, Samstag. AsByte]), true)); Ende;
Es gibt ein aber :(
Beachten Sie, dass TByteSet Bytewerte akzeptiert - und jeder solche Wert wird hier akzeptiert. Der oben implementierte TByteSetHelper ist kein strenger Aufzählungstyp (d. H. Sie können ihn mit einem Nicht-TDay-Wert füttern)... aber solange ich weiß.. es funktioniert bei mir.