Страница 2 из 4
					
				Keycode() не работает в IDLE процедуре
				Добавлено: 18 Ноябрь 2019, 16:40
				 vic7tar
				Ну да, самый простой и самый надёжный путь -> шаблон.
			 
			
					
				Keycode() не работает в IDLE процедуре
				Добавлено: 18 Ноябрь 2019, 23:03
				 ingasoftplus
				Губин Игорь писал(а): 18 Ноябрь 2019, 10:54но разве keycode() как-то должен реагировать?! 

Он же отрабатывает в активном окне!
 
Это кто вам такое сказал???
 
			 
			
					
				Keycode() не работает в IDLE процедуре
				Добавлено: 18 Ноябрь 2019, 23:05
				 ingasoftplus
				vic7tar писал(а): 18 Ноябрь 2019, 15:46Ловить нажатие клавиш в другом потоке - тупик
 
поток - тотже самый.
ЕЩЕ раз - в 6 версии все работает.... В 10 - почему-то нет.
 
			 
			
					
				Keycode() не работает в IDLE процедуре
				Добавлено: 19 Ноябрь 2019, 8:57
				 finsoftrz
				Я не поленился и проверил. Keycode() в idle в С6 изредка срабатывает. Это скорее баг, поскольку по логике вещей keycode() используется в связке с accept активного окна.
Можно провести простой тест. В idle процедуре ставим:
if keycode()<>0
   stop(keycode())
   setkeycode(0)
.
Потом открывает дочернее окно фрейма и вводим что-то в поле ввода, жмем tab. Наша конструкция в idle не срабатывает.
			 
			
					
				Keycode() не работает в IDLE процедуре
				Добавлено: 19 Ноябрь 2019, 10:16
				 finsoftrz
				Кстати, а чем шаблон поможет? Все равно придется либо вешать таймер, либо сабклассить. Что в контексте MDI приложения совсем не кошерно делать для всех окон. А могут быть и фоновые процессы запущены. Когда лет 15 назад я разрабатывал себе фреймворк, то пришел к мнению, что обеспечивать блокировку на уровне приложения не есть корректно. Для этого существует блокировка на уровне винды.
Единственное, где такой функционал реализован - это кассовая программа. Там ситуация специфичная - окон мало, приложение SDI, у пользователя нестандартная pos клавиатура с ограниченным набором клавиш, действия которых надо настраивать в программе, выход в винду закрыт паролем, завершение работы с программой приводит к выключению компьютера, а после включения компьютера сразу залетаем в программу.
			 
			
					
				Keycode() не работает в IDLE процедуре
				Добавлено: 19 Ноябрь 2019, 10:37
				 Yufil
				1. Проверял на программе, где на экране только кнопки и текст. KeyCode() стабильно равно 1, хотя я активно редактировал данные. 
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 
У меня значение переменной S изменяется при вводе текста ( и, само собой, при смене текущего окна). Но, возможно, у меня окна такие, надо проверять... 
3. MouseX() и MouseY() - изменяются...
 
			 
			
					
				Keycode() не работает в IDLE процедуре
				Добавлено: 19 Ноябрь 2019, 11:37
				 Губин Игорь
				finsoftrz писал(а): 19 Ноябрь 2019, 10:16Кстати, а чем шаблон поможет?
 
Тем, что один раз напишешь код, а дальше всё само, только подключать не забывай.
 
			 
			
					
				Keycode() не работает в IDLE процедуре
				Добавлено: 19 Ноябрь 2019, 11:56
				 kreator
				finsoftrz писал(а): 19 Ноябрь 2019, 10:16
Кстати, а чем шаблон поможет? Все равно придется либо вешать таймер, либо сабклассить. Что в контексте MDI приложения совсем не кошерно делать для всех окон. А могут быть и фоновые процессы запущены.
 
Конечно, не кошерно! Поэтому и костыль с idle процедурой. А как вам вот такой вариант. Из дочерних окон генерить какое-нибудь пользовательское событие во фрейме. А во фрейме уже всё отрабатывать.
 
			 
			
					
				Keycode() не работает в IDLE процедуре
				Добавлено: 19 Ноябрь 2019, 12:12
				 Губин Игорь
				kreator писал(а): 19 Ноябрь 2019, 11:56Из дочерних окон генерить какое-нибудь пользовательское событие во фрейме
 
Большое красивое окно "Отправлять данные в налоговую? Да/Нет" 
Можно ещё мееееедленно проявляющееся фото Нормы Джин Мортенсон в пикантном виде... 
 
