AnyScreen (форсировали Неман Бонапартовы войска) - хроника войны

Clarion, Clarion 7

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

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

AnyScreen (форсировали Неман Бонапартовы войска) - хроника войны

Сообщение finsoftrz »

Вот такая проблемка нарисовалась. Реализуется функция открытия оконной процедуры один раз. Проверка ставится на пункт меню фрейма. Если процедура уже запущена, то фокус передается в ее поток. В anyscreen это делается через AnyScreen:SetActiveThread. Вот это работает, если щелкнуть в стандартном выпадающем меню. Если передать сообщение во фрейм из дочернего окна (через notify или post) и программно акцептовать нужный пункт меню, то приложение вешается. Причем иногда срабатывает. Разные пляски с бубном не дали решения. Если запускать AnyScreen:SetActiveThread не из фрейма, то тоже виснет (всегда).

Пришлось пока отключить данный функционал.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5036
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 11 раз
Поблагодарили: 46 раз

AnyScreen (форсировали Неман Бонапартовы войска) - хроника войны

Сообщение finsoftrz »

Еще, может пригодиться. Чтобы открываемое окно автоматически разместить по размеру клиентской области фрейма, и при этом не максимизировать его, надо 2 раза применить AnyScreen:ScaleWindow, отдельно для ширины и для высоты. Например, так.

Код: Выделить всё

         AnyScreen:ScaleWindow(%Window,1,1,0,FsAnyScreenMenuTreeWidth,0)
         AnyScreen:ScaleWindow(%Window,1,0,1,0,0)
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Губин Игорь
Шубуршун
Сообщения: 2480
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Благодарил (а): 3 раза
Поблагодарили: 25 раз

AnyScreen (форсировали Неман Бонапартовы войска) - хроника войны

Сообщение Губин Игорь »

finsoftrz писал(а): 20 Январь 2025, 13:58 Вот такая проблемка нарисовалась.
У меня делается через Notify, но без передачи фокуса. Всё работает устойчиво.

Проверка идёт через глобальную переменную, которая равна 0 или Thread() процедуры. Если 0, то никуда ничего не посылаем, если же не ноль, то посылаем сообщение и процедура обрабатывает его, перерисовывая свой экран. С перехватом фокуса на игрался, т.к. это не требуется по логике приложения.
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5036
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 11 раз
Поблагодарили: 46 раз

AnyScreen (форсировали Неман Бонапартовы войска) - хроника войны

Сообщение finsoftrz »

Можно подробнее?
Я из дочерней процедуры (конкретно из дерева вертикального меню) шлю notify+номер пункта меню во фрейм. Во фрейме обрабатываю, шлю event:accept на нужный пункт меню. По этому событию для определенных пунктов проверяю, запущена ли процедура (регистрируются в глобальной очереди). Если да, то передаю фокус в соответствующий поток через AnyScreen:SetActiveThread, если нет, то делаю start.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Губин Игорь
Шубуршун
Сообщения: 2480
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Благодарил (а): 3 раза
Поблагодарили: 25 раз

AnyScreen (форсировали Неман Бонапартовы войска) - хроника войны

Сообщение Губин Игорь »

finsoftrz писал(а): 20 Январь 2025, 14:29 Можно подробнее?
Я из дочерней процедуры (конкретно из дерева вертикального меню) шлю notify+номер пункта меню во фрейм. Во фрейме обрабатываю, шлю event:accept на нужный пункт меню. По этому событию для определенных пунктов проверяю, запущена ли процедура (регистрируются в глобальной очереди). Если да, то передаю фокус в соответствующий поток через AnyScreen:SetActiveThread, если нет, то делаю start.
У меня проще. В дочерней процедуре проверяется глобальная переменная. Если она ненулевая, то в этот поток посылается Notify.

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

Я бы посоветовал сделать так, если требуется запуск: в дочерней процедуре проверяется глобальная переменная, если она ненулевая, то сообщения посылаются основной процедуре, если же нулевая, то отдельное сообщение посылается в глобальный фрейм или выполняется элементарный Start и ставится цикл ожидания пока глобальная переменная станет ненулевой.
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5036
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 11 раз
Поблагодарили: 46 раз

AnyScreen (форсировали Неман Бонапартовы войска) - хроника войны

Сообщение finsoftrz »

Проблема не в отправке сообщений, а в работе AnyScreen:SetActiveThread. Нам надо программно сделать определённый поток активным. Другого способа вроде как нет. А AnyScreen:SetActiveThread у меня вешает приложение, если он вызывается в любом дочернем окне и через раз вешает, если вызывается во фрейме, кроме вызова непосредственно при ручном выборе в стандартном меню.

