Keycode() не работает в IDLE процедуре

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2301
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Поблагодарили: 17 раз

Keycode() не работает в IDLE процедуре

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

vic7tar писал(а): 20 Ноябрь 2019, 14:03Ну да, а что не реализуемо, без всякого субклассинга?
ИМХО: "гладко" и естественно реализуемо шаблоном, подключаемым во Frame и в каждом контролируемом окне.
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4549
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Keycode() не работает в IDLE процедуре

Сообщение finsoftrz »

Губин Игорь писал(а): 20 Ноябрь 2019, 12:45
vic7tar писал(а): 19 Ноябрь 2019, 20:14Так всё-таки, из одного места можно контролировать нажатие клавиш и клики мыши?
Всё в ОКНЕ можно контролировать сразу после ACCEPT
Неа, не все. :-) Некоторые вещи отрабатываются внутри accept. Поэтому и сабклассинг придумали, чтобы обойти.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2301
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Поблагодарили: 17 раз

Keycode() не работает в IDLE процедуре

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

finsoftrz писал(а): 20 Ноябрь 2019, 14:11Неа, не все. :-) Некоторые вещи отрабатываются внутри accept. Поэтому и сабклассинг придумали, чтобы обойти.
Умный, да?! :lol:

Мы не говорим сейчас о всякой экзотике типа Windows API и всего, что с этим связано. Мы говорим сейчас о работе мышки и клавиатуры в окнах задачи. :nr:
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
vic7tar
Ветеран
Сообщения: 365
Зарегистрирован: 09 Февраль 2017, 20:12

Keycode() не работает в IDLE процедуре

Сообщение vic7tar »

Губин Игорь писал(а): 20 Ноябрь 2019, 14:09ИМХО: "гладко" и естественно реализуемо шаблоном, подключаемым во Frame и в каждом контролируемом окне.
А я и не спорю, я и говорил, что это самый простой путь. Но прежде я упомянул хуки, но на это нуль реакции. Если ТС-у сильно нужно - SetWindowsHookExA. Будет сложновато.
C10, Win10x64
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Keycode() не работает в IDLE процедуре

Сообщение kreator »

Губин Игорь, предложите вариант гладкой и естественной обработки набора текста в поле TEXT. ИМХО, здесь уже некая колизия.
We are hard at work… for you. :)
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4549
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Keycode() не работает в IDLE процедуре

Сообщение finsoftrz »

Игорь Маркович тогда уж, будет еще торжественнее... :-)
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2301
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Поблагодарили: 17 раз

Keycode() не работает в IDLE процедуре

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

kreator писал(а): 20 Ноябрь 2019, 14:54ариант гладкой и естественной обработки набора текста в поле TEXT. ИМХО, здесь уже некая колизия
У меня был подобный случай. Я сотворил шаблон с буферными переменными, в которые считывал постоянно содержимое и сравнивал. Аналогично тому, что показывал Юрий. Варианты для RTF и обычного различались. Но, поскольку шаблон делаем один раз...
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2301
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Поблагодарили: 17 раз

Keycode() не работает в IDLE процедуре

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

finsoftrz писал(а): 20 Ноябрь 2019, 14:58Игорь Маркович тогда уж, будет еще торжественнее...
Вах, перед форумом и бутылкой равны все! :idied:
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4549
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Keycode() не работает в IDLE процедуре

Сообщение finsoftrz »

Губин Игорь писал(а): 20 Ноябрь 2019, 15:10
finsoftrz писал(а): 20 Ноябрь 2019, 14:58Игорь Маркович тогда уж, будет еще торжественнее...
Вах, перед форумом и бутылкой равны все! :idied:
А что, когда молоденькие девушки все чаще начали меня на Вы называть и по имени-отчеству, вначале было непривычно, а потом даже понравилось. Причем я сам как-то на восприятие особо не различаю, что 10-20 лет назад с такими же общался, что сейчас. А потом приходит мысль, твои ровесницы с палочками под окнами гуляют, а ты все их бабульками древними воспринимаешь, кобелина... Ну, не до такой степени пока, конечно, но все к тому постепенно движется. :-)
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2301
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Поблагодарили: 17 раз

