Auxiliares de registro Delphi para conjuntos e outros tipos simples

Entendendo os Auxiliares da Classe Delphi (e Registro) introduz um recurso da linguagem Delphi, permitindo que você estenda a definição de uma classe ou tipo de registro adicionando funções e procedimentos (métodos) a classes e registros existentes sem herança.

Na versão XE3 Delphi, os auxiliares de registro se tornaram mais poderosos ao permitir estender tipos simples de Delphi como strings, números inteiros, enumerações, conjuntos e similares.

O sistema. A unidade SysUtils, do Delphi XE3, implementa um registro chamado "TStringHelper", que na verdade é um auxiliar de registro para strings.

Usando o Delphi XE3, você pode compilar e usar o próximo código:

var
s: string; início
s: = 'Delphi XE3'; s. Substituir ('XE3', 'rules', []). ToUpper; fim; 

Para que isso seja possível, uma nova construção foi feita no Delphi "auxiliar de registro para [tipo simples]". Para cadeias, este é "tipo TStringHelper = auxiliar de registro para cadeia". O nome indica "auxiliar de registro", mas não se trata de estender

instagram viewer
registros - bastante sobre estender tipos simples, como strings, números inteiros e similares.

Em Sistema e Sistema. No SysUtils, existem outros auxiliares de registro predefinidos para tipos simples, incluindo: TSingleHelper, TDoubleHelper, TExtendedHelper, TGuidHelper (e alguns outros). Você pode obter do nome que tipo simples o auxiliar estende.

Existem também alguns auxiliares de código aberto, como TDateTimeHelper.

Enumerações? Auxiliar para enumerações?

enumerações
conjuntos

Enumerações e conjuntos sendo tratados como tipos simples também podem agora (no XE3 e além) ser estendidos com a funcionalidade de um tipo de registro: funções, procedimentos e similares.

Aqui está uma enumeração simples ("TDay") e um auxiliar de registro:

tipo
TDay = (Segunda = 0, Terça, Quarta, Quinta, Sexta, Sábado, Domingo); TDayHelper = auxiliar de registro para TDay. função AsByte: byte; função Para sequenciar: corda; fim; 
função TDayHelper. AsByte: byte; início
resultado: = Byte (próprio); fim; função TDayHelper. Para sequenciar: corda; iníciocaso auto do
Segunda: resultado: = 'Segunda'; Terça: resultado: = 'Terça'; Quarta-feira: resultado: = 'quarta-feira'; Quinta: resultado: = 'Quinta'; Sexta: resultado: = 'Sexta'; Sábado: resultado: = 'Sábado'; Domingo: resultado: = 'Domingo'; fim; fim; 
var
aDay: TDay; s: string; início
aDay: = TDay. Segunda-feira; s: = dia. Para sequenciar. Abaixar; fim; 
converter um Delphi Enum em uma representação de string

Sets? Auxiliar para conjuntos?

TDays = conjunto de TDay; 
var
dias: dias; s: string; início
dias: = [segunda-feira.. Quarta-feira]; dias: = dias + [domingo]; fim; 

MAS, quão GRANDE seria ser capaz de fazer:

var
dias: dias; b: booleano; iníciodias: = [segunda-feira, terça-feira] b: = dias. Interseção ([segunda-feira, quinta-feira]). IsEmpty;
tipo
TDaysHelper = auxiliar de registro para TDays. função Interseção (const dias: TDays): TDays; função IsEmpty: booleano; fim;... função TDaysHelper. Interseção (const dias: TDays): TDays; início
resultado: = auto * dias; fim; função TDaysHelper. IsEmpty: booleano; início
resultado: = próprio = []; fim; 

Para cada tipo de conjunto construído em torno de uma enumeração, você precisaria de um ajudante separado, pois, infelizmente, as enumerações e os conjuntos não seguem tipos genéricos e genéricos.

Isso significa que o seguinte não pode ser compilado:

