Важно! Пример проекта доступен для скачивания по ссылке. В формах ввода можно использовать следующие компоненты: Поле, Список, Календарь и Флажок. Данные из указанных компонентов будут переданы на сервер после заполнения формы. Данные из других компонентов не будут переданы на сервер!
Формы ввода используются, когда с клиента на сервер нужно передать набор данных и выполнить с ним какие-либо действия. Любое окно (кроме шаблонного) можно использовать в качестве формы ввода. Для этого нужно выделить окно и активировать свойство "Использовать как форму ввода".
Рассмотрим простой пример: на мнемосхеме есть два календаря и кнопка "Построить отчет":
Пользователь указывает диапазон времени и при нажатии на кнопку формирует отчет. В проекте с одним пользователем никаких проблем не возникнет. Но если к проекту подключатся два пользователя с разных компьютеров и оба решат построить отчет, то своими действиями они будут мешать друг другу, т.к. календари и кнопка построения отчета существуют в единственном экземпляре (на сервере). Поэтому, любые изменения в календарях будут отображаться на всех клиентах. Например, первый пользователь задает время начала 00:00 и время конца 10:00. Одновременно с этим, второй пользователь указывает время начала 08:00 и время конца 12:30. В результате, первый пользователь при нажатии кнопки "Построить отчет" может получить отчет за время, указанное вторым пользователем, т.к. на момент построения отчета переменные были изменены. Либо может сложиться впечатление, что после ввода времени в календарь, оно само по себе изменилось на другое (т.к. в этот момент другой пользователь изменил время).
Для исключения вышеописанных проблем, можно создать отдельную страницу (либо окно), доступную только одному пользователю и отключить опцию "Множественная авторизация", чтобы к странице нельзя было одновременно подключиться несколькими пользователями. Но такое решение не всегда подходит, особенно в проектах с большим количеством пользователей. Для подобных задач проще воспользоваться формами ввода.
Пример использования формы ввода
Рассмотрим реализацию интерфейса построения отчета с использованием формы ввода. Создадим в проекте новое окно и включим у него свойство "Использовать как форму ввода". Дополнительно можно активировать свойство "Модальное", чтобы после открытия окна, интерфейс за его пределами блокировался. Для примера, назначим окну имя "frmBuildReportForm" и изменим заголовок на "Построить отчет". Разместим в окне два календаря, кнопку "Построить отчет" и кнопку "Отмена". Календарю с временем начала дадим имя "cldTimeBegin", с временем конца "cldTimeEnd".
Далее нужно настроить работу кнопок. Выделим кнопку "Отмена" и изменим свойство "Действие" на "закрыть окно". У кнопки "Построить отчет" изменим "Действие" на "отправить форму". Теперь при нажатии кнопки "Построить отчет" данные из календарей будут переданы на сервер. Обработать их можно в скрипте с типом "Заполнена форма".
Перейдем в редактор скриптов, создадим новый скрипт с типом события "Заполнена форма" и именем "OnDoneBuildReportForm". В коде скрипта можно выполнить проверку введенных пользователем данных и выдать ошибку, если введены недопустимые данные. В нашей форме есть два календаря с именами "cldTimeBegin" и "cldTimeEnd", значит можно получить дату/время из каждого календаря обращаясь к ним по имени, например: FormData[cldTimeBegin], FormData[cldTimeEnd]. Готовый скрипт будет выглядеть так:
var
aReport: TM_Report;
begin
// если пользователь заполнил форму frmBuildReportForm
if FormData.Window = frmBuildReportForm then
begin
// если время начала больше чем время конца, то выдаем ошибку и прерывааем выполнение скрипта
if FormData[cldTimeBegin].AsDateTime > FormData[cldTimeEnd].AsDateTime then
begin
FormData.SetError('Время начала не может быть больше чем время конца!');
Exit;
end;
// вызываем построение отчета
aReport := ReportBuild('Мой_отчет');
// записываем значения из календарей в переменные отчета
aReport.SetVariableValueDT('Данные_Начало', FormData[cldTimeBegin].AsDateTime);
aReport.SetVariableValueDT('Данные_Конец', FormData[cldTimeEnd].AsDateTime);
// открываем отчет на просмотр
aReport.View(GetClientName);
end;
end.
Данный скрипт работает достаточно просто: сначала мы проверяем, что пользователь заполнил форму frmBuildReportForm (а не какую-то другую) и выдаем ошибку если интервал времени задан некорректно. Если все в порядке, то подставляем в переменные отчета значения из календарей и строим отчет.
Остается только реализовать вызов полученной формы. Для этого разместим на мнемосхеме кнопку (либо другой компонент), выделим ее и в свойстве "Окно" укажем форму "frmBuildReportForm", после чего сохраним и запустим проект.
Автоматическая проверка значений вне диапазона и контроль ввода
В скриптах с типом "Заполнена форма" можно выполнить любые проверки на корректность введенных пользователем данных. При этом некоторые проверки можно автоматизировать. Допустим, в форме ввода есть поле, для которого нужно разрешить ввод целых чисел от 10 до 20, а для значений вне диапазона выдать соответствующую ошибку. Для этого достаточно в меню редактирования переменных создать новую внутреннюю переменную с типом данных Integer (целое число) и шкалой от 10 до 20. Затем выделить поле в форме ввода и в свойстве "Переменная" указать созданную переменную. Теперь скада-система будет автоматически контролировать ввод, разрешая только целые числа от 10 до 20.
На этапе разработки формы можно задать начальные значения для компонентов формы, например:
1.Для "Поля" можно задать начальное значение через свойство "Значение".
2.Для "Флажка" можно задать начальное значение через свойство "Включен".
3.У "Списка" можно открыть свойство "Строка" и дважды кликнуть нужную строку.
4.Для "Календаря" можно создать внутреннюю переменную с типом DateTime, задать ей начальное значение, например "01.02.2003 11:22:33" и привязать ее к календарю.
Но иногда требуется задать начальные значения скриптом при открытии формы, например по событию OnClick:
begin
// задаем значения объектам в форме ввода
myFieldInForm.Text := '25';
myCheckBoxInForm.Checked := True;
myComboBoxInForm.ItemIndex := 3;
myCalendarInForm.Value := Now;
// открываем форму
myForm.ShowClient(GetClientName);
end.
В скрипте мы выполнили все необходимые действия (задали начальные значения и вызвали открытие формы), поэтому привязывать форму к объекту через свойство "Окно" не требуется.