Template:Load module stages

From SunFlurry wiki
Jump to: navigation, search
  • Если путь и наименование модуля указаны корректно, произойдет загрузка модуля и его выполнение. Если во время выполнения модуля произошло исключение, то дальнейшая загрузка произведена не будет, модуль будет закрыт, а с ним завершен поток, если модуль его создавал. На этом этапе новая кнопка на панели задач визуального клиента не создается.
  • Будет произведен запуск функции OnOpen с параметром, если он указан. Изменяя параметр, функция может изменить имя загружаемой формы. Если функция отсутствует, этот этап будет пропущен. Если функция возвратит ноль (либо вызовет исключение), дальнейшая загрузка произведена не будет, модуль будет закрыт, а с ним завершен поток, если модуль его создавал. Таким образом можно вызывать модули без наличия формы, как вызываются обычные функции (либо как невизуальный дополнительный поток, который завершится после выполнения требуемой работы). Однако, нужно понимать, что подобный вызов, происходит гораздо медленнее, чем вызов обычной функции даже для модулей, не порождающих дополнительный поток. На этом этапе новая кнопка на панели задач визуального клиента не создается.
  • Будет произведена попытка создания и начального заполнения формы с именем, заданным шестым аргументом (либо именем, возвращенным функцией OnOpen). Если форма с таким именем в пути вызова функции отсутствует, будет вызвано исключение, модуль будет закрыт, а с ним завершен поток, если модуль его создавал. На этом этапе новая кнопка на панели задач визуального клиента не создается, однако, рабочий поток находится в режиме ожидания, так как форму создает и заполняет визуальный поток. Для консольного клиента этот этап будет пропущен.
  • Будет произведен запуск функции OnPostOpen, таким же образом, как была вызвана функция OnOpen ранее.
  • Происходит этап показа и выполнения формы:
    • Для консольного клиента будет выполнена функция OnConsoleWork, при попытке выхода из которой будет вызвана функция OnExit, если последняя возвратит ноль, снова будет вызвана функция OnConsoleWork, иначе работа модуля будет закончена, и завершен поток, если модуль его создавал. Если функции OnConsoleWork в модуле не существует, работа модуля завершается без вызова OnExit.
    • Для визуального клиента происходит вывод на экран загруженной формы, создается кнопка на панели задач.
      • Происходит заполнение табличных элементов формы, полей, списков и прочего из базы данных. Вызываются визуальные события, типа OnInitLine и подобные.
      • Происходит инициализация особых режимов вызова и сопутствующих им данных, если это необходимо (к примеру, открытия родительского справочника и пр.)
      • Происходит вызов визуального события OnOpen, если оно задано на форме, шаблонах формы, закладках элементов формы.
      • Происходит позиционирование на требуемом элементе таблицы выбора, если таковой задан.
      • Происходит заполнение из базы данных элементов формы, которые не были обновлены из-за их изменения внутри OnOpen и ранее из-за изменения их параметров и фильтров. Таким образом происходит оптимизация загрузки, чтобы элементы не обновлялись при загрузке более одного раза, замедляя загрузку и увеличивая нагрузку на базу данных. Кроме того, все созданные ранее асинхронные события и вызовы функций выполняются последовательно на этом этапе (система задерживает их выполнение до полной инициализации формы, так как они могут использовать загруженные формой данные).
      • Создаются записи в журнале регистрации событий при открытии элементов базы данных, если это необходимо.
      • Освобождается ожидавший все этой время рабочий поток, который теперь может продолжить исполнение. В этот момент устанавливается внутренний флаг окончания загрузки формы и функция Form.IsFullyInitialized будет возвращать 1.
      • Если внутри событий была вызвана функция закрытия формы Form.Close, форма закрывается и завершается рабочий поток, если он был создан. Иначе, управление отдается пользователю и форма ожидает от него команд, внешних прерываний, внешних сообщений или событий типа OnTimer.