// NENHUMA COMPILAÇÃO ALIADA!
TGenericSet = conjunto de ; 
TEnum Generics simples Exemplo de enum

Auxiliar de registro para conjunto de bytes!

tipo
TByteSet = conjunto de Byte; TByteSetHelper = auxiliar de registro para TByteSet. 

Podemos ter o seguinte na definição do TByteSetHelper:

públicoprocedimento Claro; procedimento Incluir(const valor: Byte); sobrecarga; na linha; procedimento Incluir(const valores: TByteSet); sobrecarga; na linha; procedimento Excluir(const valor: Byte); sobrecarga; na linha; procedimento Excluir(const valores: TByteSet); sobrecarga; na linha; função Interseção (const valores: TByteSet): TByteSet; na linha; função IsEmpty: booleano; na linha; função Inclui (const valor: Byte): booleano; sobrecarga; na linha;função Inclui (const valores: TByteSet): booleano; sobrecarga; na linha;função IsSuperSet (const valores: TByteSet): booleano; na linha; função IsSubSet (const valores: TByteSet): booleano; na linha; função É igual a(const valores: TByteSet): booleano; na linha; função Para sequenciar: corda; na linha; fim; 
{TByteSetHelper}procedimento TByteSetHelper. Incluir (valor const: Byte); início
Sistema. Incluir (auto, valor); fim; procedimento TByteSetHelper. Excluir (valor const: Byte); início
Sistema. Excluir (auto, valor); fim; procedimento TByteSetHelper. Claro; início
self: = []; fim; função TByteSetHelper. Igual (valores const: TByteSet): booleano; início
resultado: = próprio = valores; fim; procedimento TByteSetHelper. Excluir (valores constantes: TByteSet); início
self: = valores próprios; fim; procedimento TByteSetHelper. Incluir (valores constantes: TByteSet); início
self: = self + valores; fim; função TByteSetHelper. Inclui (valores const: TByteSet): booleano; início
resultado: = IsSuperSet (valores); fim; função TByteSetHelper. Interseção (valores constantes: TByteSet): TByteSet; início
resultado: = valores * próprios; fim; função TByteSetHelper. Inclui (valor const: Byte): booleano; início
resultado: = valor em si; fim; função TByteSetHelper. IsEmpty: booleano; início
resultado: = próprio = []; fim; função TByteSetHelper. IsSubSet (valores const: TByteSet): booleano; início
resultado: = auto <= valores; fim; função TByteSetHelper. IsSuperSet (valores const: TByteSet): booleano; início
resultado: = próprio> = valores; fim; função TByteSetHelper. ToString: string; var
b: byte; iníciopara b dentro auto Faz
resultado: = resultado + IntToStr (b) + ','; resultado: = Copiar (resultado, 1, -2 + Comprimento (resultado)); fim; 
var
daysAsByteSet: TByteSet; início
daysAsByteSet. Claro; daysAsByteSet. Incluir (segunda-feira. AsByte); daysAsByteSet. Incluir (Inteiro (sábado); daysAsByteSet. Incluir (Byte (TDay. Terça)); daysAsByteSet. Include (Inteiro (TDay. Quarta-feira)); daysAsByteSet. Include (Inteiro (TDay. Quarta-feira)); // 2ª vez - não faz sentido. daysAsByteSet. Excluir (TDay. Terça. AsByte); ShowMessage (daysAsByteSet. Para sequenciar); ShowMessage (BoolToStr (daysAsByteSet. IsSuperSet ([segunda-feira. AsByte, sábado. AsByte]), verdadeiro)); fim; 

Há um mas :(

Observe que TByteSet aceita valores de bytes - e qualquer valor desse tipo seria aceito aqui. O TByteSetHelper, conforme implementado acima, não é do tipo de enumeração strict (ou seja, você pode alimentá-lo com um valor não TDay)... mas enquanto eu estiver ciente.. isso funciona para mim.

instagram story viewer