Особенности работы с различными экземплярами окон

Имеется возможность создавать несколько экземпляров одного окна-шаблона, структура которого описана в WDO-файле. Каждый экземпляр окна после его создания существует независимо другого.

Любое окно имеет три имени: оригинальное имя, назначенное имя, рабочее имя.

Общее для всех экземпляров:

  1. Контекст окна генерится из оригинального имени, т.е. одинаков для всех экземпляров окна.
  2. "Отладка событий ... в текущем и подчиненных окнах" относится именно к указанному экземпляру окна, т.е. одному из клонов или оригиналу.
  3. Свойство FORM_WINDOW.Name - возвращает рабочее имя окна, FORM_WINDOW.OriginalName - оригинальное имя. GE_CURWIN работает с рабочим именем окна.
  4. В качестве имени справочного (FORM_FIELD.OwnerWindowOriginalName) и подчиненного (FORM_ZONE.SubwindowOriginalName) окна всегда, в том числе и в WED, указывается оригинальное имя.
  5. Каждый экземпляр окна имеет собственный набор зонных переменных.

Все экземпляры можно разделить на 2 категории:

  1. Хранимые. Экземпляры окон, структура которых хранится в системе в течение всего сеанса работы после их загрузки
    1. при их закрывании они переходят в состояние подготовленное окно
    2. информация о них сохраняется в SES-файле (расположение, палитра)
    3. загрузка таких окон - это получение структуры окна из WDO-файла на диске, что сопровождается событиями OnInitializeWindow и OnInitializeZoneFilters
    4. являются прототипами для клонов, которые в момент создания наследуют из них все свойства, в том числе и установленные программно

    Подразделяются на

    1. Окно-оригинал - это главный экземпляр окна, больше одного такого существовать не может. Его рабочее имя совпадает с назначаемым и с оригинальным.
    2. Окно-копия - экземпляр окна, которому при загрузке присвоили специфическое назначаемое имя. Только этим окно-копия и отличается от окна-оригинала. Назначаемое имя может отличаться от оригинального только наличием суффикса. Рабочее имя окна-копии совпадает с назначаемым. Назначаемое имя можно присвоить окну, указав его во втором параметре методов 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>. Не рекомендуется формировать назначаемое имя по принципу имен окон-клонов.
  2. Одноразовые. Экземпляры окон, структура которых хранится в системе только когда они открыты - при их закрывании они уничтожаются:
    1. Окно-клон - экземпляр окна, у которого рабочее имя автоматически генерируется из назначенного путем добавления суффикса '<'<Номер>'>', где Номер - это очередное числовое значение сквозного счетчика клонов любого окна. Счетчик ведется в пределах сеанса. Например, клон оригинального окна Staff может иметь рабочее имя Staff<17>, а клон копии Staff<Copy> - Staff<Copy><21>. Одновременно может быть открыто неограниченное количество клонов. Особенности работы с клонами:
      1. Чтобы запустить видеопроцесс в окне-клон, в опции запуска перед именем окна без разделителей нужно указать символ '>'. Здесь есть особенности:
        1. >Имя_окна - означает клон окна Имя_окна.
        2. >@ - означает клон подчиненного окна, номер зоны при этом не указывается, берется зона 0, т.е. панель
        3. >@FileName - также как и @FileName означает Browse-окно для файла FileName. Это НЕ клон
        4. >. - также как и просто . означает текущее окно, НЕ клон
        5. Опция Ask для ручного и автоматического Ask вообще не имеет параметров. Имя Ask-окна вычисляется по имени справочного файла или из свойств FORM_FIELD.OwnerWindowOriginalName и FORM_FIELD.OwnerZoneNumber, заданных программно или в WED. Единственный символ '>' в параметре этой опции означает открывать клон Ask-окна.
      2. Запуск видеопроцесса на клоне окна всегда порождает новое окно-клон. Например, используя опцию Edit(>@) можно войти в редактирование нескольких (очевидно, разных) записей одного и того же файла, при этом каждая запись будет редактироваться в отдельном окне - клоне подчиненного окна. Последовательное выполнение опции View(>Staff 1) несколько раз создаст столько же окон клонов окна Staff с процессом View в первой зоне.
      3. Если окно-прототип уже загружено, то нужный клон создается в памяти копированием с него со всеми его свойствами, в том числе установленными программно. OnInitializeWindow для клона не выполняется. Если окно-прототип не было загружено, то оно предварительно загружается по обычному правилу загрузки хранимого окна.

      4. Свойство FORM_WINDOW.Clone позволяет получить информацию является ли окно клоном, а также преобразовать окно-оригинал в клон.
      5. Клон имеет уровень изолированности не ниже FORM_WINDOW.Isolated_In, см. FORM_WINDOW.Isolated
      6. У клона подчиненные и справочные окна - по умолчанию не клоны. Чтобы открыть подчиненное окно-клон нужно в опции указывать это явно.
      7. Принудительно зависимое окно можно открыть в том числе и к окну-клону, т.к. в параметрах опции указывается  именно рабочее имя окна, к которому будет подчинено зависимое. Но использовать эту возможность можно только из ASL-программы, указав в качестве главного одно из имеющихся на экране окон. А при разработке mnu-файла указать рабочее имя окна-клона невозможно, т.к. это имя заранее неизвестно.
      8. Если в выражениях видеополей окна присутствует хотя бы одна перманентная переменная, то запрещено открывать клоны такого окна. Причина в том, что несколько окон-клонов будут неправильно работать с единственной для всех них перманентной переменной. Иными словами, клоны окон создаются, а клоны перманентных переменных - нет. Использование зонных переменных подобной проблемы не дает.
      9. Заголовок клона отображается в фигурных скобках:
        1. К заголовку окна-клона слева добавляется " {", а справа "} ". Концевые пробелы в заголовке окна при этом не меняются. Напомню, что концевые пробелы в заголовке окна
          1. задаются разработчиком в WED-е. Ни WED, ни V32 их не отсекает и не добавляет
          2. WINDOW.Title по записи автоматически добавляет по 1 концевому пробелу к заголовку окна, если этих пробелов не было
        2. При активизации пользовательского фильтра в конец заголовка окна добавляется "[Ф] ". Для окон-клонов эта добавка идет после скобки, т.е. выглядит так:
          " { Заголовок } [Ф] "
        3. Эти фигурные скобки не являются частью текста заголовка, т.е. WINDOW.Title по чтению их не возвращает.
      10. Окна-клоны открываются на экране со смещением друг относительно друга, т.е. "каскадом". Правило такое: среди всех клонов окна, включая оригинал, система находит клон с наибольшим номером, и координаты следующего окна-клона вычисляет со сдвигом от него вправо и вниз. А если в результате правый нижний угол окна перестал вмещаться в консоль, то окно отображается в самом левом верхнем углу консоли.

Если из ASL-программы выполняется обращение к объекту-окну, которого уже не существует, то если это окно было окном-оригиналом, выбрасывается исключение 880, а если оно было клоном или Browse-окном, то исключение 881.

Загрузка любого экземпляра окна выполняется с помощью методов FORM_WINDOWS.LoadBlank() или FORM_WINDOWS.Load(), либо опцией запуска видеопроцесса в этом окне. Если окно-оригинал уже загружено, то повторная загрузка окна с диска выполняется только в случае требования перезагрузки. Сначала указанный экземпляр окна разыскивается среди загруженных. Если нашелся, то используется именно этот экземпляр со всеми его программными установками.