Ты используешь AnyScreen:SetActiveThread?
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Губин Игорь
Шубуршун
Сообщения: 2480
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Благодарил (а): 3 раза
Поблагодарили: 25 раз

AnyScreen (форсировали Неман Бонапартовы войска) - хроника войны

Сообщение Губин Игорь »

finsoftrz писал(а): 20 Январь 2025, 15:06 Ты используешь AnyScreen:SetActiveThread?
Нет. У меня где-то работает связка PROP:Active + AnyScreen:Display, но уже не помню где и отрабатывает ли...
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5036
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 11 раз
Поблагодарили: 46 раз

AnyScreen (форсировали Неман Бонапартовы войска) - хроника войны

Сообщение finsoftrz »

Вот такая схема кажись работает. Если определили, что оконная процедура запущена, то из фрейма шлем в нее событие, например, 2200. А в самой процедуре обрабатываем так:

Код: Выделить всё

     if event()=2200
        0{prop:active}=1
        AnyScreen:Display
        post(2201)
        cycle
     end    
     if event()=2201
        AnyScreen:SetActiveThread(thread(),0,0)
        AnyScreen:DisplayThread(0)
        cycle      
     end       
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5036
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 11 раз
Поблагодарили: 46 раз

AnyScreen (форсировали Неман Бонапартовы войска) - хроника войны

Сообщение finsoftrz »

Поправил код в предыдущем сообщение. Так вроде все корректно работает.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5036
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 11 раз
Поблагодарили: 46 раз

AnyScreen (форсировали Неман Бонапартовы войска) - хроника войны

Сообщение finsoftrz »

Что-то забыл, было ли. Попробовал запустить anyscreen сервер на windows 7, в report в html5 кракозябры. В виндовом клиенте норм. Тоже самое приложение с сервером на windows 10 в html5 клиенте норм. Может, кто сталкивался.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Губин Игорь
Шубуршун
Сообщения: 2480
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Благодарил (а): 3 раза
Поблагодарили: 25 раз

AnyScreen (форсировали Неман Бонапартовы войска) - хроника войны

Сообщение Губин Игорь »

finsoftrz писал(а): 06 Февраль 2025, 0:16 Может, кто сталкивался
Проверить локализацию в виндах. Системный язык, кодировку по-умолчанию...
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5036
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 11 раз
Поблагодарили: 46 раз

AnyScreen (форсировали Неман Бонапартовы войска) - хроника войны

Сообщение finsoftrz »

Не, это только pdf касается. Я сравнил файлы, созданные в win7 и win10. В них разные шрифты. В win7 Arial, в win10 CIDFont. TsPlus корректно pdf отображает. С ходу не удалось понять, как решить вопрос. Судя по всему, anyscreen под windows 7 не тестировали.
C6/C11, ШВС, tps/btrieve.
Ал
✯ Ветеран ✯
Сообщения: 1026
Зарегистрирован: 08 Июль 2005, 6:48
Откуда: Россия
Поблагодарили: 1 раз

AnyScreen (форсировали Неман Бонапартовы войска) - хроника войны

Сообщение Ал »

finsoftrz писал(а): 06 Февраль 2025, 9:00 Не, это только pdf касается. Я сравнил файлы, созданные в win7 и win10. В них разные шрифты. В win7 Arial, в win10 CIDFont. TsPlus корректно pdf отображает. С ходу не удалось понять, как решить вопрос. Судя по всему, anyscreen под windows 7 не тестировали.
Скорее всего используют (в anyscreen) для формирования pdf "функционал", который и вне anyscreen так же отрабатывает.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5036
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 11 раз
Поблагодарили: 46 раз

AnyScreen (форсировали Неман Бонапартовы войска) - хроника войны

Сообщение finsoftrz »

Ал писал(а): 07 Февраль 2025, 6:30
finsoftrz писал(а): 06 Февраль 2025, 9:00 Не, это только pdf касается. Я сравнил файлы, созданные в win7 и win10. В них разные шрифты. В win7 Arial, в win10 CIDFont. TsPlus корректно pdf отображает. С ходу не удалось понять, как решить вопрос. Судя по всему, anyscreen под windows 7 не тестировали.
Скорее всего используют (в anyscreen) для формирования pdf "функционал", который и вне anyscreen так же отрабатывает.
Во всяком случае, в обычном приложении на с63, в котором используется image2pdf, проблем нет. У anyscreen своя библиотека преобразования wmf в pdf, которая вызывается автоматически по завершению вывода report.
C6/C11, ШВС, tps/btrieve.
Ответить