Особенности работы с различными экземплярами окон
Имеется возможность создавать несколько экземпляров одного окна-шаблона,
структура которого описана в WDO-файле. Каждый
экземпляр окна после его создания существует независимо другого.Любое окно имеет три имени:
оригинальное
имя, назначенное имя,
рабочее имя.
Общее для всех экземпляров:
- Контекст окна генерится из оригинального имени, т.е.
одинаков для всех экземпляров окна.
- "Отладка событий ... в текущем и подчиненных окнах" относится
именно к указанному экземпляру
окна, т.е. одному из клонов или оригиналу.
- Свойство FORM_WINDOW.Name - возвращает рабочее имя окна,
FORM_WINDOW.OriginalName
- оригинальное имя. GE_CURWIN работает с рабочим именем окна.
- В качестве имени справочного (FORM_FIELD.OwnerWindowOriginalName)
и подчиненного (FORM_ZONE.SubwindowOriginalName) окна всегда,
в том числе и в WED, указывается оригинальное имя.
- Каждый экземпляр окна имеет собственный набор
зонных переменных.
Все экземпляры можно разделить на 2 категории:
- Хранимые. Экземпляры окон, структура которых хранится в системе в течение всего сеанса
работы после их загрузки
- при их закрывании они переходят в состояние
подготовленное окно
- информация о них сохраняется в SES-файле
(расположение, палитра)
- загрузка таких окон - это получение структуры окна из WDO-файла на
диске, что сопровождается событиями
OnInitializeWindow и
OnInitializeZoneFilters
- являются прототипами для клонов, которые в
момент создания наследуют из них все свойства, в том числе и установленные
программно
Подразделяются на
- Окно-оригинал - это главный экземпляр окна,
больше одного такого существовать не может. Его рабочее имя совпадает с назначаемым и
с оригинальным.
- Окно-копия - экземпляр окна, которому при загрузке
присвоили специфическое назначаемое имя. Только этим окно-копия
и отличается от окна-оригинала. Назначаемое имя может отличаться от
оригинального только наличием суффикса. Рабочее имя окна-копии совпадает с назначаемым.
Назначаемое имя можно присвоить окну, указав его во
втором параметре методов FORM_WINDOWS.Load()
и FORM_WINDOWS.LoadBlank(),
FORM_WINDOW.Interchange(),
либо в свойстве FORM_ZONE.SubwindowAssignedName,
а также указав универсальное
имя в методах FORM_WINDOWS.Load()
и FORM_WINDOWS.LoadBlank(),
либо в параметре опции запуска видеопроцесса.
Процесс Ask выполняется на копии окна, назначаемое имя которого
вычисляется автоматически: отличается от оригинального имени добавлением суффикса '<Ask>', а если процесс Ask
выполняется для поля, участвующего в связи, ведущей в собственный файл БД, то назначенное имя имеет суффикс '<Ask_' <имя
поля, для которого сделан Ask> '>'. Зависимые и справочные окна
окна-копии - тоже копии: они
автоматически наследуют суффикс назначаемого имени из родительского окна FORM_WINDOW.ParentZone. Для любого окна можно открыть много копий с
различными назначаемыми именами. При
повторном открытии окна-копии, а также при доступе к нему с помощью
VISIBLE_WINDOWS.Item(),
FORM_WINDOWS.Item(),
FORM_WINDOWS.Load()
и т.п., его экземпляр разыскивается среди загруженных окон
по назначаемому имени. Назначаемые имена нужно формировать добавлением к оригинальному буквенно-цифрового
суффикса в угловых скобках. Например,
назначенное имя окна Staff может быть таким: Staff<MyCopy17>. Не рекомендуется
формировать назначаемое имя по
принципу имен окон-клонов.
- Одноразовые. Экземпляры окон, структура которых хранится в системе только когда они
открыты - при их закрывании они уничтожаются:
- Окно-клон - экземпляр окна, у которого рабочее
имя автоматически генерируется из назначенного путем добавления суффикса '<'<Номер>'>',
где Номер - это очередное числовое значение сквозного счетчика клонов любого
окна. Счетчик ведется в пределах сеанса. Например, клон оригинального окна Staff может иметь рабочее имя Staff<17>,
а клон копии Staff<Copy> - Staff<Copy><21>. Одновременно может
быть открыто неограниченное
количество клонов. Особенности работы с клонами:
- Чтобы запустить видеопроцесс в окне-клон, в опции запуска перед именем окна без
разделителей нужно указать символ '>'. Здесь
есть особенности:
- >Имя_окна - означает клон окна Имя_окна.
- >@ - означает клон подчиненного окна,
номер зоны при этом не указывается, берется зона 0, т.е. панель
- >@FileName - также как и @FileName
означает Browse-окно для файла FileName. Это
НЕ клон
- >. - также как и просто . означает
текущее окно, НЕ клон
- Опция Ask для
ручного и автоматического Ask вообще не имеет параметров. Имя Ask-окна
вычисляется по имени справочного файла или из свойств
FORM_FIELD.OwnerWindowOriginalName и
FORM_FIELD.OwnerZoneNumber,
заданных программно или в WED.
Единственный символ '>' в параметре этой опции означает открывать клон
Ask-окна.
- Запуск видеопроцесса на клоне окна всегда порождает новое
окно-клон. Например, используя опцию Edit(>@)
можно войти в редактирование нескольких (очевидно, разных) записей
одного и того же файла, при этом каждая запись будет редактироваться
в отдельном окне - клоне подчиненного окна.
Последовательное выполнение опции View(>Staff
1) несколько раз создаст столько же окон клонов окна
Staff с процессом
View в первой зоне.
-
Если окно-прототип уже загружено, то нужный клон создается в памяти
копированием с него со всеми его свойствами, в том числе установленными
программно.
OnInitializeWindow для клона
не выполняется. Если окно-прототип не было загружено, то оно предварительно
загружается по обычному правилу загрузки хранимого окна.
- Свойство FORM_WINDOW.Clone позволяет
получить информацию является ли окно клоном, а также преобразовать
окно-оригинал в клон.
- Клон имеет уровень изолированности не ниже
FORM_WINDOW.Isolated_In,
см. FORM_WINDOW.Isolated
- У клона подчиненные и справочные окна - по умолчанию не клоны.
Чтобы открыть подчиненное окно-клон нужно в опции указывать это явно.
- Принудительно зависимое окно можно открыть в том числе и к
окну-клону, т.к. в параметрах опции
указывается именно рабочее имя окна, к которому будет подчинено
зависимое. Но использовать эту возможность можно только из
ASL-программы, указав в качестве главного одно из имеющихся на экране
окон. А при разработке mnu-файла указать рабочее имя окна-клона
невозможно, т.к. это имя заранее неизвестно.
- Если в выражениях видеополей окна присутствует хотя бы одна
перманентная переменная, то запрещено открывать клоны такого окна. Причина в
том, что несколько окон-клонов будут неправильно работать с единственной для
всех них перманентной переменной. Иными словами, клоны окон создаются, а
клоны перманентных переменных - нет. Использование
зонных переменных
подобной проблемы не дает.
- Заголовок клона
отображается в фигурных скобках:
- К заголовку окна-клона слева добавляется " {", а справа "} ".
Концевые пробелы в заголовке окна при этом не
меняются. Напомню, что концевые пробелы в
заголовке окна
- задаются разработчиком в WED-е. Ни WED, ни V32 их не отсекает и не
добавляет
- WINDOW.Title
по записи
автоматически добавляет по 1 концевому пробелу к заголовку окна, если
этих пробелов не было
- При активизации пользовательского фильтра в конец заголовка окна
добавляется "[Ф] ". Для окон-клонов эта добавка идет после скобки, т.е.
выглядит так:
" { Заголовок } [Ф] "
- Эти фигурные скобки не являются частью текста заголовка, т.е.
WINDOW.Title по чтению
их не возвращает.
- Окна-клоны открываются на экране со смещением друг относительно друга,
т.е. "каскадом". Правило такое: среди всех клонов окна, включая оригинал,
система находит клон с наибольшим номером, и координаты следующего
окна-клона вычисляет со сдвигом от него вправо и вниз. А если в результате
правый нижний угол окна перестал вмещаться в консоль, то окно отображается в
самом левом верхнем углу консоли.
Если из ASL-программы выполняется
обращение к объекту-окну, которого уже не существует,
то если это окно было окном-оригиналом, выбрасывается
исключение 880, а если оно было клоном или Browse-окном, то
исключение 881.
Загрузка любого экземпляра окна выполняется с помощью методов FORM_WINDOWS.LoadBlank()
или FORM_WINDOWS.Load(),
либо опцией запуска видеопроцесса в этом окне. Если окно-оригинал уже
загружено, то повторная загрузка окна с диска выполняется только в случае
требования перезагрузки. Сначала указанный экземпляр окна разыскивается
среди загруженных. Если нашелся, то используется именно этот экземпляр со
всеми его программными установками.