Для того чтобы в карточке встроить нужный эдит-контрол нужно создать генератор соответствующего класса. Например, мы хотим, чтобы поле item_Text
редактировалось компонентом многострочный-эдит. Для этого достаточно на старте приложения создать генератор:
TfleMemoFormat.CreateGenerator('item_Text');
Остальное сделают компоненты.
Контролы для редактирования и просмотра данных в карточке создаются в виртуальных методах эдит-формата CreateEditControl
и CreateViewControl
. Там же могут задаваться их некоторые простейшие свойства. В перекрытом методе TfleMemoFormat.CreateEditControl
создается TssDBMemo
, ему назначается Parent
и WordWrap
.
Так же создать мемо с подсветкой cинтаксиса SQL:
TfleSQLMemoFormat.CreateGenerator('item_SQL');
Задать диапазон значений:
TfleFloatFormat.RangeCreateGenerator('item_Volume', rtPositive); TfleFloatFormat.RangeCreateGenerator('item_Degree', GetNumberRange([rtLow, rtHighInclusive], 0, 100));
Или создать комбобокс с вызовом справочника выбора и историей:
TfleBaseHistoryList.CreateGenerator('acoptp_acoptgr_ID', 'acoptgr_Name', 'acoptgr_ID', 'acoptgr_Name', TfmAccountOperationTypeGroups);
Параметры этого конструктора:
_FieldName
–поле-ссылка
_DisplayFieldName
– отображаемое поле
_ListKeyFieldName
– ключевое поле списка
_ListDisplayFieldName
– отображаемое поле списка
_DirectoryFormClass
– класс справочника для выбора
Обычно db-компонент может получить от сервера допустимость пустых значений, но в некоторых запросах это невозможно. В таких случаях обязательность заполнения задаётся параметром конструктора генератора _CustomRequired
:
TfleIntegerFormat.CreateGenerator('item_Order', '', crNotRequired);
Бывает, что для полей с одним и тем же именем необходимо обеспечить разную функциональность редактирования данных в зависимости от формы или внешних условий. Для этого используются события датасета OnGetEditFormat
или OnGetEditFormatEvent
на выбор.
В событии OnGetEditFormat
напрямую создается рабочий экземпляр, который сохраняется в датасете:
procedure TfmSomeEditorForm.EditDataSetGetEditFormat(DataSet: TssDataSet; FieldName: String); begin if SameText(FieldName, 'item_Name') then TfleSomeEditFormat.Create(DataSet, FieldName); end;
В событии OnGetEditFormatEvent
условие поиска рабочего экземпляра в глобальном списке уточняется при помощи строкового параметра Extension
:
const SC_Required = 'Required'; procedure TfmSomeEditorForm.EditDataSetGetEditFormatEvent(DataSet: TssDataSet; FieldName: String; var Extension: String; Params: TssParams); begin inherited; if SameText(FieldName, 'item_Comment') then if EditDataSet.FieldByName('item_Type').AsInteger = 1 then Extension := SC_Required; end;
Но в этом случае рабочий экземпляр отыскивается в глобальном списке по общей схеме, поэтому на старте нужно создать оба генератора, с расширением и без него:
TfleMemoFormat.CreateGenerator('item_Comment'); TfleMemoFormat.CreateGenerator('item_Comment', SC_Required, crRequired, );
Поиск прототипа в глобальном списке производится по полному имени поля и расширению.