Студия/Визуальные события

From SunFlurry wiki
Jump to: navigation, search

Визуальные события, описанные в этой статье, отличаются от обычных предопределенных событий языка, они не являются обычными функциями, а располагаются внутри формы и привязаны к форме или визуальному элементу, в зависимости от типа события. Для редактирования таких событий используется редактор форм Студии. Редактирование событий инициируется на закладке "события", при этом визуальный элемент, исходный код события которого необходимо изменить, должен быть выделен. Если требуется изменить исходный код события самой формы, необходимо, чтобы ни один из элементов не был выделен. Большинство событий формы, описанных здесь, могут вызываться несколько раз, если они описаны в подчиненных формах (на закладках группы страниц с закладками или в макросах). К примеру, событие OnOpen вызывается для всех подчиненных форм последовательно, а затем для основной формы, если хоть один из обработчиков события возвратит 0, загрузка формы будет остановлена.

Переменные, передаваемые в тело событий, а также принимаемые назад варьируются для каждого из событий, их наименования фиксированы и не могут быть изменены, в отличие от предопределенных функций, где наименования аргументов задает разработчик. Для всех событий всегда присутствует переменная Result, часто играющая роль результата события, однако, ее функция также зависит от конкретного события.

Визуальные события делятся на асинхронные и прерывающие. Описание каждого события содержит его тип. Принципиальная разница между этими двумя типами следующая:

  • Асинхронные события не могут быть инициированы, когда текущий поток уже занят исполнением кода. Обычно такие события выполняют длительные операции, типа подсчета данных или формирования отчета. К примеру, событие OnClick для кнопок является асинхронных событием и может выполнить исходных код, который формируется отчет. Асинхронные события также с легкостью могут изменять пользовательский интерфейс или выполнять любые другие операции.
  • Прерывающие (ожидающие или блокирующие) события могут приостановить текущее выполнение асинхронного события и выполнить свой код "вне очереди", после чего выполнение асинхронного события продолжится с того места, где оно было прервано. При инициации такого события, инициированного графическим интерфейсом, последний будет ожидать окончания его выполнения, после чего будет готов снова отвечать на запросы пользователя. Такое поведение связано с тем, что ответ или действие прерывающих событий требуется для продолжения. К примеру, при попытке сохранить строку в строчной части документа, программа события OnBeforeElementSaved решает, корректно ли заполнена строка, и, если что-то заполнено некорректно, возвращает ответ отказа, и операция сохранения отменяется, пользователю необходимо проверить, что он сделал не так и повторить попытку. Из-за того, что графический интерфейс находится в ожидании окончания прерывающего события, оно должно быть выполнено, как можно быстрее, чтобы графический интерфейс отвечал на команды пользователя. В связи с этим запуск длительных обработок во время выполнения таких событий не является правильным подходом. К примеру, в прерывающем (ожидающем) событии OnOpen неправильно будет выполнять формирование отчета, даже если отчет должен быть сформирован сразу после загрузки формы, вместо этого можно воспользоваться функцией InvokeEventAsync или асинхронным событием OnTimer, чтобы инициировать формирование. Прерывающее событие не может быть выполнено, если:
    • Другое прерывающее событие уже выполняется в данный момент.
    • Асинхронным событием инициирован режим транзакции (транзакция не может быть активна, когда поток находится в режиме ожидания пользователя и не исполняет какой-либо код).
    • Форма не полностью инициализирована или уже удалена (деинициалирована).

Существует также особая категория прерывающих событий -- события-выражения. Данные события не могут содержать конструкции языка, а являются вычисляемыми выражениями, результат которых будет возвращен, как результат исполнения события (пример -- OnGetCaption).

Ниже дана таблица с кратким описанием и ссылками на статьи всех доступных визуальных событий.

