7. Обращение к полям формы

Как уже говорилось выше, форма интегрирована с набором данных. А компоненты формы связаны с полями набора данных. Форма имеет свойства, которые позволяют читать и записывать в поля набора данных.

Fields

Начнем со свойства Fields.

Например:

Self.Fields['Сумма'] := Self.Fields['Цена'] * Self.Fields['Количество'];

Вот как обозначено свойство Fields в дереве классов:

property Fields[Name: String]: Variant [rw] default

Свойство является индексным, т. е. подобно массиву доступ к элементам свойства осуществляется по индексу. Только здесь в качестве индекса выступает не число (порядковый номер элемента в массиве), а строка, имя поля. Тип свойства Variant, т. е. может принимать значения любых типов (строки, числа, даты и т. д.). [rw] означает, что свойство доступно для чтения [r] и записи [w]. Default означает, что свойство является свойством по умолчанию, т. е. при обращении к свойству Fields можно не указывать.

Self['Сумма'] := Self['Цена'] * Self['Количество'];

Вы можете обращаться не только к полю формы, но и к полю объекта. Вот так:

S := Self['Клиент|Название'];

Поля объекта можно только читать, записывать в них нельзя.

Есть еще несколько свойств, упрощающих доступ к полям определенных типов:

AsI

AsI[Name: String]: Integer – доступ к числовым полям или объектам. Возвращает целое число. Значение Null преобразуется в 0.

AsF

AsF[Name: String]: Extended – доступ к числовым полям. Возвращает вещественное число. Значение Null преобразуется в 0.

AsDT

AsDT[Name: String]: TDateTime – доступ к полям даты и времени. Значение Null преобразуется в 0.

AsS

AsS[Name: String]: String – доступ к любым полям. Результат возвращается в виде строки. Значение Null преобразуется в пустую строку.

Данные свойства только для чтения.

При чтении полей рекомендуется использовать именно эти свойства, а не свойство Fields. Поле может быть пустым (содержать null) и при вычислении выражения может возникнуть ошибка или получиться неверный результат. Кроме того, из-за особенностей Pascal Script дробные числа, возвращаемые свойством Fields, могут восприниматься как целые, что может привести к неверным вычислениям.

OnFieldChange

Если в полях есть выражения, то при изменении поля могут выполняться вычисления в соответствующих полях. При изменении какого-либо поля возникает событие формы OnFieldChange. Вы можете обработать это событие. Пример:

procedure MyFieldChange(Sender, Control: TObject; const FieldName: String);
begin
  if (FieldName = 'Количество') or (FieldName = 'Цена') then
    Self['Сумма'] := Self.AsI['Количество'] * Self.AsF('Цена')
  else if Control = dxComboBox1 then 
  beginend; 
end;
 
procedure Form_Create;
begin
  Self.OnFieldChange := @MyFieldChange;
end;

В Form_Create мы подключаемся к событию OnFieldChange. Тип события TFieldChangeEvent. Процедура-обработчик этого события уже имеет 3 параметра:

Sender – объект, в котором произошло событие. Указывает на форму.

Control – компонент поля, которое изменилось.

FieldName – имя поля, которое изменилось.

В примере видно, что узнать которое поле изменилось можно либо по имени поля, либо по его компоненту.

Обращение к полю формы через компонент поля

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

Класс компонента Тип поля
TdxEdit Текст
TdxDateEdit Дата
TdxTimeEdit Время
TdxCalcEdit Число
TdxMemo Заметка
TdxComboBox Список
TdxLookupComboBox Объект
TdxObjectField Поле объекта
TdxCheckBox Флажок
TdxDBImage Изображение
TdxFile Файл

Приведенные в таблице dx-компоненты, кроме TdxDBImage, имеют свойство Field, через которое можно читать и записывать значение поля.

Обращение к полю «объект» через компонент поля TdxLookupComboBox

С этим компонентом связано два поля. Field – поле отображающее значение списка (текст в основном), и KeyValue – ID связанной записи. Если вы напрямую обращаетесь к полям через этот компонент, то вам необходимо присваивать значения обоим полям. Если вы обращаетесь к полю через свойство Fields формы, то нужно присваивать только ID записи, значение списка будет подставлено автоматически.

Обращение к полю «изображение» через компонент TdxDBImage

Поле «Изображение» составное и состоит из 4-х полей:

  • само изображение – свойство Bitmap,
  • миниатюра – соответствующего свойства нет,
  • файл-источник – свойство SourceFileName,
  • имя файла в папке хранения – свойство StoredFileName – используется, если способ хранения «В папке».

Нельзя обратиться к полю изображения через свойство Fields формы, но можно по имени компонента (например, dxDBImage1) или через свойство формы Images (property Images[FieldName: String]: TdxDBImage), например:

Self.Images['Фото'].LoadFromFile('d:\images\img1.jpg');
dxDBImage1.LoadFromFile('d:\images\img1.jpg');

Обратиться к содержимому можно через свойство Bitmap компонента, но Bitmap содержит сжатое или растянутое изображение оригинала. Если попытаться изменить Bitmap, то изменения не сохранятся в базе. Используйте LoadFromFile для загрузки изображения из файла в базу. При загрузке изображения все 4 поля заполняются автоматически. Изменения в поле вызывают событие формы OnFieldChange. Метод SaveToFile сохраняет содержимое в файл.

Обращение к полю "Файл" через компонент TdxFile

Поле «Файл» также является составным и также состоит из 4-х полей:

  • описание файла – свойство Field,
  • сам файл – свойство не предусмотрено,
  • файл-источник – SourceFileName – путь, откуда загружен файл,
  • имя файла в папке хранения – свойство StoredFileName – используется, если способ хранения «В папке».

Нельзя обратиться к полю файла через свойство Fields формы, но можно по имени компонента (например, dxFile1) или через свойство формы Files (property Files[FieldName: String]: TdxFile), например:

Self.Files['Вложение'].SaveToFile('d:\files\file1.doc');
dxFile1.SaveToFile('d:\files\file1.doc');

Метод LoadFromFile используется для загрузки файла в базу. При загрузке все 4 поля заполняются автоматически. Изменения в поле вызывают событие формы OnFieldChange. Метод SaveToFile сохраняет содержимое в файл.