Форум » [x]Harbour » SOLVED!!! -> TRAPANYKEY() и KEYSEND() или запись/воспроизведение клавиатурных макросов » Ответить

SOLVED!!! -> TRAPANYKEY() и KEYSEND() или запись/воспроизведение клавиатурных макросов

Sergy: Практически со всем разобрался и восстановил функционал. Осталось одно и достаточно важное дело: автоматизация рутинных операций. В Clipper это происходило при помощи функций TRAPANYKEY/KEYSEND Первая при нажатии на любую клавишу в любом месте программы (включая GET/DBEDIT/ACHOICE/INKEY и тп) вызывает указанную мною функцию и передает ей код нажатой кнопки. Пользовательская функция тихо сидит и собирает эти коды в буфер - "записывает" нажатия клавиш юзером. В случае, если нужно "воспроизвести" записанные нажатия на кнопки, вызывается KEYSEND() с этим буфером в качестве параметра. Просто и логично. --------------------------------- Встал вопрос - чем и как заменить этот функционал? Без него меня разорвут на части - делать множество рутинных операций без клавиатурных макросов чокнешься...

Ответов - 45, стр: 1 2 3 All

Dima: По поводу KEYSEND , смотри hb_keyins() , HB_KEYPUT() , FT_PUTKEY() , KEYBOARD ,__KEYBOARD() Насчет TRAPANYKEY надо подумать и уверен что как то можно это порешать.

Dima: Sergy пишет: делать множество рутинных операций без клавиатурных макросов чокнешься... Например ? Пока не очень понимаю для чего это надо. Каких таких рутинных операций.........?

Sergy: Главное - как-то собрать информацию о нажатых клавишах. А уж засунуть коды в клавиатурный буфер - дело недолгое... Может зайти к этому вопросу с другой стороны - как с минимальными переделками осуществить задуманное? 1) Есть ли в Harbour какой-нить единый для всей программы обработчик inkey? Заменить его. 2) Используя многопоточность, анализировать и сохранять изменения в LastKey() - только как отличить двойное нажатие одной и той-же кнопки? 3) ???...


Dima: Sergy пишет: сохранять LastKey() - только как отличить двойное нажатие одной и той-же кнопки? А TRAPANYKEY отличал двойное нажатие ?

Sergy: Рутинные операции - массовое изменение цен в выбранных оптовых колонках, редактирование шаблонов документов, ценников, гтд, сформировать отчет, убрав из него ненужную (например конфиденциальную) инфу перед отправкой по почте - т.е. тогда, когда юзеру нужно вводить/изменить множество однотипной информации, которую нельзя автоматизировать другим способм (напр.при помощи справочников).

Sergy: Dima пишет: trapanykey отличал двойные нажатия? Он вызывает функцию при нажатии любой кнопки. Если два раза нажата одна кнопка - два вызова.

Dima: Sergy пишет: Рутинные операции - массовое изменение цен в выбранных оптовых колонках Не представляю как это решает макрос. Цены разные на каждый товар и могут меняться в любую сторону. Проще педальку сделать с условиями пересчета.

Sergy: Вот например, решили с завтрашнего дня устроить распродажу светильников с золотой каемочкой. Соотв. изменить цены только на них и только для клиентов из области, работающих по 5 колонке. Было "15%", а сделать только в в пятой колонке 2%. Для 40 моделей светильников. Нажать ентер (вход в ячейку) Нажать 2 Нажать шифт и процент Нажать ентер Нажать стрелку вниз Следующим может идти белый или серебристый светильник, его пропускаем. Нашли золотой - повторяем 5 нажатий клавиш. Итого 200 нажатий минимум. В случае макроса - 40.

Dima: Sergy Да вариант конечно.

Sergy: Может сторонняя виндовс-программулька такое может?

Dima: Sergy пишет: Может сторонняя виндовс-программулька такое может? Это может и твоя прога нужно придумать как.

