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

Динамический доступ к полям записей в Delphi 7: получение смещения поля по имени

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

Вопрос, поставленный в данной теме, заключается в том, как получить смещение поля внутри записи в Delphi 7, если имя этого поля известно только во время выполнения программы. Рассмотрим запись TItem, содержащую различные поля, и задачу получения смещения поля по его имени, заданному в виде строки.

Пример записи:

TItem = record
   UPC: string[20];
   Price: Currency;
   Cost: Currency;
   // ...
end;

Задача:

Допустим, у нас есть переменная item типа TItem, и нам нужно получить значение поля, имя которого известно во время выполнения. Для этого необходимо сначала получить смещение этого поля относительно начала записи.

Решение:

В Delphi 7 нет встроенной поддержки RTTI (Runtime Type Information) для записей, что означает, что получить информацию о полях записи во время выполнения напрямую не получится. Однако, можно использовать следующий подход:

  1. Создать функцию, которая будет принимать имя поля в виде строки и возвращать его смещение.
  2. В функции реализовать "регистрацию" полей и их смещений, что позволит избежать необходимости обновлять код при изменении структуры записи.

Пример реализации функции:

type
  TFieldOffset = record
    FieldName: string;
    Offset: Integer;
  end;

var
  FieldOffsets: TArray<TFieldOffset>;

// Добавление нового поля в список смещений
procedure AddField(const AName: string; AOffset: Integer);
begin
  SetLength(FieldOffsets, Length(FieldOffsets) + 1);
  with FieldOffsets[High(FieldOffsets)] do
  begin
    FieldName := AName;
    Offset := AOffset;
  end;
end;

// Получение смещения поля по его имени
function GetItemFieldOffset(const Value: string): Integer;
var
  i: Integer;
begin
  Result := -1;
  for i := Low(FieldOffsets) to High(FieldOffsets) do
  begin
    if FieldOffsets[i].FieldName = Value then
    begin
      Result := FieldOffsets[i].Offset;
      Break;
    end;
  end;
  if Result = -1 then
    raise Exception.CreateFmt('Field %s not found', [Value]);
end;

// Пример использования
var
  pc: Integer;
  fieldName: string;
  value: Currency;
begin
  pc := Integer(@item); // item уже определен и заполнен
  fieldName := 'Price'; // имя поля, известное во время выполнения
  AddField('UPC', Integer(@item.UPC) - Integer(@item));
  AddField('Price', Integer(@item.Price) - Integer(@item));
  AddField('Cost', Integer(@item.Cost) - Integer(@item));
  // ...
  Inc(pc, GetItemFieldOffset(fieldName)); // получение смещения поля
  value := PCurrency(pc)^; // получение значения поля
  // ...
end;

Заключение:

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

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

Вопрос связан с получением смещения поля внутри записи в Delphi 7 по его имени, известному во время выполнения программы, и решением задачи без использования RTTI для записей.


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

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




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-02-11 00:15:07/0.003119945526123/0