Delphi Record Helpers para conjuntos y otros tipos simples

Comprensión de los ayudantes de clase (y registro) de Delphi presenta una característica del lenguaje Delphi que le permite ampliar la definición de una clase o un tipo de registro agregando funciones y procedimientos (métodos) a las clases y registros existentes sin herencia.

En la versión XE3 Delphi, los ayudantes de grabación se volvieron más poderosos al permitir extender tipos Delphi simples como cadenas, enteros, enumeraciones, conjuntos y similares.

El sistema. La unidad SysUtils, de Delphi XE3, implementa un registro llamado "TStringHelper" que en realidad es un ayudante de registro para cadenas.

Usando Delphi XE3 puedes compilar y usar el siguiente código:

var
s: cadena; empezar
s: = 'Delphi XE3'; s. Reemplazar ('XE3', 'reglas', []). ToUpper; final; 

Para que esto sea posible, se realizó una nueva construcción en Delphi "record helper for [simple type]". Para cadenas, este es "tipo TStringHelper = ayudante de registro para cadena". El nombre dice "ayudante de grabación" pero no se trata de extender

instagram viewer
registros - más bien acerca de extender tipos simples como cadenas, enteros y similares.

En Sistema y Sistema. SysUtils hay otros ayudantes de registro predefinidos para tipos simples, que incluyen: TSingleHelper, TDoubleHelper, TExtendedHelper, TGuidHelper (y algunos otros). Puede obtener del nombre qué tipo simple extiende el ayudante.

También hay algunos útiles ayudantes de código abierto, como TDateTimeHelper.

Enumeraciones? Ayudante para enumeraciones?

enumeraciones
conjuntos

Las enumeraciones y los conjuntos que se tratan como tipos simples ahora también se pueden ampliar (en XE3 y más allá) con la funcionalidad que puede tener un tipo de registro: funciones, procedimientos y similares.

Aquí hay una enumeración simple ("TDay") y un asistente de registro:

tipo
TDay = (lunes = 0, martes, miércoles, jueves, viernes, sábado, domingo); TDayHelper = ayudante de grabación para TDay. función AsByte: byte; función Encadenar: cuerda; final; 
función TDayHelper. AsByte: byte; empezar
resultado: = Byte (auto); final; función TDayHelper. Encadenar: cuerda; empezarcaso yo de
Lunes: resultado: = 'lunes'; Martes: resultado: = 'martes'; Miércoles: resultado: = 'Miércoles'; Jueves: resultado: = 'jueves'; Viernes: resultado: = 'Viernes'; Sábado: resultado: = 'Sábado'; Domingo: resultado: = 'Domingo'; final; final; 
var
aDay: TDay; s: cadena; empezar
aDay: = TDay. Lunes; s: = un día. Encadenar. Reducir; final; 
convertir una enumeración de Delphi en una representación de cadena

Conjuntos? Ayudante para conjuntos?

TDays = conjunto de TDay; 
var
días: TDays; s: cadena; empezar
días: = [lunes.. Miércoles]; días: = días + [domingo]; final; 

PERO, qué GENIAL sería poder hacer:

var
días: TDays; b: booleano; empezardías: = [lunes, martes] b: = días. Intersect ([lunes, jueves]). IsEmpty;
tipo
TDaysHelper = ayudante de grabación para TDays. función Intersecarse(const días: TDays): TDays; función IsEmpty: boolean; final;... función TDaysHelper. Intersecarse(const días: TDays): TDays; empezar
resultado: = auto * días; final; función TDaysHelper. IsEmpty: boolean; empezar
resultado: = self = []; final; 

Para cada tipo de conjunto construido alrededor de una enumeración, necesitaría tener un ayudante separado ya que, desafortunadamente, las enumeraciones y los conjuntos no coinciden. genéricos y tipos genéricos.

Esto significa que no se puede compilar lo siguiente:

