Keycode() не работает в IDLE процедуре
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Keycode() не работает в IDLE процедуре
Ну да, самый простой и самый надёжный путь -> шаблон.
C10, Win10x64
- ingasoftplus
- Ветеран
- Сообщения: 429
- Зарегистрирован: 26 Декабрь 2006, 17:07
- Откуда: Оттуда :)
- Благодарил (а): 91 раз
- Поблагодарили: 5 раз
Keycode() не работает в IDLE процедуре
Это кто вам такое сказал???Губин Игорь писал(а): ↑18 Ноябрь 2019, 10:54но разве keycode() как-то должен реагировать?!
Он же отрабатывает в активном окне!
- ingasoftplus
- Ветеран
- Сообщения: 429
- Зарегистрирован: 26 Декабрь 2006, 17:07
- Откуда: Оттуда :)
- Благодарил (а): 91 раз
- Поблагодарили: 5 раз
Keycode() не работает в IDLE процедуре
поток - тотже самый.
ЕЩЕ раз - в 6 версии все работает.... В 10 - почему-то нет.
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4688
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 10 раз
- Поблагодарили: 37 раз
Keycode() не работает в IDLE процедуре
Я не поленился и проверил. Keycode() в idle в С6 изредка срабатывает. Это скорее баг, поскольку по логике вещей keycode() используется в связке с accept активного окна.
Можно провести простой тест. В idle процедуре ставим:
if keycode()<>0
stop(keycode())
setkeycode(0)
.
Потом открывает дочернее окно фрейма и вводим что-то в поле ввода, жмем tab. Наша конструкция в idle не срабатывает.
Можно провести простой тест. В idle процедуре ставим:
if keycode()<>0
stop(keycode())
setkeycode(0)
.
Потом открывает дочернее окно фрейма и вводим что-то в поле ввода, жмем tab. Наша конструкция в idle не срабатывает.
C6/C11, ШВС, tps/btrieve.
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4688
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 10 раз
- Поблагодарили: 37 раз
Keycode() не работает в IDLE процедуре
Кстати, а чем шаблон поможет? Все равно придется либо вешать таймер, либо сабклассить. Что в контексте MDI приложения совсем не кошерно делать для всех окон. А могут быть и фоновые процессы запущены. Когда лет 15 назад я разрабатывал себе фреймворк, то пришел к мнению, что обеспечивать блокировку на уровне приложения не есть корректно. Для этого существует блокировка на уровне винды.
Единственное, где такой функционал реализован - это кассовая программа. Там ситуация специфичная - окон мало, приложение SDI, у пользователя нестандартная pos клавиатура с ограниченным набором клавиш, действия которых надо настраивать в программе, выход в винду закрыт паролем, завершение работы с программой приводит к выключению компьютера, а после включения компьютера сразу залетаем в программу.
Единственное, где такой функционал реализован - это кассовая программа. Там ситуация специфичная - окон мало, приложение SDI, у пользователя нестандартная pos клавиатура с ограниченным набором клавиш, действия которых надо настраивать в программе, выход в винду закрыт паролем, завершение работы с программой приводит к выключению компьютера, а после включения компьютера сразу залетаем в программу.
C6/C11, ШВС, tps/btrieve.
Keycode() не работает в IDLE процедуре
1. Проверял на программе, где на экране только кнопки и текст. KeyCode() стабильно равно 1, хотя я активно редактировал данные.
2. Попробовал переключиться на верхнее MDI-окно SetTarget( , SYSTEM{Prop:Active } ), KeyBoard() никак не меняется,
но можно проверить, например, заголовок 0{ Prop:Text } и собрать инфу о полях через Prop:ScreenText, примерно так
У меня значение переменной S изменяется при вводе текста ( и, само собой, при смене текущего окна). Но, возможно, у меня окна такие, надо проверять...
3. MouseX() и MouseY() - изменяются...
2. Попробовал переключиться на верхнее MDI-окно SetTarget( , SYSTEM{Prop:Active } ), KeyBoard() никак не меняется,
но можно проверить, например, заголовок 0{ Prop:Text } и собрать инфу о полях через Prop:ScreenText, примерно так
Код: Выделить всё
S CString(1000)
SetTarget( , SYSTEM{Prop:Active } )
S = 0{ Prop:Text }
LOOP Field# = FIRSTFIELD() TO LASTFIELD()
S = S & Field#{ PROP:ScreenText}
END
SetTarget
3. MouseX() и MouseY() - изменяются...
- Губин Игорь
- ✯ Ветеран ✯
- Сообщения: 2352
- Зарегистрирован: 16 Сентябрь 2005, 16:35
- Откуда: Москва
- Благодарил (а): 1 раз
- Поблагодарили: 19 раз
Keycode() не работает в IDLE процедуре
Тем, что один раз напишешь код, а дальше всё само, только подключать не забывай.
Это я только кажусь дураком! На самом деле я полный идиот!
-
- ✯ Ветеран ✯
- Сообщения: 5025
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 22 раза
Keycode() не работает в IDLE процедуре
Конечно, не кошерно! Поэтому и костыль с idle процедурой. А как вам вот такой вариант. Из дочерних окон генерить какое-нибудь пользовательское событие во фрейме. А во фрейме уже всё отрабатывать.
We are hard at work… for you.
- Губин Игорь
- ✯ Ветеран ✯
- Сообщения: 2352
- Зарегистрирован: 16 Сентябрь 2005, 16:35
- Откуда: Москва
- Благодарил (а): 1 раз
- Поблагодарили: 19 раз
Keycode() не работает в IDLE процедуре
Большое красивое окно "Отправлять данные в налоговую? Да/Нет"
Можно ещё мееееедленно проявляющееся фото Нормы Джин Мортенсон в пикантном виде...
По идее - вешаем на все поля ввода IMM и получаем событие по любому изменению. Ну и таймер. Если, скажем, за 10 секунд не обновился счётчик - пользователь уснул. Реализация в шаблоне - дело пары часов с отладкой. Можно, наверное, даже и IMM шаблоном вешать
Это я только кажусь дураком! На самом деле я полный идиот!
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4688
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 10 раз
- Поблагодарили: 37 раз
Keycode() не работает в IDLE процедуре
Я не про это. Что будет этот шаблон размещать в оконных процедурах? Там все равно в accept упрешься. Если не сабклассить и не вешать таймер. Даже в этом случае не все гладко будет, так как клавиатурный буфер еще чистить надо не понятно в каких ситуациях. Я хочу сказать, что сам подход с использованием keycode() для определения активности пользователя в mdi не корректен. В то время, как задача решается с пол пинка на уровне винды.Губин Игорь писал(а): ↑19 Ноябрь 2019, 11:37Тем, что один раз напишешь код, а дальше всё само, только подключать не забывай.
C6/C11, ШВС, tps/btrieve.
- Губин Игорь
- ✯ Ветеран ✯
- Сообщения: 2352
- Зарегистрирован: 16 Сентябрь 2005, 16:35
- Откуда: Москва
- Благодарил (а): 1 раз
- Поблагодарили: 19 раз
Keycode() не работает в IDLE процедуре
И что? Шаблон тем и хорош, что может, практически, всё. А остальное - дело алгоритма. Тут напредлагали массу всего. Пусть думает
Это я только кажусь дураком! На самом деле я полный идиот!
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4688
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 10 раз
- Поблагодарили: 37 раз
Keycode() не работает в IDLE процедуре
Выражаясь шахматной терминологией, в таких случаях надо вначале оценить позицию, а уж потом намечать ходы-кандидаты. То есть вся эта тема концептуально сомнительная. Блокировать отдельное mdi приложение, а нафига? Определять бездействие пользователя нужно на уровне ОС. И блокировать доступ к компьютеру, а не к отдельному запущенному приложению. Мне кажется, это очевидно. Поэтому обсуждение данной темы из разряда "скучно, почему бы не поболтать".Губин Игорь писал(а): ↑19 Ноябрь 2019, 12:21И что? Шаблон тем и хорош, что может, практически, всё. А остальное - дело алгоритма. Тут напредлагали массу всего. Пусть думает
C6/C11, ШВС, tps/btrieve.
-
- ✯ Ветеран ✯
- Сообщения: 5025
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 22 раза
Keycode() не работает в IDLE процедуре
А кто-то говорил про блокирование? У меня, например, выход из окна. Ещё, например, заказчик просит, чтобы был автоматический выход из программы при неактивности пользователя. Мы пока отбиваемся, т.к. это он (заказчик) хочет на лицензиях сэкономить.
IMM даже не нужно, если только на большие контролы ТЕКСТ. Проверять в акцепте ивенты и всё. А вот с мышкой без таймера не обойтись, наверно.Губин Игорь писал(а): ↑19 Ноябрь 2019, 12:12 По идее - вешаем на все поля ввода IMM и получаем событие по любому изменению. Ну и таймер. Если, скажем, за 10 секунд не обновился счётчик - пользователь уснул. Реализация в шаблоне - дело пары часов с отладкой. Можно, наверное, даже и IMM шаблоном вешать
We are hard at work… for you.
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4688
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 10 раз
- Поблагодарили: 37 раз
Keycode() не работает в IDLE процедуре
И как он это себе представляет? У пользователя могут быть открыты разные отчеты в разных нитях. Взять и вырубить все, пусть потом заново формирует?
Тогда уж надо изменять логику работы приложения, чтобы оно не держало постоянного подключения к серверу.
C6/C11, ШВС, tps/btrieve.
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4688
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 10 раз
- Поблагодарили: 37 раз
Keycode() не работает в IDLE процедуре
Не все действия пользователя сопровождаются генерацией эвентов.
C6/C11, ШВС, tps/btrieve.