Формы и справочники: практическая часть
Практический разбор структуры и работы экранов, если нужно быстро доводить карточки/списки до корректного поведения.
Формат модулей
Form
Form обычно используется для редактирования одной записи.
<Module Type="Form" Name="taskForm" Parent="task" Description="Задача">
<Form Width="780" Height="560" Icon="-1">
<edit Left="80" Top="8" Name="Header" DataType="String" Width="300"/>
<button Left="520" Top="520" Name="ok" Caption="ОК"/>
</Form>
<Programm Language="Similar Pascal"/>
</Module>
Reference
Reference — справочник (табличный список + карточка).
<Module Type="Reference" Name="taskReference" Parent="task" Description="Задачи"
Fields="..." TopHeight="56" ManualRequery="0" LookupOptimization="0">
<Form Width="760" Height="520"/>
<Programm Language="Similar Pascal"/>
</Module>
Атрибут Fields для Reference можно хранить в сериализованном виде:
вложенные строки с типами/названиями полей; это удобный быстрый путь для UI.
Что проверять в форме, чтобы она была рабочей
- Каждая сущность имеет стабильный
Name(без пробелов и совпадений). - Для lookup-полей ставьте корректный
DataType="*TableName". - Для обязательных вычисляемых полей задайте правильную последовательность
инициализации (
OnCreate/OnShow), иначе может попастьnull/пустой ключ. - Уровень доступов у таблицы и полей должен соответствовать роли пользователя.
Доступ к контролам в скрипте
Для большинства экранов доступны методы Item, ItemCount, ItemExists.
Procedure OnCreate;
Begin
If Form.ItemExists('ok') Then
Form.Item('ok').Enabled := 0;
End;
Procedure OnSomeFlagChange;
Begin
If Reference.ItemExists('SomeField') Then
Reference.Item('SomeField').Enabled := 1;
End;
Для доступа по индексу/по имени Item может быть вызван:
Item(0)— индекс,Item('Name')— имя.
Табличный уровень в справочниках
У справочника есть основной табличный dataset (например, для списка записей):
Count— количество строк,Find(...)— поиск,Append,Remove,Clear,Sort,SortColumn,SortDesc,CursorX,CursorY.
Дополнительно:
FixedLeft— закреплённая часть слева,AddPopup,Tableдля расширений интерфейса,Filter/ExtFilterдля сохранённых фильтров.
Фильтры и интервалы
SetInterval(From, To) и Filter используются в типовых шаблонах для списка:
ExtFilter— дополнительный служебный фильтр,ResultFilter— подготовленный финальный фильтр,ColumnFormula— формулы по колонкам.
Если фильтры странно конфликтуют, сперва проверьте:
- какой
Filterустановлен в форме, - какой в коде в
Form.OnCreateилиReference.OnShow, - есть ли глобальные фильтры в приложении/на уровне таблицы.
Типовые операции через кнопку «Сохранить»
Обычно достаточно вызывать:
Form.Apply— сохранить текущую карточку,Form.Close— закрыть,- проверять
DontAskDeleteпри удалении.
Procedure OnSaveBtnClick;
Begin
Form.Apply;
Form.Close;
End;
Команды для Reference и их эффекты
ModalForm(Name)— открыть форму как модальное окно.ModalReference(Name)— открыть справочник как выбор из диалога.
Распространённые ошибки в UI
- Нажатия на разные кнопки не срабатывают как ожидается:
- проверьте имена обработчиков (
Name↔On<Name>Click), - проверьте что обработчик в
program.pasобъявленProcedure OnXxxClick;. - «пустые» формы и неверные значения:
- проверьте
DataTypeиParentвmodule.xml, - проверьте
Mode/Readonlyи права доступа таблицы. - Неправильные lookup значения:
- убедитесь что
FkToTableиFkToFieldуFieldнаTableвалидны.
Как читать form.xml и module.xml быстро
- Сначала откройте
module.xml— проверьте метаданные и типы. - Если есть
form.xml, смотрите координаты иNameвсех контролов. - Смотрите, что
program.pasиспользует только существующиеName. - Только после этого тестируйте UI.
Что важно для производительности
- Убеждайтесь, что в
Reference/Formне создается лишний повторный requery без нужды. - Не дёргайте все данные в
OnShowбез условий — используйте параметры, если нужен узкий срез.
Небольшой шаблон для базового рефреша справочника
Procedure OnAfterApply;
Begin
Reference.Requery;
End;
Procedure OnResetFilters;
Begin
Reference.ResetFilters;
End;