22.1. Эдит-форматы

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

Параметры этого конструктора:

Обычно 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, );
 

Поиск прототипа в глобальном списке производится по полному имени поля и расширению.