Имя события Тип события Применимость Аргументы Описание
OnOpen Прерывающее Форма, подчиненные формы Param (не всегда), Option (не всегда), ModalResult (не всегда) Событие, возникающее в момент открытия формы до ее полной инициализации, во время выполнения этого события форма все еще не видна на экране. Если во время события произойдет необработанное исключение или будут вызваны функции, типа Form.Close, Form.Destroy, загрузка формы будет остановлена и будет произведена попытка закрытия модуля.
OnReopen Прерывающее Форма, подчиненные формы NewParam, NewOption Событие, возникающее в момент попытки открытия уже существующей свободной формы (к примеру, журнала), вызванной с помощью LoadModule со способом вызова равным 1 (форма будет активирована, событие OnOpen повторно вызвано не будет, однако, будет вызвано данное событие). Форма уже имеет флаг полной инициализации в момент выполнения этого события.
OnClose Прерывающее Форма, подчиненные формы Result Событие, возникающее в момент закрытия формы. Обработчик события может отменить попытку закрыть форму.
OnTimer Асинхронное Форма, подчиненные формы Событие, возникающее с периодичностью, указанной в переменной OnTimerInterval. Событие выполняется только в моменты, когда поток не занят другими обработками и ожидает действий оператора.
OnSaveRequest Прерывающее Форма, подчиненные формы Событие, возникающее при попытке пользователя или системы сохранить содержимое формы (к примеру, с помощью кнопки "дискета" на панели инструментов). Система не будет самостоятельно сохранять открытый объект базы данных, даже если это событие не задано, программе необходимо выполнить фрагмент, типа Form.Object.Save() для сохранения объекта при нажатии на кнопку или в подобных случаях.
OnStatusChange Прерывающее Форма, подчиненные формы Событие, вызываемое при возникновении локальных изменений на форме или изменении объекта, редактируемого с помощью формы. К примеру, событие возникает при записи редактируемого элемента (Form.Object.Save()) или его пометке на удаление. Событие может быть использовано для обновления заголовка формы или каких-либо индикаторов на ней.
OnTaskbarMenuClick Асинхронное Форма Index, Text, Value, Result Событие, возникающее после того, как пользователь выберет пункт из встроенного меню на кнопке панели задач. Меню может быть задано программно, если меню не задано, кнопка меню не будет показана. Для задания меню см. атрибут TaskbarMenu.
OnMessage Прерывающее Форма CallerThread, CallMode, Message, Param, Option, Result Событие, возникающее при получении формой сообщений, отсылаемых с помощью функций SendMessageToForm, PostMessageToForm и пр.
OnSaveSettings Прерывающее Форма SetName, FolderName, Result Событие, возникающее до автоматического (либо по требованию пользователя) сохранения установок формы в файл установок на сервере. В понятие установок входят значения полей редактирования, флажков, тегов, позиций таблиц и пр. Автоматическое сохранение установок производится только для форм с флажком IsAutoSaveLoadSettings. Элементы, входящие в файл установок, должны иметь непустое поле Name (позиции таблиц и теги также записываются для любых элементов, связанных с базой данных).
OnLoadSettings Прерывающее Форма SetName, FolderName, Result Событие, возникающее до автоматической (либо по требованию пользователя) загрузки установок формы из файла установок на сервере. В понятие установок входят значения полей редактирования, флажков, тегов, позиций таблиц и пр. Автоматическая загрузка установок производится только для форм с флажком IsAutoSaveLoadSettings. Элементы, входящие в файл установок, должны иметь непустое поле Name (позиции таблиц и теги также загружаются для любых элементов, связанных с базой данных).
OnAfterLoadSettings Прерывающее Форма Событие, возникающее после загрузки установок формы из файла установок на сервере.
OnGetCaption Прерывающее, выражение Текстовое поле, Кнопка, Группа элементов Событие, позволяющее получить заголовок элемента программно. Система вызывает событие автоматически для получения заголовка при прорисовке элемента на экране. Событие должно быть занимать минимальное время исполнения, иначе обновление формы может быть замедлено.
OnClick Асинхронное Текстовое поле, Кнопка, Флажок, Переключатель, Группа элементов Событие, возникающее при клике по элементу или нажатии на кнопку (в т.ч. с помощью клавиатуры).
OnChangeOrClick Прерывающее Список значений, Группа страниц с закладками, Таблица значений, Дерево значений Событие, возникающее при визуальном изменении (перемещении курсора) текущей строки, закладки или столбца элемента.
OnDoubleClick Асинхронное Текстовое поле, Список значений, Группа элементов, Таблица значений, Внедренная электронная таблица, Дерево значений Событие, возникающее при двойном клике левой клавишей мыши по элементу либо при нажатии Enter в таблице значений.
OnRightClick Асинхронное, Прерывающее (внедренная электронная таблица) Текстовое поле, Редактируемое поле, Кнопка, Флажок, Переключатель, Поле со списком, Список значений, Группа элементов, Группа страниц с закладками, Таблица значений, Внедренная электронная таблица, Дерево значений Result (не всегда) Событие, возникающее при клике правой клавишей мыши по элементу.
OnAttachedButtons Прерывающее Текстовое поле, Редактируемое поле, Поле со списком, Список значений, Группа страниц с закладками, Таблица значений, Внедренная электронная таблица, Дерево значений Index, Method, Object, Result Событие, возникающее при нажатии на связанный элемент (саму кнопку или дополнительную кнопку выбора из меню). Событие работает как для линейных, для табличных элементов, так и при редактировании ячеек таблицы или электронной таблицы.
OnBeforeChange Прерывающее Редактируемое поле, Поле со списком Key, Modifiers, Result Событие, возникающее до принятия нажатия клавиши (или комбинацию клавиш) элементом. Нажатие может быть проигнорировано, если событие возвратит соответствующий результат. Для табличных элементов используется событие OnKeyPress.
OnAfterChange Прерывающее Редактируемое поле, Поле со списком Событие, возникающее после принятия нажатия клавиши (или комбинацию клавиш), либо после какого-либо другого изменения элемента (выбора объекта для полей имеющих тип объекта базы данных, изменения даты с помощью календаря для полей, имеющих тип даты и т.п.).
OnEnter Прерывающее Редактируемое поле, Флажок, Переключатель, Поле со списком, Список значений, Таблица значений, Внедренная электронная таблица, Дерево значений Событие, возникающее в момент получения фокуса (активации) элементом диалога.
OnExit Прерывающее Редактируемое поле, Флажок, Переключатель, Поле со списком, Список значений, Таблица значений, Внедренная электронная таблица, Дерево значений IsChanged, Result Событие, возникающее в момент потери фокуса (деактивации) элементом диалога. Потеря фокуса может быть проигнорирована, если событие возвратит соответствующий результат.
OnKeyPress Прерывающее Форма, Список значений, Таблица значений, Дерево значений Key, KeyCombo, Char, Result Событие, возникающее при нажатии на клавишу клавиатуры, когда текущий элемент или форма активны. Не все комбинации могут быть пойманы в этом событии. Для полей используется событие OnBeforeChange.
OnBeforeSelect Прерывающее Редактируемое поле, Список значений, Таблица значений, Внедренная электронная таблица Method, Journal, Module, FormName, OutParam, OutOption, Flags, Filters, SortOrder, Columns, CustomSelectList, Result Событие, возникающее в момент выбора элемента справочника или документа в реквизит диалога или ячейку таблицы (к примеру, при нажатии на связанный элемент ".."). Позволяет изменить свойства диалога выбора, который может быть представлен выпадающей таблицей или отдельным окном.
OnBeforeEditObject Прерывающее Редактируемое поле, Поле со списком, Список значений, Таблица значений, Внедренная электронная таблица Object, Method, Module, FormName, OutParam, OutOption, Result Событие, возникающее до открытия формы редактирования (или просмотра) объекта (при нажатии на связанные элементы _AB_INFO или _ABB_NEWBASED). Позволяет изменить открываемую по умолчанию форму для редактирования на требуемую или запретить открытие формы.
OnGetVisualProperties Прерывающее Поле со списком, Список значений Index, ColumnIndex, Font, BackColor, IconIndex Событие, возникающее до прорисовки пункта меню или элемента списка. Вызывается для получения визуальных параметров (таких как цвет, шрифт и пр.) для элемента. Для больших списков может замедлить обновление интерфейса, рекомендуется пользоваться методами типа Icon.
OnGetCellVisualProperties Прерывающее Таблица значений Index, Font, BackColor, IconIndex Событие, возникающее до прорисовки ячейки таблицы. Вызывается для получения визуальных параметров (таких как цвет, шрифт и пр.) для ячейки. Для больших таблиц может замедлить обновление интерфейса, рекомендуется пользоваться методами Icon, BackgroundColor, FontColor, FontStyle.
OnInitCombobox Прерывающее Поле со списком ComboList Событие, позволяющее заполнить элементы поля со списком до начала работы с ним. Возникает во время загрузки формы до вызова событий OnOpen.
OnBeforeEditLine Прерывающее Список значений LineType, Result Событие, возникающее до начала редактирования строки списка, позволяет разрешить или запретить редактирование.
OnAfterEditLine Прерывающее Список значений IsChanged, Value, Result Событие, возникающее в момент окончания редактирования строки списка, позволяет сохранить или запретить изменения, а также позволяет изменить сохраняемое в список значение.
OnChecking Прерывающее Список значений, Таблица значений Index, ColumnIndex, Result Событие, возникающее в момент (до изменения) установки или снятия флажка в строке списка или таблицы. Позволяет разрешить или запретить установку флажка.
OnLeafChecking Прерывающее Дерево значений Leaf, Result Событие, возникающее в момент (до изменения) установки или снятия флажка в элементе дерева. Позволяет разрешить или запретить установку флажка.
OnBeforeResize Прерывающее Разделитель групп элементов NewSize, Result Событие, возникающее при попытке пользователя передвинуть разделитель. Позволяет запретить или разрешить перемещение.
OnAfterResize Прерывающее Разделитель групп элементов Событие, возникающее после передвижения разделителя и изменения размеров областей разделения формы.
OnAfterNewElementCreated Прерывающее Таблица значений IsCopied, Element, Line, Result Событие, возникающее до начала редактирования нового элемента БД таблицы или строки строчной части элемента. Событие вызывается только для таблиц, связанных со строчной частью редактируемого объекта или таблиц, отображающих элементы справочника или документы, когда их редактирование происходит непосредственно в таблице (форма редактирования не открывается). Событие позволяет запретить создание новой строки (или нового объекта).
OnBeforeElementSaved Прерывающее Таблица значений Element, Line, Result Событие, возникающее непосредственно перед записью элемента БД в таблице элементов, либо строки в строчной части элемента. Событие вызывается только для таблиц, связанных со строчной частью редактируемого объекта или таблиц, отображающих элементы справочника или документы, когда их редактирование происходит непосредственно в таблице (форма редактирования не открывается). Событие позволяет запретить сохранение строки (или объекта).
OnAfterElementSaved Прерывающее Таблица значений Element, Line Событие, возникающее непосредственно после записи элемента БД в таблице элементов, либо строки в строчной части элемента. Событие вызывается только для таблиц, связанных со строчной частью редактируемого объекта или таблиц, отображающих элементы справочника или документы, когда их редактирование происходит непосредственно в таблице (форма редактирования не открывается).
OnBeforeEditCell Прерывающее Таблица значений LineType, Result Событие, возникающее до начала редактирования ячейки таблицы. Позволяет запретить или разрешить редактирование ячейки.
OnAfterEditCell Прерывающее Таблица значений IsChanged, Value, Result Событие, возникающее в момент окончания редактирования ячейки таблицы (т.е., при потере фокуса редактором ячейки). Позволяет запретить или разрешить потерю фокуса редактором ячейки.
OnGetRightClickMenu Прерывающее Таблица значений ResultList, Result Событие, возникающее до вывода на экран всплывающего меню, ассоциированного с текущей таблицей, вызываемого нажатием правой клавиши мыши. Событие позволяет изменить меню по умолчанию.
OnBeforeRefresh Прерывающее Таблица значений Result Событие, возникающее до обновления таблицы из БД (даже при автообновлении). Позволяет выполнить запрос на обновление программно, если обновление таблицы происходит нестандартным образом.
OnBeforeLoadElements Прерывающее Таблица значений Result Событие, возникающее перед загрузкой новых строк в табличный элемент. Позволяет подменить стандартную загрузку желаемой. Не вызывается для фиксированных строк таблицы (структуры родительских папок), которые, при наличии, зависят от атрибута FolderElement и будут уже добавлены в таблицу на момент вызова.
OnInitLine Прерывающее Таблица значений IndexFrom, IndexTo Событие, возникающее после загрузки диапазона новых строк в табличный элемент. Если задано, событие OnShowLine, данное вызываться не будет. Используется для заполнения полей, не принадлежащих базе данных, а также любых других изменений.
OnShowLine Прерывающее Таблица значений IndexFrom, IndexTo Событие, вызываемое для начальной инициализации строк, выводящихся на экран. Не будет вызвано, если задано событие OnInitLine. Используется для заполнения полей, не принадлежащих базе данных, а также любых других изменений. В отличие от OnInitLine, событие выполняется для строк, выводящихся на экран, а не для всех загруженных строк. Это может ускорить вывод таблицы, но замедлить навигацию в ней, что выгоднее для больших таблиц, не связанных с базой данных или строчных частей, имеющих большое количество строк.
OnGetFormNameForOperation Прерывающее Таблица значений Index, Journal, Module, FormName, ControlName, OutParam, OutOption, Result Событие, возникающее при необходимости получить имя модуля и формы для выполнения операции открытия таблицы или журнала. Вызывается для операций, отличающихся от редактирования объектов (при редактировании объектов вызывается OnBeforeEditObject) и открытия формы для выбора объектов (при выборе объектов вызывается OnBeforeSelect), к примеру, при нажатии на связанные элементы _ABB_MOVE, _ABB_OPENCHILDREN или _ABB_OPENPARENT. Позволяет изменить открываемую по умолчанию форму на требуемую или запретить открытие формы.
OnMoveToFolder Прерывающее Таблица значений Element, Folder, Result Событие, возникающее в момент интерактивного перемещения элемента в другую папку. Позволяет запретить или разрешить перемещение.
OnAfterFilterChange Прерывающее Таблица значений Событие, возникающее после изменения быстрого фильтра в столбике таблицы. Событие будет вызываться только для таблиц, не связанных с базами данных, с установленной опцией IfQFiltersAlwaysAllowed.
OnAfterSorting Прерывающее Таблица значений Событие, возникающее после визуального изменения сортировки таблицы.
OnBeforeEdit Прерывающее Внедренная электронная таблица EditMode, ObjectType, ObjectIndex, Line, Column, AttButtons, EditValue, EditMask, Result Событие, возникающее до начала редактирования ячейки или объекта встроенной таблицы. Если данное событие не задано, будет вызвано локальное, а затем глобальное событие OnBeforeEdit, которое также вызывается для свободных таблиц.
OnAfterEdit Прерывающее Внедренная электронная таблица EditMode, ObjectType, ObjectIndex, Line, Column, IsChanged Событие, возникающее после окончания редактирования ячейки или объекта встроенной таблицы. Если данное событие не задано, будет вызвано локальное, а затем глобальное событие OnAfterEdit, которое также вызывается для свободных таблиц.
OnDataChange Прерывающее Внедренная электронная таблица Событие, возникающее при изменении любых данных в таблице.
OnSelectionChange Прерывающее Внедренная электронная таблица SelectType Событие, возникающее при изменении выделенной области таблицы.
OnInitLeaf Прерывающее Дерево значений Leaf Событие, вызываемое для начальной инициализации загруженных элементов дерева. Система сама следит за тем, чтобы это событие было вызвано для каждой ветки всего один раз.
<Событие OLE> Прерывающее OLE-объект Зависят от объекта и события Событие объекта OLE, помещенного на форму. Система описывает набор переменных события, однако, для полного его описания необходимо обратиться к документации по конкретному объекту.