Keycode() не работает в IDLE процедуре

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

finsoftrz писал(а): 20 Ноябрь 2019, 15:47А что, когда молоденькие девушки все чаще начали меня на Вы называть и по имени-отчеству, вначале было непривычно, а потом даже понравилось. Причем я сам как-то на восприятие особо не различаю, что 10-20 лет назад с такими же общался, что сейчас. А потом приходит мысль, твои ровесницы с палочками под окнами гуляют, а ты все их бабульками древними воспринимаешь, кобелина... Ну, не до такой степени пока, конечно, но все к тому постепенно движется.
Мужику столько лет, сколько его самой молодой любовнице не на содержании! :lol:
Т.е. жёны сюда не входят! :idied:
Это я только кажусь дураком! На самом деле я полный идиот!
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Keycode() не работает в IDLE процедуре

Сообщение Yufil »

Сабклассинг есть в FreeABC. В своё время исправлял переключение языка в CW6.
А всё-таки вариант с проверкой изменений Prop:ScreenText для каждого из полей текущего окна у меня катит. Одна Idle-процедура на приложение с MDI или повесить на таймер её же ( только без SetTarget() ) в однозадачном.

Ещё раз проверил
Внутри Idle-процедуры

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

Loc:OldString  Cstring(10000),STATIC
Loc:NewString  CString(10000),STATIC
Loc:OldTime    LONG(0),STATIC 
    .... 
           Thread# = System{ Prop:Active } 
           Loc:NewString = '' 
           IF Thread#<>1 
               SetTarget( ,Thread# ) 
               Key# = KeyCode() 
               LOOP Field# = FIRSTFIELD() TO LASTFIELD()
                   CASE Field#{Prop:Type} 
                   OF 0 
                   OF Create:Check 
                     Loc:Use = Field#{Prop:Use}
                     Loc:NewString = Clip(Loc:NewString) & CLIP( Loc:Use ) 
                  ELSE 
                     Loc:NewString = Clip(Loc:NewString) & CLIP(Field#{ PROP:ScreenText}) 
                  END    
             END
             IF Loc:OldString <> Loc:NewString 
                Loc:OldTime = CLOCK() 
             END
             Loc:OldString = Loc:NewString 
             0{Prop:Text} = 'Modified ' & Format( Loc:OldTime,'@t4') |
               & ' Wait=' & Format( CLOCK() - Loc:OldTime, '@t4') 
             SetTarget() 
           END  
... 
Если ничего не трогаешь, растёт Wait, тронул - сбрасывается в 0.
Недостаток - не у всех видов полей есть Prop:ScreenText, на Checkbox пришлось выкрутиться,
Entry и Text нормально. Ещё полезно, наверное, отловить переключение тредов и смену заголовка,
а так - работает...

Свойства окон и полей ( IMM ) сразу не скажу, окна и поля создаются динамически.
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Keycode() не работает в IDLE процедуре

Сообщение kreator »

Yufil писал(а): 20 Ноябрь 2019, 16:13 А всё-таки вариант с проверкой изменений Prop:ScreenText для каждого из полей текущего окна у меня катит.
Тоже не совсем то. А если пользователь ничего не меняет? А список просматривает? Или кнопки нажимает?
We are hard at work… for you. :)
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Keycode() не работает в IDLE процедуре

Сообщение Yufil »

Если кнопки нажимает, то содержимое экрана изменяется. Иначе зачем их нажимать ?
Для списка можно добавить в снимок ?List{ Prop:Selected } вместо ?List{Prop:Text}.
Или извлечь запись через Prop:From - варианты есть.
А для мышки, само собой, MouseX() и Mousey() в снимок. Но это мне не кажется правильным :)
Ответить