Шаг 44.
Visual Prolog.
События от окон

    На этом шаге мы рассмотрим события от окон.

События

    События, происходящие в системе VPI, вызывают формирование структуры данных домена event в соответствии с типом события. Эти структуры посылаются обработчику событий для окна и будут являться вторым аргументом в обработчике событий. Далее будут представлены описания структур домена событий и рекомендуемые действия обработчика события для каждого из них. В тех случаях, когда нет предложения для обработки события, выполняется обработка по умолчанию.

Создание окон

   e_Create(long CreationData)

    Это первое событие, которое получает любое окно или диалоговое окно. Оно приходит перед отображением, но после внутреннего создания окна. Здесь необходимо выполнять все действия по инициализации (инициализация баз данных, активизация, блокировка, инициализация элементов управления). Вы увидите, что эксперты кода в VPI размещают код для создания элементов управления, дочерних окон, панелей инструментов и справки так, чтобы все было создано прежде, чем окно станет видимым. Предикат, который создает окно, не будет завершен до тех пор, пока не будет завершено предложение события e_Create.

    Часто бывает необходимо передать специфическую для отдельного экземпляра информацию от предиката создания к созданному экземпляру окна. Если диалоговое окно используется более чем в одном месте приложения, полезно было бы применить новый или изменяемый заголовок. Это можно сделать только в обработчике события e_Create, т. к. окно и его дескриптор еще не существуют. Окно пока не отображено, и изменения могут быть произведены незаметно.

    Эти действия можно выполнить, передав значение long параметра CreationData предикату создания окна; затем это значение передается в событие e_Create. Пример кода приведен ниже.

   dlg_criterion_Create(TaskWindow,Menultem,Caption):-
      CreationVal=criterion_context(TaskWindow,Menultem,Caption),
      LongVal=cast(long,CreationVal), 
      win_CreateResDialog(Windowtype,Resource_id,event_handler,LongVal).
   event_handler(Window,e_Create(LongVal),0):-
      CreationVal=cast(criterion_context,LongVal), 
      CreationVal=criterion_context(TaskW,MenuItem,Caption)),
      . . . 

    Обратите внимание на то, что в обработчике события e_Create для окна Task выполняется инициализация приложения в целом.

Удаление окна

   e_Destroy()

    Это событие позволяет выполнить заключительное удаление всех данных, определенных для окна. Событие e_Destroy является последним событием, которое обрабатывает окно. Ваш код имеет доступ ко всем элементам управления и дочерним окнам (и их содержанию), даже если они не отображены на экране.

    Окно всегда будет получать событие e_Destroy, независимо от того, было ли оно уничтожено вызовом предиката win_Destroy или было уничтожено его родительское окно.

Закрытие окна пользователем

   e_CloseRequest()

    Это событие сообщает, что пользователь дважды нажал кнопку системного меню окна или выбрал команду Close из системного меню. Если вы не обрабатываете это событие, то по умолчанию окно будет уничтожено без выполнения каких-либо завершающих операций приложения. Если предикат обработчика событий завершится успешно для этого события, то будет выполнено автоматическое закрытие окна. Примерами обработки события e_CloseRequest могут служить: выполнение заключительных действий и/или требование подтверждения перед вызовом предиката win_Destroy().

    На следующем шаге мы рассмотрим закрытие графического пользовательского интерфейса.




Предыдущий шаг Содержание Следующий шаг