Преобразование строковых полей записи в нижний регистр с помощью RTTI в Delphi
В работе с записями (records) в Delphi иногда возникает необходимость автоматически обработать все строковые поля, например, преобразовать их содержимое в нижний регистр. В этой статье я покажу, как реализовать такую функциональность с использованием системы Run-Time Type Information (RTTI).
Проблема
Предположим, у нас есть запись с несколькими строковыми полями:
type
TPerson = record
FirstName: string;
LastName: string;
Email: string;
Age: Integer;
end;
Мы хотим создать процедуру, которая автоматически преобразует все строковые поля записи в нижний регистр, не затрагивая другие типы полей.
Решение с использованием RTTI
Delphi предоставляет мощную систему RTTI, которая позволяет анализировать и модифицировать структуры данных во время выполнения. Вот как можно реализовать нужную функциональность:
uses
System.Rtti, System.TypInfo;
class procedure TRecordHelper.RecordStringToLower<T>(var ARecord: T);
var
Context: TRttiContext;
RttiType: TRttiType;
Field: TRttiField;
Value: TValue;
begin
Context := TRttiContext.Create;
try
RttiType := Context.GetType(TypeInfo(T));
for Field in RttiType.GetFields do
begin
case Field.FieldType.TypeKind of
TTypeKind.tkString, // ShortString
TTypeKind.tkUString, // UnicodeString
TTypeKind.tkLString, // AnsiString
TTypeKind.tkWString: // WideString
begin
Value := Field.GetValue(@ARecord);
if not Value.IsEmpty then
Field.SetValue(@ARecord, Value.AsString.ToLower);
end;
end;
end;
finally
Context.Free;
end;
end;
Объяснение решения
TRttiContext - это основной класс для работы с RTTI. Он предоставляет доступ к информации о типах.
GetType(TypeInfo(T)) получает информацию о типе переданной записи.
GetFields возвращает список всех полей записи.
Для каждого поля проверяем его тип через TypeKind.
Если поле является строковым (любого из 4 видов строк в Delphi), мы:
Получаем его текущее значение через GetValue
Преобразуем строку в нижний регистр с помощью ToLower
Однако этот подход менее гибкий и требует написания отдельной процедуры для каждого типа записи.
Заключение
Использование RTTI в Delphi предоставляет мощные возможности для работы с типами данных во время выполнения. Представленное решение позволяет легко обрабатывать все строковые поля в записи без необходимости явного указания каждого поля.
Этот подход особенно полезен при работе с:
- Формами ввода данных
- Импортом/экспортом информации
- Нормализацией данных перед сохранением в базу
- Обработкой конфигурационных структур
Приведенный код работает в современных версиях Delphi (XE и выше). Для более старых версий может потребоваться незначительная адаптация.
Статья описывает использование RTTI в Delphi для автоматического преобразования всех строковых полей записи в нижний регистр без явного указания каждого поля.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS