Interchange


Членство

FORM_WINDOW

Синтаксис

PROCEDURE Interchange(OriginalName: STRING[];
                      [ AssignedName: STRING[] ]): FORM_WINDOW;

Описание

Объявляет, что данное окно должно быть заменено на окно с оригинальным именем OriginalName и назначаемым AssignedName, а если этот параметр не указан, назначаемое имя будет совпадать с оригинальным. Пустое значение в параметре OriginalName означает, что данное окно нужно закрыть, а новое не открывать.

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

  1. переключение из верхнего окна в подменяемое (опция GoToWin)
  2. закрытие подменяемого окна (опция CloseWin)
  3. открытие нового окна, на которое требовалось подменить (опция ShowWin, Edit и т.п.)
  4. переключение в верхнее окно (опция GoToWin)

Подменить можно не любое окно, а только если

  1. В его панельной зоне, непосредственно подчиненной окну, выполняется единственный процесс. Именно этот процесс будет запущен в новом окне. В панели верхнего окна допускает наличие пары видео-процессов ShowWin+Edit, в новом окне они запустятся оба. В других зонах исходного окна, очевидно подчиненных панели, а также в зависимых окнах подменяемого окна, могут выполняться процессы, но все они закроются при подмене окна, причем зависимые окна не переоткроются
  2. Ни в подменяемом окне, ни в его зависимых не идет процесс редактирования или вставки. Исключение составляет верхнее окно с единственным процессом редактирования в зоне непосредственно подчиненной окну.

Если в эти условия не выполняются в момент работы данного метода, то выбрасывается исключение 951. Если эти условия перестали выполняться к моменту собственно подмены окна, то подмена молча не выполняется, требование подмены снимается. Когда процесс переключения окна уже начался, то ошибка на одном из 4-х его этапов игнорируется, и последующие этапы все равно выполнятся.

До тех пор, пока реальной подмены окна не произошло, повторный вызов Interchange отменяет назначение предыдущего вызова Interchange.

Если назначаемое имя исходного окна, совпадает с назначаемым именем нового окна, то подмена окна выполняться не будет. В противном случае возможен бесконечный цикл: событие OnReposition - в нем Interchange для собственного окна - перезагрузка окна - снова OnReposition и т.д.

Если во время выполнения Interchang окно с назначаемым именем AssignedName уже загружено, но его оригинальное имя не совпадает с OriginalName, причем отличается не только регистром, то выбрасывается исключение 966.

Назначаемое имя от оригинального может отличаться только наличием суффикса, иначе выбрасывается исключение 978 с текстом "Оригинальное имя %s не совпадает с началом назначаемого имени %s".

Если Interchange подменяет верхнее окно, причем мастер окна и панельной зоны исходного окна совпадают с соответствующими мастерами нового окна, позиции этих мастеров при открытии нового окна скопируются из исходного в новое. Иначе позиция в новом окне определится по обычным правилам.

Метод может выполняться только для открытых окон, иначе исключение 942.

Аналог метода Interchange с единственным параметром вызывается для подчиненного окна при смене позиции в его панели, если в порождающей зоне выставлен флаг FORM_ZONE.HasVariousSubwindows.