Понимание помощников класса Delphi (и записи) представляет функцию языка Delphi, позволяющую расширить определение класса или типа записи путем добавления функций и процедур (методов) к существующим классам и записям без наследование.
В версии XE3 Delphi помощники записей стали более мощными, позволяя расширять простые типы Delphi, такие как строки, целые числа, перечисления, наборы и т.п.
Система. Модуль SysUtils из Delphi XE3 реализует запись с именем «TStringHelper», которая фактически является помощником записи для строк.
Используя Delphi XE3, вы можете скомпилировать и использовать следующий код:
вар
s: строка; начать
s: = 'Delphi XE3'; s. Заменить ('XE3', 'rules', []). ToUpper; конец;
Чтобы это стало возможным, в Delphi была создана новая конструкция «помощник по записи для [простой тип]». Для строк это «тип TStringHelper = запись помощника для строки». Название гласит «помощник записи», но это не о расширении учет - скорее о расширении простых типов, таких как строки, целые числа и тому подобное.
В системе и системе. В SysUtils есть другие предопределенные помощники записей для простых типов, в том числе: TSingleHelper, TDoubleHelper, TExtendedHelper, TGuidHelper (и некоторые другие). По названию можно узнать, какой простой тип расширяет помощник.
Есть также несколько удобных помощников с открытым исходным кодом, таких как TDateTimeHelper.
Перечисления? Помощник для перечислений?
Перечисления и наборы, обрабатываемые как простые типы, теперь также могут (в XE3 и более поздних версиях) расширяться за счет функциональности, которую может иметь тип записи: функции, процедуры и тому подобное.
Вот простое перечисление («TDay») и помощник по записи:
тип
TDay = (понедельник = 0, вторник, среда, четверг, пятница, суббота, воскресенье); TDayHelper = запись помощник для TDay. функция AsByte: байт; функция Нанизывать: строка; конец;
функция TDayHelper. AsByte: байт; начать
результат: = байт (самостоятельно); конец; функция TDayHelper. Нанизывать: строка; начатькейс сам из
Понедельник: результат: = 'понедельник'; Вторник: результат: = 'вторник'; Среда: результат: = «среда»; Четверг: результат: = 'четверг'; Пятница: результат: = 'пятница'; Суббота: результат: = 'суббота'; Воскресенье: результат: = 'воскресенье'; конец; конец;
вар
aDay: TDay; s: строка; начать
aDay: = TDay. Понедельник; s: = день. Нанизывать. Снизить; конец;
Наборы? Помощник для наборов?
TDays = набор из TDay;
вар
дни: TDays; s: строка; начать
дни: = [понедельник.. Среда]; дни: = дни + [воскресенье]; конец;
НО, как ВЕЛИКОЛЕПНО быть в состоянии сделать:
вар
дни: TDays; б: логическое значение; начатьдни: = [понедельник, вторник] б: = дней. Пересечь ([понедельник, четверг]). IsEmpty;
тип
TDaysHelper = запись помощник для TDays. функция Intersect (Const дни: TDays): TDays; функция IsEmpty: логическое значение; конец;... функция TDaysHelper. Intersect (Const дни: TDays): TDays; начать
результат: = self * days; конец; функция TDaysHelper. IsEmpty: логическое значение; начать
результат: = self = []; конец;
Для каждого типа набора, построенного вокруг перечисления, вам понадобится отдельный помощник, поскольку, к сожалению, перечисления и множества не согласуются дженерики и родовые типы.
Это означает, что следующее не может быть скомпилировано:
// НИКАКОГО ПОЛНОМОЧЕНИЯ
TGenericSet = набор ;
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)... но пока я в курсе.. это работает для меня.