По идее - вешаем на все поля ввода IMM и получаем событие по любому изменению.  Ну и таймер. Если, скажем, за 10 секунд не обновился счётчик - пользователь уснул. Реализация в шаблоне - дело пары часов с отладкой. Можно, наверное, даже и IMM шаблоном вешать
 
			 
			
					
				Keycode() не работает в IDLE процедуре
				Добавлено: 19 Ноябрь 2019, 12:17
				 finsoftrz
				Губин Игорь писал(а): 19 Ноябрь 2019, 11:37finsoftrz писал(а): 19 Ноябрь 2019, 10:16Кстати, а чем шаблон поможет?
 
Тем, что один раз напишешь код, а дальше всё само, только подключать не забывай.
 
Я не про это. Что будет этот шаблон размещать в оконных процедурах? Там все равно в accept упрешься. Если не сабклассить и не вешать таймер. Даже в этом случае не все гладко будет, так как клавиатурный буфер еще чистить надо не понятно в каких ситуациях. Я хочу сказать, что сам подход с использованием keycode() для определения активности пользователя в mdi не корректен. В то время, как задача решается с пол пинка на уровне винды.
 
			 
			
					
				Keycode() не работает в IDLE процедуре
				Добавлено: 19 Ноябрь 2019, 12:21
				 Губин Игорь
				finsoftrz писал(а): 19 Ноябрь 2019, 12:17Там все равно в accept упрешься.
 
И что? Шаблон тем и хорош, что может, практически, всё. А остальное - дело алгоритма. Тут напредлагали массу всего. Пусть думает
 
			 
			
					
				Keycode() не работает в IDLE процедуре
				Добавлено: 19 Ноябрь 2019, 12:34
				 finsoftrz
				Губин Игорь писал(а): 19 Ноябрь 2019, 12:21finsoftrz писал(а): 19 Ноябрь 2019, 12:17Там все равно в accept упрешься.
 
И что? Шаблон тем и хорош, что может, практически, всё. А остальное - дело алгоритма. Тут напредлагали массу всего. Пусть думает
 
Выражаясь шахматной терминологией, в таких случаях надо вначале оценить позицию, а уж потом намечать ходы-кандидаты. То есть вся эта тема концептуально сомнительная. Блокировать отдельное mdi приложение, а нафига? Определять бездействие пользователя нужно на уровне ОС. И блокировать доступ к компьютеру, а не к отдельному запущенному приложению. Мне кажется, это очевидно. Поэтому обсуждение данной темы из разряда "скучно, почему бы не поболтать". 

 
			 
			
					
				Keycode() не работает в IDLE процедуре
				Добавлено: 19 Ноябрь 2019, 14:21
				 kreator
				А кто-то говорил про блокирование? У меня, например, выход из окна. Ещё, например, заказчик просит, чтобы был автоматический выход из программы при неактивности пользователя. Мы пока отбиваемся, т.к. это он (заказчик) хочет на лицензиях сэкономить.
Губин Игорь писал(а): 19 Ноябрь 2019, 12:12
По идее - вешаем на все поля ввода IMM и получаем событие по любому изменению. Ну и таймер. Если, скажем, за 10 секунд не обновился счётчик - пользователь уснул. Реализация в шаблоне - дело пары часов с отладкой. Можно, наверное, даже и IMM шаблоном вешать
 
IMM даже не нужно, если только на большие контролы ТЕКСТ. Проверять в акцепте ивенты и всё. А вот с мышкой без таймера не обойтись, наверно.
 
			 
			
					
				Keycode() не работает в IDLE процедуре
				Добавлено: 19 Ноябрь 2019, 15:18
				 finsoftrz
				kreator писал(а): 19 Ноябрь 2019, 14:21А кто-то говорил про блокирование? У меня, например, выход из окна. Ещё, например, заказчик просит, чтобы был автоматический выход из программы при неактивности пользователя. Мы пока отбиваемся, т.к. это он (заказчик) хочет на лицензиях сэкономить.
 
И как он это себе представляет? У пользователя могут быть открыты разные отчеты в разных нитях. Взять и вырубить все, пусть потом заново формирует?
Тогда уж надо изменять логику работы приложения, чтобы оно не держало постоянного подключения к серверу.
 
			 
			
					
				Keycode() не работает в IDLE процедуре
				Добавлено: 19 Ноябрь 2019, 15:20
				 finsoftrz
				kreator писал(а): 19 Ноябрь 2019, 14:21
IMM даже не нужно, если только на большие контролы ТЕКСТ. Проверять в акцепте ивенты и всё. А вот с мышкой без таймера не обойтись, наверно.
 
Не все действия пользователя сопровождаются генерацией эвентов.