В программах на языке Clarion для Windows большинство сообщений от Windows автоматически обрабатываются внутри обработчика событий ACCEPT. Существуют события общего характера, которые обрабатываются библиотечными функциями исполняющей системы (перерисовка экрана и т.п.). И только те события, которые действительно могут потребовать реакции программы, передаются обработчиком событий ACCEPT в программу. Результатом такого подхода явилось облегчение прикладного программирования из-за устранения из программы низкоуровневого кодирования рутинных операций, что позволяет вместо этого сконцентрировать внимание на аспектах прикладного уровня. Конечно, можно также обрабатывать низкоуровневые сообщения Windows и самому, но делать это стоит только
в абсолютно необходимых случаях. Если потребуется более подробная информация о программировании для среды Windows, обратитесь к книге Чарльза Петцольда Programming Windows, опубликованной Microsoft Press.В программу обработчиком событий ACCEPT передаются события двух видов: события связанные с полем и события не связанные с полем. Ниже приведен список мнемонических имен соответствия событий, который содержится в файле EQUATES.CLW.
Следующие свойства всегда должны трактоваться как “модальные”:
EVENT:LoseFocus
EVENT:GainFocus
EVENT:Dragging
EVENT:Contracting
EVENT:Expanding
EVENT:PreAlertKey
EVENT:TabChanging
EVENT:Move
EVENT:Size
EVENT:Restore
EVENT:Maximize
EVENT:Iconize
EVENT:Sized
EVENT:Selected
EVENT:Selecting
Также, если окно списка имеет атрибут IMM:
EVENT:ScrollUp
EVENT:ScrollDown
EVENT:PageUp
EVENT:PageDown
EVENT:ScrollTop
EVENT:ScrollBottom
EVENT:ScrollTrack
EVENT:ScrollDrag
Когда мы ссылаемся на событие как на "модальное", то это означает, что пока событие не завершится библиотечная функция времени исполнения не может продолжать нормальную работу. Основное правило для кодирования реакции на эти события заключаются в том, что событие должно быть завершено в “ограниченный” период времени.
Это означает, что код, который вы создаете для обработки “модальных” событий, не должен содержать диалоги, включать внутренние
ACCEPT-циклы, вызов окон сообщений или нечто аналогичное, что может помешать циклу ACCEPT завершить обработку события. Когда вашей программе необходимо сделать нечто подобное для обработки одного из таких событий, должны выдаваться пользовательские события во внешнюю очередь событий. Например:CASE EVENT()
...
OF EVENT:GainFocus
POST(MyGainFocus,,, TRUE) !Послать определенное пользователем событие
!
в обработчик действия GainFocus...
OF MyGainFocus
<выполнение операций по обработке события>
...
END
События не связанные с полем не относятся ни к одному из экранных объектов, однако требуют от программы некоторой реакции (например, закрыть окно или переключить исполняемый процесс). Большинство из этих событий помещают систему в модальное состояние на время обработки этого события, поскольку прежде чем продолжить выполнение программы требуется получить ее реакцию.
EVENT:AlertKey EVENT:BuildDone
EVENT:BuildFile EVENT:BuildKey
EVENT:CloseDown EVENT:CloseWindow
EVENT:Completed DDE Events
EVENT:Docked EVENT:Undocked
EVENT:GainFocus EVENT:Iconize
EVENT:Iconized EVENT:LoseFocus
EVENT:Maximize EVENT:Maximized
EVENT:Move EVENT:Moved
EVENT:OpenWindow EVENT:PreAlertKey
EVENT:Restore EVENT:Restored
EVENT:Resume EVENT:Size
EVENT:Sized EVENT:Suspend
EVENT:Timer
Пользователь нажал горячую клавишу, определенную атрибутом ALRT (или оператором
ALERT) для окна. Это событие, при обработке которого и выполняются действия, запрошенные пользователем нажатием горячей клавиши.Оператор BUILD или PACK закончили перестройку ключей. Представляет собой событие, по которому выполняется какой-нибудь код очистки. Если пользователь отменил BUILD, устанавливается код ошибки 93.
Операторы BUILD или PACK перестраивают файл. Представляет собой событие, по которому происходит формирование информации пользователю о ходе выполнения этого процесса.
Оператор BUILD или PACK перестраивают ключ. Представляет собой событие, по которому происходит формирование информации пользователю о ходе выполнения этого процесса.
Приложение закрывается. Выдача этого события закрывает приложение. Это событие, при обработке которого выполняются некоторые завершающие действия.
IDE и любые программы сгенерированные Clarion, автоматически не завершаются при завершении работы операционной системы. Это позволяет пользователю завершать любые критические процессы или корректирует и предохраняет возможное разрушение данных. Если Вам нужно завершить приложение когда завершается работа операционной системы, вам понадобится перехватывать подходящие для этого сообщения окна в вашем приложении
.Окно закрывается. Выдача этого события закрывает окно. Это событие, при обработке которого выполняются некоторые завершающие действия.
Закончена обработка всех экранных полей в безостановочном режиме (AcceptAll). Это событие, по которому выполняются процедуры проверки для всех введенных данных во всех полях окна и данные можно спокойно записывать на диск.
EVENT:DDEadvise
Программа-клиент в процессе DDE обмена запросила постоянное обновление данных, передаваемых программой-сервером, написанным на языке Clarion. Это событие, по которому вы выполняете оператор DDEWRITE, чтобы передавать клиенту данные каждый раз, когда они изменяются.
EVENT:DDEclosed
DDE сервер разорвал канал DDE для данного приложения- клиента, написанного на языке Clarion.
EVENT:DDEdata
DDE сервер передал обновленный элемент данных этой конкретной программе-клиенту, написанной на языке Clarion.
EVENT:DDEexecute
Программа-клиент прислала команду данному DDE серверу (если клиент написан на языке
Clarion, то он выполнил оператор DEEXECUTE). Это событие по которому вы определяете действие, запрошенное клиентом, и выполняете его, затем выполняете оператор CYCLE, чтобы подтвердить выполнение клиенту, который прислал команду.EVENT:DDEpoke
Клиент прислал не запрошенные данные этому серверу, написанному на языке Clarion. Это событие, при обработке которого вы определяете, что прислал клиент и куда его поместить,
затем выполняете оператор CYCLE, чтобы подтвердить получение клиенту, который прислал данные.
EVENT:DDErequest
Программа-клиент в процессе DDE обмена запросила данные от программы-сервера, написанной на языке Clarion. Это событие, по которому вы выполняете оператор DDEWRITE, чтобы один раз передать клиенту данные.
Окно плавающей панели инструментов было прижато к краю или положение прижатия изменилось.
Окно плавающей панели инструментов перестало быть прижатым к краю.
EVENT:GainFocus
Фокус ввода переключается на данное окно из другого исполняемого процесса. Это событие, при обработке которого выполняется восстановление данных, запомненных при обработке события EVENT:LoseFocus. Система является модальной во время этого события.
EVENT:GainFocus не генерируется пока обрабатывается EVENT:LoseFocus (если фокус находился в другом окне той же программы).
Пользователь сворачивает окно с атрибутом
IMM до пиктограммы. Если среди операторов, осуществляющих обработку данного события, встретится оператор CYCLE, то событие EVENT:Iconized не генерируется и действие прерывается. С помощью этого события можно не дать пользователю свернуть окно до пиктограммы. Система является модальной во время этого события.Пользователь свернул окно с атрибутом
IMM до пиктограммы. Это событие, по которому, вы снова выравниваете все элементы, которые зависят от размеров окна.Фокус ввода переключается с данного окна на другой исполняемый процесс. Это событие, при обработке которого выполняется сохранение данных, в отношении которых есть риск изменения их в другом исполняемом процессе. Система является модальной во время этого события.
Пользователь устанавливает максимальные размеры окна с атрибутом
IMM. Если среди операторов, осуществляющих обработку данного события, встретится оператор CYCLE, то событие EVENT:Maximized не генерируется и действие прерывается. С помощью этого события можно не дать пользователю установить максимальные размеры окна. Система является модальной во время этого события.
Пользователь установил максимальные размеры окна с атрибутом
IMM. Это событие, по которому, вы снова выравниваете все элементы, которые зависят от размеров окна.Пользователь перемещает окно с атрибутом
IMM. Если среди операторов, осуществляющих обработку данного события, встретится оператор CYCLE, то событие EVENT:Moved не генерируется и действие прерывается. С помощью этого события можно не дать пользователю изменить расположение окна. Система является модальной во время этого события.Пользователь переместил окно с атрибутом
IMM. Это событие, по которому, вы снова выравниваете все элементы в окне, которые зависят от расположения окна.Был выполнен оператор NOTIFY. Это событие используется получателем процесса для определения того, что было отправлено УВЕДОМЛЕНИЕ.
Окно открывается. Это событие, при обработке которого выполняются некоторые действия по инициализации работы с окном.
Пользователь нажал горячие клавиши (атрибут ALRT или оператор ALERT) для атрибута ALRT на окне. Если в тексте программы присутствует оператор CYCLE, предназначенный для обработки этого события, обычное библиотечное действие по обработке нажатия клавиш выполняется до того, как произойдет событие EVENT:AlertKe
y. Это событие позволяет определять, следует ли выполнять обычное библиотечное действие при нажатии клавиш, или нет (помимо той обработки, что задана текстом, написанным “под событием” EVENT:AlertKey). Система является модальной во время этого события.Пользователь восстанавливает предыдущие размеры окна с атрибутом
IMM. Если среди операторов, осуществляющих обработку данного события, встретится оператор CYCLE, то событие EVENT:Restored не генерируется и действие прерывается. С помощью этого события можно не дать пользователю восстановить окно. Система является модальной во время этого события.Пользователь восстановил предыдущие размеры окна с атрибутом
IMM. Это событие, по которому, вы снова выравниваете все элементы, которые зависят от размеров окна.Фокус ввода остается на данном окне, и ему снова передается управление после остановки по событию EVENT
:Suspend. Система является модальной во время этого события.Пользователь изменяет размеры окна с атрибутом
IMM. Если среди операторов, осуществляющих обработку данного события, встретится оператор CYCLE, то событие EVENT:Sized не генерируется и действие прерывается. С помощью этого события можно не дать пользователю изменить расположение окна. Система является модальной во время этого события.Пользователь изменил размеры окна с атрибутом
IMM. Это событие, по которому, вы снова выравниваете все элементы, которые зависят от размеров окна.Фокус ввода остается на данном окне, но управление передается другому исполняемому процессу для обработки таймерных событий. Система является модальной во время этого события.
Переключен атрибут TIMER. Это событие по которому выполняются какие-либо периодические действия, такие как отображение времени, или фоновая обработка записей для подготовки отчета, или их пакетная обработка.
Связанные с полем
события возникают, когда пользователь нажимает клавишу, по которой от программы может потребоваться выполнение особенных действий, связанных с данным экранным объектом.EVENT:Accepted EVENT:AlertKey EVENT:ColumnResize
EVENT:Contracted EVENT:Contracting EVENT:Drag
EVENT:Dragging EVENT:Drop EVENT:DroppedDown
EVENT:DroppingDown EVENT:Expanded EVENT:Expanding
EVENT:Locate (Mouse Events) EVENT:NewSelection
EVENT:PageDown EVENT:PageUp EVENT:PreAlertKey
EVENT:Rejected EVENT:ScrollBottom EVENT:ScrollDown
EVENT:ScrollDrag EVENT:ScrollTop EVENT:ScrollTrack
EVENT:ScrollUp EVENT:Selected EVENT:TabChanging
Пользователь ввел данные или сделал выбор и затем нажал клавишу TAB или щелкнул мышью, чтобы переключиться на другое поле. Это событие по которому следует выполнить какие-либо действия по проверке введенных данных.
Смотри
также: PROP:TouchedПользователь нажал горячую клавишу, заданную атрибутом ALRT экранного поля. Это событие, по которому выполняются запрошенные пользователем действия.
Размеры колонки на элементе управления LIST с параметром М в строке форматирования атрибута FORMAT были изменены пользователем.
Для окна-списка, у которого в строке форматирования присутствует шаблон “Т”, пользователь щелкнул на квадратике свертывания.
Окна-списки с модификатором дерева (
T) имеют поле Уровня (LONG) следующим за колонкой дерева. При начальном показе, если этот Уровень имеет отрицательное значение, ветвь свернута. (Замечание: Если дочерние ветви отсутствуют и уровень отрицателен, квадратик все равно будет отображать [+], поэтому без оснований не делайте каждый уровень отрицательным, а только для родительских ветвей, имеющих дочерние ветви).Когда пользователь щелкает мышью на квадратиках [+] [-] дерево соответственно раскрывается и сворачивается. Это не меняет знака Уровня, но зато посылает события “развернуто” и “свернуто”. В этом случае, вы можете вручную изменить знак уровня и сохранить свернутое состояние дерева.
Чтобы определить какая строка выбрана в текущий момент, опросите свойство окна-списка
PROPLIST:MouseDownRow.
Пример:
OF EVENT:Expanded
GET(PriorQ,
0 + ?List:PriorQ{PROPLIST:MouseDownRow} ) !Произведен клик мышью на знаке [+]!пока свойства являются строками, а GET перегружает (Q,String) вы
!вы должны преобразовать в число с 0+proplist:xxx (или другими методами)
!CHOICE(?List:PriorQ)) не будет работать пока не выбрана запись
!при кликании мышью на [+]
IF ~ERRORCODE()
PriorQ:Level=ABS(PriorQ:Level) !Развернуто, т.к. Уровень положительный
PUT(PriorQ)
END
OF EVENT:Contracted
GET(PriorQ, 0 + ?List:PriorQ{PROPLIST:MouseDownRow} )
!Произведен клик мышью на знаке [+]IF ~ERRORCODE()
PriorQ:Level = -ABS(PriorQ:Level) !свернуто, т.к. Уровень отрицательный
PUT(PriorQ)
END
Вы можете также развернуть/свернуть родительские ветви двойным нажатием на строке. Вы можете найти различия, изучая ?List:PriorQ{PROPLIST:MouseDownZone}=LISTZONE:ExpandBox или назначая “горячей” код MouseLeft2.
Для окна-списка, у которого в строке форматирования присутствует шаблон “Т”, пользователь щелкнул на квадратике свертывания. Если среди операторов, осуществляющих обработку данного события, встретится оператор CYCLE, то событие EVENT:Contracted не генерируется, а свертывание дерева отменяется. Система является модальной во время этого события.
Пользователь отпустил кнопку мыши над объектом -допустимым для завершения операции перетаскивания. Это событие генерируется для объекта, из которого пользователь “перетаскивает” данные. Это событие по которому программно осуществляется передача перетаскиваемых данных в принимающий объект.
Смотри
также: DRAGID, SETDROPIDПользователь выполняет операцию “перетаскивания” из объекта, имеющего атрибут DRAGID, и в данный момент курсор находится в пределах объекта, который потенциально может служить объектом-назначением в который производится перенос. Это событие генерируется для объекта, из которого пользователь “перетаскивает” данные. Это событие по которому можно изменить форму курсора мыши, чтобы обозначить возможность “отпускания”.
Смотри также:
SETCURSOR
Пользователь отпустил кнопку мыши над объектом, допустимым для завершения операции перетаскивания. Это событие генерируется для объекта, в который пользователь “перетаскивает” данные. Это событие по которому программно осуществляется прием перетаскиваемых данных в принимающий объект.
Смотри также:
DROPIDВ окне списка или комбинированном окне списка с атрибутом DROP, список раскрыт. Это событие, по которому вы можете скрыть другие поля, которые перекрывает выпадающий список, чтобы предотвратить беспорядок на экране, который отвлекает пользователя.
В окне списка или комбинированном окне списка с атрибутом DROP, пользователь нажал кнопку со стрелкой вниз. Это событие, по которому считываются записи при запросе на раскрытие списка.
Для окна-списка, у которого в строке форматирования присутствует шаблон “Т”, пользователь щелкнул на квадратике расширения.
Окна-списки с модификатором дерева (
T) имеют поле Уровня (LONG) следующим за колонкой дерева. При начальном показе, если этот Уровень имеет отрицательное значение, ветвь свернута. (Замечание: Если дочерние ветви отсутствуют и уровень отрицателен, квадратик все равно будет отображать [+], поэтому без оснований не делайте каждый уровень отрицательным, а только для родительских ветвей, имеющих дочерние ветви).Когда пользователь щелкает мышью на квадратиках [+] [-] дерево соответственно раскрывается и сворачивается. Это не меняет знака Уровня, но зато посылает события “развернуто” и “свернуто”. В этом случае, вы можете вручную изменить знак уровня и сохранить свернутое состояние дерева.
Чтобы определить какая строка выбрана в текущий момент, опросите свойство окна-списка
PROPLIST:MouseDownRow.
Пример:
OF EVENT:Expanded
GET(PriorQ, 0 + ?List:PriorQ{PROPLIST:MouseDownRow}
) !Произведен клик мышью на знаке [+]!пока свойства являются строками, а GET перегружает (Q,String) вы
!вы должны преобразовать в число с 0+proplist:xxx (или другими методами)
!CHOICE(?List:PriorQ)) не будет работать пока не выбрана запись
!при кликании мышью на [+]
IF ~ERRORCODE()
PriorQ:Level=ABS(PriorQ:Level) !Развернуто, т.к. Уровень положительный
PUT(PriorQ)
END
OF EVENT:Contracted
GET(PriorQ, 0 + ?List:PriorQ{PROPLIST:MouseDownRow} ) !Произведен клик мышью на знаке [+]
IF ~ERRORCODE()
PriorQ:Level = -ABS(PriorQ:Level) !вернуто, т.к. Уровень отрицательный
PUT(PriorQ)
END
Вы можете также развернуть/свернуть родительские ветви двойным нажатием на строке. Вы можете найти различия, изучая ?List:PriorQ{PROPLIST:MouseDownZone}=LISTZONE:ExpandBox или назначая “горячей” код MouseLeft2.
Для окна-списка, у которого в строке форматирования присутствует шаблон “Т”, пользователь щелкнул на квадратике расширения. Если среди операторов, осуществляющих обработку данного события, встретится оператор CYCLE, то событие EVENT:Expanded не генерируется, а раскрытие дерева отменяется. Система является модальной во время этого события.
В окне списка с атрибутом VCR пользователь нажал кнопку (?) VCR “поиск”. Это событие, по которому можно открыть вводное поле локатора, если оно было скрыто.
EVENT:MouseDown
На элементе управления REGION с атрибутом IMM является синонимом события EVENT:Accepted (только для большего удобства читаемости кода).
EVENT:MouseIn
Курсор мыши вошел в пределы поля типа REGION, имеющее атрибут IMM.
EVENT:MouseMove
Курсор мыши перемещается в пределах поля типа REGION, имеющего атрибут IMM.
EVENT:MouseOut
Курсор мыши покинул пределы поля типа REGION, имеющее атрибут
IMM.EVENT:MouseUp
На элементе управления REGION с атрибутом IMM была отпущена кнопка мыши.
EVENT:NewSelectionИзменился выбор, сделанный пользователем в объектах
LIST, COMBO, SHEET или SPIN (выделенная полоса-курсор переместилась). В поле ENTRY с атрибутом IMM, событие генерируется всякий раз, когда изменилось содержимое поля или переместился курсор. Представляет собой событие, по которому выполняется ряд действий, предназначенных для синхронизации состояния других элементов управления с выделенной в настоящее время записью в списке, или решается, что пользователь уже ввел все необходимые данные в ENTRY.В окне списка или комбинированном окне списка с атрибутом
IMM, пользователь нажал клавишу PgDn. Это событие, по которому по которому вы получаете следующую страницу при “перелистывании” списка.В окне списка или комбинированном окне списка с атрибутом
IMM, пользователь нажал клавишу PgUp. Это событие, по которому по которому вы получаете предыдущую страницу при “перелистывании” списка.Пользователь нажал горячую клавишу, заданную атрибутом ALRT экранного поля. Если в коде, предназначенном для обработки этого события, встретился оператор CYCLE, то до того, как будет сгенерировано событие EVENT:AlertKey, выполняется обычное библиотечное действие для этого сочетания клавиш. Это событие позволяет определять, следует ли выполняет обычное библиотечное действие при нажатии клавиш, или нет (помимо той обработки, что задана текстом, написанным “под событием” EVENT:A
lertKey). Система является модальной во время этого события.Пользователь ввел данные, не соответствующие шаблону поля или значение в поле SPIN, выходящее за границы допустимого диапазона. Процедура REJECTCODE возвращает причину, по которой отвергаются введенные пользователем данные, а для того, чтобы прочитать с экрана данные можно использовать свойство PROP:ScreenText. Это событие, по которому вы оповещаете пользователя о сути ошибки, сделанной им при вводе.
В окне списка или комбинированном окне списка с атрибутом IMM, пользователь нажал сочетание клавиш CTRL+PGDN. Это событие, по которому вы получаете последнюю страницу при “перелистывании” списка.
В окне списка или комбинированном окне списка с атрибутом IMM, пользователь попытался переместить выделенную ниже последнего на экране элемента списка. Это событие, по которому по которому вы получаете следующую запись при “перелистывании” списка или просто перемещает выделенный курсор, когда нет нужны получать другую запись.
В объекте LIST или COMBO с атрибутом IMM, пользователь перемещает “бегунок” линейки скроллинга, и только отпустил кнопку мыши. Это событие, по которому вы динамически прокручиваете выводимые записи, основываясь на текущем значении свойства PROP:VScrollPos.
В окне списка или комбинированном окне списка с атрибутом IMM, пользователь нажал сочетание клавиш CTRL+PGUP. Это событие, по которому вы получаете первую страницу при “перелистывании” списка.
В объекте LIST или COMBO с атрибутом IMM, пользователь перемещает “бегунок” линейки скроллинга. Это событие, по которому вы динамически прокручиваете выводимые записи, основываясь на текущем значении свойства PROP:VScrollPos.
В окне списка или комбинированном окне списка с атрибутом IMM, пользователь попытался переместить выделенную выше первого на экране элемента списка. Это событие, по которому по которому вы получаете предыдущую запись при “перелистывании” списка или просто перемещается выделенный курсор, когда нет нужды получать другую запись.
Объект получает фокус. Это событие по которому вы можете выполнить любой код инициализации данных.
Это модальное событие помещается в очереди оконных событий перед EVENT:Selected. Если при обработке этого события циклом ACCEPT выполняется оператор CYCLE в коде обработки этого события, EVENT:SELECTED не генерируется. Для получения метки соответствия поля для поля, которое должно быть выбрано, используется функция FIELD().
EVENT:Selecting
не выполняется перед генерацией EVENT:Selected, если выбран пункт меню с атрибутом IMM, потому что в этом случае EVENT:Selected является модальным.
Установка начального фокуса в поле переместится от оператора OPEN(Window) до оператора DISPLAY (который также неявно вызывается из ACCEPT). Поэтому, если нет явного оператора DISPLAY между OPEN и ACCEPT, EVENT:Selecting сгенерируется перед первым событием EVENT:Selected.
Если же оператор DISPLAY вызывается перед циклом ACCEPT, первое событие EVENT:Selected генерируется без предыдущего события EVENT:Selecting, потому что ACCEPT-цикл не исполнен.
В объекте
SHEET фокус собирается перейти на другой лист. Это событие по которому вы можете выполнить любые возможные вспомогательные действия для листа с которого переходит фокус.