Загадка про TabBar (с картинками)

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4562
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Загадка про TabBar (с картинками)

Сообщение finsoftrz »

У меня в менеджере окон используются 2 очереди - список потоков и список окон. Окно при открытии регистрируется под именем процедуры. Определение потока для программной передачи фокуса определяется по имени окна и, если предусмотрено, по идентификатору записи. Например, мы сформировали реестр накладных в виде list, щелкаем по строке и открываем в отдельном потоке экранную форму соответствующего документа. В документе щелкаем выбор реквизита из справочника. У нас поверх окна документа в том же потоке открывается окно справочника. Затем пытаемся из реестра еще раз открыть тот же документ, фокус перепрыгнет в уже открытый поток, хотя окно документа накрыто сверху окном справочника. Тут, правда, есть нюанс, к которому приходится привыкнуть. Я не нашел, как его обойти, и это не проблема клариона - на форуме по аксапте читал про аналогичное поведение окон. То есть при переключении фокуса в этом случае на верх всплывает только верхнее окно потока (в нашем случае окно справочника), лежащие под ним окна могут остаться скрытыми окнами из других потоков...

По автозапуску я у себя реализовал через локальную очередь в фрейме. Основная часть делается шаблонами, вручную может делаться наполнение очереди запускаемых потоков (и то не всегда).
В дочерних окнах на событии OpenWindow шлем фрейму событие post(4007,,1). Тут есть нюанс. Если процедура с mdi окном открыта в режиме автозапуска (то есть передаем набор параметров, программно жмем Сформировать, наполняем итогами кьюшки и показываем их пользователю), то событие на фрейм надо слать не на OpenWindow, а после отработотки бизнес-логики, иначе могут возникнуть конфликты. Во фрейме шаблонами определяем очередь для списка mdi окон, которые надо автоматически запустить при входе в программу:
Loc:WinMDIStartAvto byte
Loc:QueueMDIStartAvto queue, pre() !список mdi окон для автозапуска
Loc:ContrMDIStartAvto long
end
На пользовательское событие навешиваем обработчик:
of 4007 !автозапуск mdi окон
if Loc:WinMDIStartAvto=1
get(Loc:QueueMDIStartAvto,1)
if ~error()
delete(Loc:QueueMDIStartAvto)
if records(Loc:QueueMDIStartAvto)=0
Loc:WinMDIStartAvto=0
end
if Loc:ContrMDIStartAvto<0
post(event:accepted,Loc:ContrMDIStartAvto)
elsif Loc:ContrMDIStartAvto>0
post(Loc:ContrMDIStartAvto)
end
else
Loc:WinMDIStartAvto=0
end
end

Заполнение списка стартующих окон делаем вручную или шаблонами так (на событии OpenWindow фрейма):
Loc:ContrMDIStartAvto=?ZakazMenu !пакетный запуск
add(Loc:QueueMDIStartAvto)
Loc:ContrMDIStartAvto=?TovarView
add(Loc:QueueMDIStartAvto)

Loc:WinMDIStartAvto=1
post(4007)

Если открываем toolbox, то можно обойтись без этого, так как они в менеджере окон не регистрируются. На скрине при запуске открыты 4 toolbox и 4 обычных окна. Проблем не наблюдаю в c6 и в c10.
Вложения
threads.jpg
C6/C11, ШВС, tps/btrieve.
Ответить