Delphi: Одна процедура для изменения всех полей записи? - PullRequest
0 голосов
/ 13 мая 2011

У меня есть такая запись:

Tcustomer=record
  Name: string;
  IDNumber: Integer;
  IsMarried: boolean;
end;

И у меня есть класс TCustomers_Manager, в котором хранится список всех клиентов. Можно ли провести такую ​​процедуру:

Procedure ChangeCustomer(CustomerIndex: integer; field: string; value);

Это устанавливает значение для этого конкретного поля. Например:

ChangeCustomer(1, 'Name','John');

Как я могу это реализовать?

Обновление: чтобы уточнить, мой вопрос в основном состоит из 2 частей:

1) Как сопоставить имя поля (в строке) с фактическим полем в записи?

2) Можно ли передать значение, имеющее разные типы? Или я должен передать один тип и набрать его (например, передать строку и затем использовать strtoint())

Ответы [ 2 ]

3 голосов
/ 13 мая 2011

Я бы использовал TClientDataSet.

  1. Создать TClientDataSet с полями ID, Имя и т. Д.
  2. Открыть набор данных, заполнить InsertRecord или Вставить / Опубликовать
  3. НайтиЗапись с помощью Locate
  4. Используйте FieldByName ('FieldName'). Значение для доступа к данным или их изменения

Или вы можете взять любой компонент MemoryDataSet и использовать его таким же образом.

Второй способ - преобразовать запись в класс, объявить поля как опубликованные и использовать SetPropValue.

Если вы хотите передать любое значение, вы можете использовать Variant.Но вы должны проверить типы перед назначением.

1 голос
/ 13 мая 2011

Вы могли бы, например, сделать это (предполагая lst: TList<TCustomer>, как вы сказали в комментарии):

Procedure ChangeCustomer(index: integer; i: byte; value: variant)
begin
    case (i) of
        0: lst[index].Name := value;
        1: lst[index].IDNumber := value;
        2: lst[index].IsMarried := value;
    end;
end;

Вы можете использовать тип (или enum) вместо i: byte. Я давно не пользуюсь Delphi, поэтому возьмите мой пример как идея , а не как приложение Delphi !!

...