Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как преобразовать все строковые поля в записи в нижний регистр с использованием RTTI в Delphi

Delphi , Компоненты и Классы , RTTI

Преобразование строковых полей записи в нижний регистр с помощью 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;

Объяснение решения

  1. TRttiContext - это основной класс для работы с RTTI. Он предоставляет доступ к информации о типах.
  2. GetType(TypeInfo(T)) получает информацию о типе переданной записи.
  3. GetFields возвращает список всех полей записи.
  4. Для каждого поля проверяем его тип через TypeKind.
  5. Если поле является строковым (любого из 4 видов строк в Delphi), мы:
  6. Получаем его текущее значение через GetValue
  7. Преобразуем строку в нижний регистр с помощью ToLower
  8. Устанавливаем новое значение через SetValue

Пример использования

var
  Person: TPerson;
begin
  Person.FirstName := 'IVAN';
  Person.LastName := 'PETROV';
  Person.Email := 'EXAMPLE@DOMAIN.COM';
  Person.Age := 30;

  TRecordHelper.RecordStringToLower<TPerson>(Person);

  // Теперь:
  // Person.FirstName = 'ivan'
  // Person.LastName = 'petrov'
  // Person.Email = 'example@domain.com'
  // Person.Age осталось 30
end;

Альтернативное решение

Если вам не нравится подход с generics или вы работаете с более старыми версиями Delphi, можно реализовать процедуру для конкретного типа записи:

procedure PersonToLower(var APerson: TPerson);
begin
  APerson.FirstName := APerson.FirstName.ToLower;
  APerson.LastName := APerson.LastName.ToLower;
  APerson.Email := APerson.Email.ToLower;
end;

Однако этот подход менее гибкий и требует написания отдельной процедуры для каждого типа записи.

Заключение

Использование RTTI в Delphi предоставляет мощные возможности для работы с типами данных во время выполнения. Представленное решение позволяет легко обрабатывать все строковые поля в записи без необходимости явного указания каждого поля.

Этот подход особенно полезен при работе с:
- Формами ввода данных
- Импортом/экспортом информации
- Нормализацией данных перед сохранением в базу
- Обработкой конфигурационных структур

Приведенный код работает в современных версиях Delphi (XE и выше). Для более старых версий может потребоваться незначительная адаптация.

Создано по материалам из источника по ссылке.

Статья описывает использование RTTI в Delphi для автоматического преобразования всех строковых полей записи в нижний регистр без явного указания каждого поля.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: RTTI ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-07-22 03:33:20/0.0061800479888916/0