Содержание

28. Веб-сервер

Скрипты и расширения для веб-сервера поддерживаются конструктором начиная с версии 23.5.25. Принцип работы веб-сервера существенно отличается от работы настольного приложения DataExpress, в особенности это касается реализации интерфейса пользователя.

В настольном приложении вы свободно можете получить доступ к большинству элементов пользовательского интерфейса: окнам, кнопкам, полям и пр., изменять их внешний вид и поведение. Вы можете вызвать модальное окно, при этом код будет «ждать» пока пользователь не закроет окно и только после этого выполнится следующая команда. У вас есть окно редактирования, окно списка, окно отчета, представление, закладки пр. Вы свободно загружаете и сохраняете файлы в любое место. Настольное приложение обрабатывает запросы пользователя непосредственное через графический интерфейс, само же его и рисует.

Веб-сервер же только обрабатывает запросы клиента и передает данные обратно. За рисование интерфейса отвечает клиент - веб-браузер. Для веб-сервера был разработан отдельный API, очень похожий на API настольного приложения, но более ограниченный. Урезана была часть, отвечающая за работу с графическим интерфейсом пользователя. В API нет окон редактирования, списка и пр., нет модальности - хотя для пользователя реализовано подобие модальности в виде окон сообщений. Вы можете программировать только формы редактирования записи, табличная часть формы, отчеты остаются вне вашего контроля.

Для программирования веб-сервера в редакторе скриптов создаются веб-модули форм и расширений. Есть и своя версия модуля Main - WebMain. Когда вы переключаетесь между модулем и веб-модулем, меняется и дерево классов.

Сервер может реагировать, когда пользователь изменяет в браузере значение какого-то поля, кликает на строку таблицы или запроса, нажимает на кнопку формы или окна сообщений. В скрипте наступают следующие события соответственно: TdxForm.OnFieldChange, TdxForm.OnBeforeScroll, TdxForm.OnAfterScroll, TdxQueryGridOnBeforeScroll, TdxQueryGrid.OnAfterScroll, TdxButton.OnClick. Для обработки нажатия кнопки окна сообщений, создается процедура-обработчик, для каждого окна отдельно.

Внутри процедуры-обработчика вы можете менять значения полей, некоторые свойства компонентов: положение, размер, цвет, шрифт, доступность, видимость т. д. Все эти изменения оформляются сервером в виде json-ответа. Клиент получает ответ и выполняет соответствующие изменения на своей стороне.

Окна сообщений

Вы можете показать сообщение пользователю, использую методы TdxForm: MsgBox и MessageDlg. Вызов этих методов не «остановит» код, он продолжит свое выполнение до конца, а сервер сделает себе пометку, что в json-ответ нужно добавить инструкцию «показать сообщение». В методе MessageDlg можно указать обработчик нажатия кнопки. Пример:

procedure MessageDlgBtnClick(Sender: TObject; Bn: TMsgDlgBtn);
begin
  if Bn = mbYes then
  begin
    …
  end;
end;

procedure Button1Click(Sender: TObject);
begin
  … какой-то код
  Self.MessageDlg('Внимание', 'Вы действительно хотите выполнить это действие?', mtConfirmation, [mbYes, mbNo], @MessageDlgBtnClick);
  … какой-то код будет выполнен
end;

procedure Form_Create;
begin
  dxButton1.OnClick := @Button1Click;
end;