Для того чтобы в карточке встроить нужный эдит-контрол нужно создать генератор соответствующего класса. Например, мы хотим, чтобы поле 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, );
Поиск прототипа в глобальном списке производится по полному имени поля и расширению.