Автор | Сообщение |
|
| |
Пост N: 491
Зарегистрирован: 08.07.06
|
|
Отправлено: 15.07.16 23:22. Заголовок: Скопировать из GET поля текущее значение в буфер обмена
Добрый день GTWVG У юзеров возник вопрос с копированием в буфер обмена из текущего GET-поля. Вставлять мышкой через hb_gtInfo( HB_GTI_SELECTCOPY, "Копировать" ) им "неудобно". Плюс автоматом добавляется Enter в конце выбранной строки, на что может среагировать окно какого-нить клиент-банка... Есть какие-нибудь наработки в этом направлении ? В идеале, конечно, было-бы здорово с зажатым шифтом выбрать часть и через Ctrl-C скопировать в буфер. Ну или хоть поле целиком... Наверняка уже реализовано, но что-то я не нашел, поиск по ключевому слову CLIPBOARD на форуме ничего в плане GET не дал. Спасибо. PS: вставлять из буфера, различая Ctrl-V, Shift-Ins и просто Ins программа давно умеет, но нужно обратное действие и желательно наиболее "стандартными" windows-средствами.
|
|
|
Ответов - 11
[только новые]
|
|
|
| постоянный участник
|
Пост N: 1233
Зарегистрирован: 27.01.07
|
|
Отправлено: 16.07.16 08:04. Заголовок: Не претендую на крас..
Не претендую на красоту решения, но у меня так (GT_WVT): 1. При старте проги SetKey( K_CTRL_INS, { || GetCopyPaste( 1 ) } ) // Copy SetKey( K_ALT_INS, { || GetCopyPaste( 2 ) } ) // Paste 2. FUNCTION GetCopyPaste( nMode ) LOCAL o := GetActive() LOCAL c IF ISNIL( o ) RETURN NIL END // IF IF nMode == 1 // Copy IF ! ISNIL( o:Buffer ) HB_GTInfo( HB_GTI_CLIPBOARDDATA, AllTrim( o:Buffer ) ) END // IF ELSEIF nMode == 2 // Paste c := HB_GTInfo( HB_GTI_CLIPBOARDDATA ) IF ! ISNIL( c ) .and. ! Empty( c ) .and. ! ISNIL( o:Buffer ) KEYBOARD SubStr( c, 1, Len( o:Buffer ) ) o:Display() END // IF END // IF RETURN NIL Не помню точно, почему не Ctrl-V и Ctrl-C. Что-то с ними не получалось, сделал, как написано.
|
|
|
|
| |
Пост N: 492
Зарегистрирован: 08.07.06
|
|
Отправлено: 18.07.16 11:03. Заголовок: PSP пишет: Не помню..
PSP пишет: цитата: | Не помню точно, почему не Ctrl-V и Ctrl-C. Что-то с ними не получалось, сделал, как написано. |
| Там проблема в том, что стандартный INKEY() дает одинаковый код, 22 для ТРЕХ комбинаций клавиш: Insert, Ctrl+V и Shift+Insert. Тоже самое с Ctrl+C = его код 3 пересекается с каким-то (не помню сейчас) из PgDn/PgUp.
|
|
|
|
| постоянный участник
|
Пост N: 1241
Зарегистрирован: 27.01.07
|
|
Отправлено: 18.07.16 11:05. Заголовок: Да, точно...
Да, точно.
|
|
|
|
| |
Пост N: 5905
Зарегистрирован: 17.05.05
|
|
Отправлено: 18.07.16 11:40. Заголовок: Пробни так el..
Пробни так elseif nkey==22 nBits := hb_gtinfo( HB_GTI_KBDSHIFTS ) if nBits == hb_bitor( nBits, HB_GTI_KBD_CTRL )
|
|
|
|
| |
Пост N: 493
Зарегистрирован: 08.07.06
|
|
Отправлено: 18.07.16 13:17. Заголовок: Dima пишет: Пробни ..
Dima пишет: с распознаванием проблем нет: if (inkey=22) if (нажат_шифт или нажат_контрол) пасте_из_буфера else обработка_как_обычный_Insert endif endif точно так-же с копированием: код=3, если нажат контрол или шифт - значит можно копировать. вопрос с корректной обработкой текущего GET-поля и по-возможности, выделения shift+стрелки_влево_вправо. Чтобы "как в виндовс".
|
|
|
|
| |
Пост N: 5906
Зарегистрирован: 17.05.05
|
|
Отправлено: 18.07.16 21:43. Заголовок: Sergy пишет: вопрос..
Sergy пишет: цитата: | вопрос с корректной обработкой текущего GET-поля и по-возможности, выделения shift+стрелки_влево_вправо. Чтобы "как в виндовс". |
| Ну такая фича не везде еще и в Минигуи работает , что уж тут говорить о консоли.... Только лишь напильник , лобзик и надфиль можно посоветовать [IMHO]
|
|
|
|
| постоянный участник
|
Пост N: 1242
Зарегистрирован: 27.01.07
|
|
Отправлено: 18.07.16 21:50. Заголовок: Dima пишет: Ну така..
Dima пишет: цитата: | Ну такая фича не везде еще и в Минигуи работает , что уж тут говорить о консоли.... Только лишь напильник , лобзик и надфиль можно посоветовать [IMHO] |
| Эти "тонкие" инструменты лично мне еще в школе на уроках труда надоели))) Вот и решил сделать "проще и дешевле")
|
|
|
|
| |
Пост N: 5907
Зарегистрирован: 17.05.05
|
|
Отправлено: 18.07.16 21:58. Заголовок: PSP пишет: ти "..
PSP пишет: цитата: | Эти "тонкие" инструменты лично мне еще в школе на уроках труда надоели))) |
| +1
|
|
|
|
| |
Пост N: 131
Зарегистрирован: 24.04.13
|
|
Отправлено: 25.05.17 11:18. Заголовок: Dima пишет: elseif ..
Dima пишет: цитата: | elseif nkey==22 nBits := hb_gtinfo( HB_GTI_KBDSHIFTS ) if nBits == hb_bitor( nBits, HB_GTI_KBD_CTRL ) |
| Sergy пишет: цитата: | с распознаванием проблем нет: if (inkey=22) if (нажат_шифт или нажат_контрол) пасте_из_буфера else обработка_как_обычный_Insert endif endif |
| Куда этот фрагмент вставить в исходном примере чтобы можно было просто вставлять в GET по Ctrl-V или Shift-Insert ?
|
|
|
|
| |
Пост N: 348
Зарегистрирован: 12.11.06
|
|
Отправлено: 25.05.17 13:25. Заголовок: Ооочень много лет на..
Ооочень много лет назад здесь мне посоветовали чуть изменить исходный файл tgetlist.prg и замещать им стандартный при сборке проектов. С тех пор пользуюсь и никогда не возникало проблем. Изменил реакцию на клавиши Ctrl+C, Ctrl+V, Ctrl+X, типы полей так же понимает. "Мой" исходник можно скачать: https://storage.olegon.ru/supermag/upload/2017/TGETLIST.PRG.7z
|
|
|
|
| |
Пост N: 547
Зарегистрирован: 08.07.06
|
|
Отправлено: 26.05.17 17:51. Заголовок: azoo пишет: Куда эт..
azoo пишет: цитата: | Куда этот фрагмент вставить в исходном примере чтобы можно было просто вставлять в GET по Ctrl-V или Shift-Insert ? |
| В начале программы делаю так: HB_GTInfo( HB_GTI_INKEYFILTER, { | nKey | KeyDriver(nKey) } ) сам обработчик тут, главное выделено синим цветом: Скрытый текст
* ---------------- * FUNC KeyDriver(nKey) // обработчик всех кнопок в программе! STATIC context_active := FALSE STATIC show_map_active := FALSE STATIC lost_focus := FALSE LOCAL i,tmp // IF lost_focus // фокус потерян ? IF (nKey == HB_K_GOTFOCUS) // но вдруг вернулся ? REPEAT // обнуляем все последующие UNTIL INKEY()==0 // нажатия кнопок или мыши lost_focus := FALSE // восстанавливаем норм.работу ENDIF RETURN 0 ENDIF // SWITCH nKey // CASE K_LBUTTONDOWN // левая кнопка мыши ? // IF (MROW() == 0) .AND. (MCOL() >= MAXCOL()-2) // переключатель Rus/Lat ? KbdFlip() // переключаем клаву nKey := 0 ELSE nKey := MouseFixLDown() // фиксируем нажатие, засекаем время, игнорируем ENDIF EXIT CASE K_LBUTTONUP // отпускание кнопки будем интерпретировать nKey := MouseFixLUp() // в зависимости от времени, сколько она была нажата IF (nKey == K_CTRL_V) .OR. ; // нужна доп. обработка на случай Copy/Paste из буфера ? (nKey == K_CTRL_C) nKey := KeyDriver(nKey) // recursive call ! ENDIF EXIT CASE K_MWFORWARD // прокрутка колесика вперед ? IF ShiftPressed() // ускоряем PutInKbd({K_UP,K_UP,K_UP}) ELSEIF CtrlPressed() // еще больше ускоряем PutInKbd({K_UP,K_UP,K_UP,K_UP,K_UP,K_UP,K_UP,K_UP,K_UP,K_UP}) ENDIF nKey := K_UP EXIT CASE K_MWBACKWARD // тоже самое, но назад IF ShiftPressed() PutInKbd({K_DOWN,K_DOWN,K_DOWN}) ELSEIF CtrlPressed() PutInKbd({K_DOWN,K_DOWN,K_DOWN,K_DOWN,K_DOWN,K_DOWN,K_DOWN,K_DOWN,K_DOWN,K_DOWN}) ENDIF nKey := K_DOWN EXIT CASE K_INS // проверяем на вставку из буфера IF CtrlPressed() .OR. ShiftPressed() // Shift+Ins или Ctrl+V ? hb_GtInfo( HB_GTI_CLIPBOARDPASTE ) nKey := 0 // остальное не нужно ENDIF EXIT CASE K_CTRL_C // K_CTRL_C пересекается с K_PGDN ! IF CtrlPressed() // поэтому тут нужна доп. проверка IF GetActive() != NIL hb_gtInfo( HB_GTI_CLIPBOARDDATA, ALLTRIM(Transform(GetActive():VarGet(),""))) RETURN 0 ENDIF ENDIF EXIT // CASE K_LDBLCLK // двойной щелчок левой кнопкой mouse_ldown_on := FALSE // выключаем слежение за scroll nKey := MouseMapCheck(nKey) // обрабтываем, как обычно, с учетом зон EXIT // CASE K_MDBLCLK // двойной щелчок колесиком мыши - тест IF show_map_active TONE(200,1) ELSE show_map_active := TRUE MouseMap("show_all") show_map_active := FALSE ENDIF nKey := 0 EXIT CASE K_MMLEFTDOWN // мышь движется c зажатой левой кнопкой ? // mouse_ldown_on := FALSE // в дальнейшем проигнорируем обычное нажатие // слишком "нервно", чуть двинулся и ппц... // скинем флаг только после того, как зафиксируем движуху nKey := MouseFixMove(nKey) // обрабатываем как scroll EXIT CASE K_MOUSEMOVE // мышь движется ? nKey := 0 // игнорируем EXIT CASE K_RBUTTONDOWN IF context_active // выключить меню на старом месте PutInKbd(K_RBUTTONDOWN) // и включить на новом nKey := K_CONTEXT_OFF // подменяем кнопку, чтобы выключить меню ELSE // включить контекстное меню context_active:=TRUE i:=MouseContextMenu() // включаем context_active:=FALSE nKey := i // возвращем кнопку, нажатую юзером ENDIF EXIT CASE HB_K_CLOSE // закрытие окна приложения? nKey := K_ESC // игнорируем, типа выход из тек.диалога EXIT CASE HB_K_LOSTFOCUS // потеря фокуса? (GTWVT only) lost_focus := TRUE nKey := 0 EXIT CASE HB_K_GOTFOCUS // восстановление фокуса? (GTWVT only) lost_focus := FALSE // скорее всего, никогда не попадет сюда nKey := 0 // из-за проверки до SWITCH EXIT CASE 44 // запятая - мешает набору цифр на клавиатуре справа! IF KbdIsRus() .AND. !ShiftPressed() nKey := 46 // сразу заменяем на точку ENDIF EXIT END // SWITCH RETURN nKey // process as usual
|
|
|
|
|