// ¡NO COMPILAR POR IGUAL!
TGenericSet = conjunto de ; 
TEnum Genéricos simples Ejemplo de Enum

Ayudante de registro para el conjunto de bytes!

tipo
TByteSet = conjunto de Byte; TByteSetHelper = ayudante de grabación para TByteSet. 

Podemos tener lo siguiente en la definición de TByteSetHelper:

públicoprocedimiento Claro; procedimiento Incluir(const valor: Byte); sobrecargar; en línea; procedimiento Incluir(const valores: TByteSet); sobrecargar; en línea; procedimiento Excluir(const valor: Byte); sobrecargar; en línea; procedimiento Excluir(const valores: TByteSet); sobrecargar; en línea; función Intersecarse(const valores: TByteSet): TByteSet; en línea; función IsEmpty: boolean; en línea; función Incluye (const valor: Byte): booleano; sobrecargar; en línea;función Incluye (const valores: TByteSet): boolean; sobrecargar; en línea;función IsSuperSet (const valores: TByteSet): boolean; en línea; función IsSubSet (const valores: TByteSet): boolean; en línea; función Igual (const valores: TByteSet): boolean; en línea; función Encadenar: cuerda; en línea; final; 
{TByteSetHelper}procedimiento TByteSetHelper. Incluir (valor constante: Byte); empezar
Sistema. Incluir (auto, valor); final; procedimiento TByteSetHelper. Excluir (valor constante: Byte); empezar
Sistema. Excluir (auto, valor); final; procedimiento TByteSetHelper. Claro; empezar
self: = []; final; función TByteSetHelper. Igual (valores constantes: TByteSet): boolean; empezar
resultado: = auto = valores; final; procedimiento TByteSetHelper. Excluir (valores constantes: TByteSet); empezar
self: = autovalores; final; procedimiento TByteSetHelper. Incluir (valores constantes: TByteSet); empezar
self: = self + valores; final; función TByteSetHelper. Incluye (valores constantes: TByteSet): boolean; empezar
resultado: = IsSuperSet (valores); final; función TByteSetHelper. Intersecar (valores constantes: TByteSet): TByteSet; empezar
resultado: = auto * valores; final; función TByteSetHelper. Incluye (valor constante: Byte): booleano; empezar
resultado: = valor en sí mismo; final; función TByteSetHelper. IsEmpty: boolean; empezar
resultado: = self = []; final; función TByteSetHelper. IsSubSet (valores constantes: TByteSet): boolean; empezar
resultado: = auto <= valores; final; función TByteSetHelper. IsSuperSet (valores constantes: TByteSet): boolean; empezar
resultado: = auto> = valores; final; función TByteSetHelper. ToString: cadena; var
b: byte; empezarpara si en yo hacer
resultado: = resultado + IntToStr (b) + ','; resultado: = Copiar (resultado, 1, -2 + Longitud (resultado)); final; 
var
daysAsByteSet: TByteSet; empezar
daysAsByteSet. Claro; daysAsByteSet. Incluir (lunes. AsByte); daysAsByteSet. Incluir (entero (sábado); daysAsByteSet. Incluir (Byte (TDay. Martes)); daysAsByteSet. Incluir (entero (TDay. Miércoles)); daysAsByteSet. Incluir (entero (TDay. Miércoles)); // 2da vez - no tiene sentido. daysAsByteSet. Excluir (TDay. Martes. AsByte); ShowMessage (daysAsByteSet. Encadenar); ShowMessage (BoolToStr (daysAsByteSet. IsSuperSet ([lunes. As Byte, sábado. AsByte]), verdadero)); final; 

Hay un pero :(

Tenga en cuenta que TByteSet acepta valores de bytes, y cualquier valor de este tipo sería aceptado aquí. El TByteSetHelper como se implementó anteriormente no es un tipo de enumeración estricto (es decir, puede alimentarlo con un valor no TDay)... pero mientras yo sepa... funciona para mi

instagram story viewer