Delphi Record Helpers для множеств и других простых типов

Понимание помощников класса Delphi (и записи) представляет функцию языка Delphi, позволяющую расширить определение класса или типа записи путем добавления функций и процедур (методов) к существующим классам и записям без наследование.

В версии XE3 Delphi помощники записей стали более мощными, позволяя расширять простые типы Delphi, такие как строки, целые числа, перечисления, наборы и т.п.

Система. Модуль SysUtils из Delphi XE3 реализует запись с именем «TStringHelper», которая фактически является помощником записи для строк.

Используя Delphi XE3, вы можете скомпилировать и использовать следующий код:

вар
s: строка; начать
s: = 'Delphi XE3'; s. Заменить ('XE3', 'rules', []). ToUpper; конец; 

Чтобы это стало возможным, в Delphi была создана новая конструкция «помощник по записи для [простой тип]». Для строк это «тип TStringHelper = запись помощника для строки». Название гласит «помощник записи», но это не о расширении учет - скорее о расширении простых типов, таких как строки, целые числа и тому подобное.

instagram viewer

В системе и системе. В SysUtils есть другие предопределенные помощники записей для простых типов, в том числе: TSingleHelper, TDoubleHelper, TExtendedHelper, TGuidHelper (и некоторые другие). По названию можно узнать, какой простой тип расширяет помощник.

Есть также несколько удобных помощников с открытым исходным кодом, таких как TDateTimeHelper.

Перечисления? Помощник для перечислений?

перечисления
наборы

Перечисления и наборы, обрабатываемые как простые типы, теперь также могут (в XE3 и более поздних версиях) расширяться за счет функциональности, которую может иметь тип записи: функции, процедуры и тому подобное.

Вот простое перечисление («TDay») и помощник по записи:

тип
TDay = (понедельник = 0, вторник, среда, четверг, пятница, суббота, воскресенье); TDayHelper = запись помощник для TDay. функция AsByte: байт; функция Нанизывать: строка; конец; 
функция TDayHelper. AsByte: байт; начать
результат: = байт (самостоятельно); конец; функция TDayHelper. Нанизывать: строка; начатькейс сам из
Понедельник: результат: = 'понедельник'; Вторник: результат: = 'вторник'; Среда: результат: = «среда»; Четверг: результат: = 'четверг'; Пятница: результат: = 'пятница'; Суббота: результат: = 'суббота'; Воскресенье: результат: = 'воскресенье'; конец; конец; 
вар
aDay: TDay; s: строка; начать
aDay: = TDay. Понедельник; s: = день. Нанизывать. Снизить; конец; 
преобразовать перечисление Delphi в строковое представление

Наборы? Помощник для наборов?

TDays = набор из TDay; 
вар
дни: TDays; s: строка; начать
дни: = [понедельник.. Среда]; дни: = дни + [воскресенье]; конец; 

НО, как ВЕЛИКОЛЕПНО быть в состоянии сделать:

вар
дни: TDays; б: логическое значение; начатьдни: = [понедельник, вторник] б: = дней. Пересечь ([понедельник, четверг]). IsEmpty;
тип
TDaysHelper = запись помощник для TDays. функция Intersect (Const дни: TDays): TDays; функция IsEmpty: логическое значение; конец;... функция TDaysHelper. Intersect (Const дни: TDays): TDays; начать
результат: = self * days; конец; функция TDaysHelper. IsEmpty: логическое значение; начать
результат: = self = []; конец; 

Для каждого типа набора, построенного вокруг перечисления, вам понадобится отдельный помощник, поскольку, к сожалению, перечисления и множества не согласуются дженерики и родовые типы.

Это означает, что следующее не может быть скомпилировано:

// НИКАКОГО ПОЛНОМОЧЕНИЯ
TGenericSet = набор ; 
TEnum Простой пример Enum

Record Helper для набора байтов!

тип
TByteSet = набор из Байт; TByteSetHelper = запись помощник для TByteSet. 

У нас может быть следующее в определении TByteSetHelper:

общественностипроцедура Ясно; процедура Включают(Const значение: байт); перегрузка; в соответствии; процедура Включают(Const значения: TByteSet); перегрузка; в соответствии; процедура Исключить (Const значение: байт); перегрузка; в соответствии; процедура Исключить (Const значения: TByteSet); перегрузка; в соответствии; функция Intersect (Const значения: TByteSet): TByteSet; в соответствии; функция IsEmpty: логическое значение; в соответствии; функция Включает(Const значение: байт): логическое; перегрузки; в соответствии;функция Включает(Const значения: TByteSet): логическое значение; перегрузки; в соответствии;функция IsSuperSet (Const значения: TByteSet): логическое значение; в соответствии; функция IsSubSet (Const значения: TByteSet): логическое значение; в соответствии; функция Равно (Const значения: TByteSet): логическое значение; в соответствии; функция Нанизывать: строка; в соответствии; конец; 
{TByteSetHelper}процедура TByteSetHelper. Включить (постоянное значение: байт); начать
Система. Включить (самооценка, ценность); конец; процедура TByteSetHelper. Исключить (постоянное значение: байт); начать
Система. Исключить (самооценка, ценность); конец; процедура TByteSetHelper. Ясно; начать
self: = []; конец; функция TByteSetHelper. Равно (постоянные значения: TByteSet): логическое значение; начать
результат: = self = values; конец; процедура TByteSetHelper. Исключить (постоянные значения: TByteSet); начать
self: = self - ценности; конец; процедура TByteSetHelper. Включить (постоянные значения: TByteSet); начать
self: = self + values; конец; функция TByteSetHelper. Включает (постоянные значения: TByteSet): логическое значение; начать
результат: = IsSuperSet (значения); конец; функция TByteSetHelper. Пересечение (постоянные значения: TByteSet): TByteSet; начать
результат: = собственные значения *; конец; функция TByteSetHelper. Включает (постоянное значение: байт): логическое значение; начать
результат: = ценность в себе; конец; функция TByteSetHelper. IsEmpty: логическое значение; начать
результат: = self = []; конец; функция TByteSetHelper. IsSubSet (постоянные значения: TByteSet): логическое значение; начать
результат: = self <= values; конец; функция TByteSetHelper. IsSuperSet (постоянные значения: TByteSet): логическое значение; начать
результат: = self> = values; конец; функция TByteSetHelper. ToString: строка; вар
б: байт; начатьза б в сам делать
результат: = результат + IntToStr (b) + ','; результат: = Копировать (результат, 1, -2 + Длина (результат)); конец; 
вар
daysAsByteSet: TByteSet; начать
daysAsByteSet. Ясно; daysAsByteSet. Включить (понедельник. AsByte); daysAsByteSet. Включить (целое число (суббота); daysAsByteSet. Включить (Байт (сегодня. Вторник)); daysAsByteSet. Включить (целое число (TDay. Среда)); daysAsByteSet. Включить (целое число (TDay. Среда)); // Второй раз - нет смысла. daysAsByteSet. Исключить Вторник. AsByte); ShowMessage (daysAsByteSet. Нанизывать); ShowMessage (BoolToStr (daysAsByteSet. IsSuperSet ([понедельник. AsByte, суббота. AsByte]), правда)); конец; 

Есть но :(

Обратите внимание, что TByteSet принимает байтовые значения - и любое такое значение будет принято здесь. TByteSetHelper, как реализовано выше, не является строгим типом перечисления (т. Е. Вы можете передать его значением, отличным от TDay)... но пока я в курсе.. это работает для меня.

instagram story viewer