Содержание
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 begin … end; 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 сохраняет содержимое в файл.