SergKis: Sergy пишет:Нажать ентер (вход в ячейку) Нажать 2 Нажать шифт и процент Нажать ентер Нажать стрелку вниз А не проще пометить строки, и кликнуть по шапке 5 колони browse и ввести 2% и пересчитать для отмеченных ... предварительно можно ограничить список просмотра Scope или filter ...

Sergy: SergKis, это частный случай. Их множество по ходу работы юзеров.

Dima: Sergy Возможно надо покопать функцию hb_SetKeySave , я пока не понял как она работает и пример глянуть setkeys.prg

Sergy: Как понимаю, это массовое сохранение/переназначение всех set key клавиш.

Dima: Sergy я бай пойду , надо когда то и отдыхать ;)

Sergy:

SergKis: Sergy Возможно это то что надо (inkey.c): [pre2] HB_FUNC( INKEY ) { PHB_INKEYBLOCK pInkeyBlock = ( PHB_INKEYBLOCK ) hb_stackTestTSD( &s_inkeyBlock ); int iPCount = hb_pcount(); PHB_ITEM pKey = NULL; int iKey; if( pInkeyBlock && pInkeyBlock->before ) hb_vmEvalBlock( pInkeyBlock->before ); // БЛОК КОДА ДО ... do { iKey = hb_inkey( iPCount == 1 || ( iPCount > 1 && HB_ISNUM( 1 ) ), hb_parnd( 1 ), HB_ISNUM( 2 ) ? hb_parni( 2 ) : hb_setGetEventMask() ); if( iKey == 0 || !pInkeyBlock || !pInkeyBlock->after ) // БЛОК КОДА ПОСЛЕ ... break; pKey = hb_itemPutNI( pKey, iKey ); iKey = hb_itemGetNI( hb_vmEvalBlockV( pInkeyBlock->after, 1, pKey ) ); hb_inkeySetLast( iKey ); } while( iKey == 0 ); if( pKey ) hb_itemRelease( pKey ); hb_retni( iKey ); } /* temporary disabled */ #if 0 // ЗДЕСЬ #if 1 HB_FUNC( HB_SETINKEYBEFOREBLOCK ) { PHB_INKEYBLOCK pInkeyBlock = ( PHB_INKEYBLOCK ) hb_stackGetTSD( &s_inkeyBlock ); if( pInkeyBlock->before ) hb_itemReturn( pInkeyBlock->before ); if( hb_pcount() > 0 ) { PHB_ITEM pBlock = hb_param( 1, HB_IT_BLOCK ); if( pInkeyBlock->before ) hb_itemRelease( pInkeyBlock->before ); pInkeyBlock->before = pBlock ? hb_itemNew( pBlock ) : pBlock; } } HB_FUNC( HB_SETINKEYAFTERBLOCK ) { PHB_INKEYBLOCK pInkeyBlock = ( PHB_INKEYBLOCK ) hb_stackGetTSD( &s_inkeyBlock ); if( pInkeyBlock->after ) hb_itemReturn( pInkeyBlock->after ); if( hb_pcount() > 0 ) { PHB_ITEM pBlock = hb_param( 1, HB_IT_BLOCK ); if( pInkeyBlock->after ) hb_itemRelease( pInkeyBlock->after ); pInkeyBlock->after = pBlock ? hb_itemNew( pBlock ) : pBlock; } } #endif [/pre2]

SergKis: Sergy правильнее: if( iKey == 0 || !pInkeyBlock || !pInkeyBlock->after ) break; pKey = hb_itemPutNI( pKey, iKey ); iKey = hb_itemGetNI( hb_vmEvalBlockV( pInkeyBlock->after, 1, pKey ) ); // БЛОК КОДА ПОСЛЕ ... hb_inkeySetLast( iKey );

SergKis: Sergy Смотрю в версии 3.2 этот текст уже другой, что в 3.0 не знаю. нет у меня, а этот текст inkey.c взят с 2.0



полная версия страницы