Форум » [x]Harbour » Скопировать из GET поля текущее значение в буфер обмена » Ответить

Скопировать из GET поля текущее значение в буфер обмена

Sergy: Добрый день GTWVG У юзеров возник вопрос с копированием в буфер обмена из текущего GET-поля. Вставлять мышкой через hb_gtInfo( HB_GTI_SELECTCOPY, "Копировать" ) им "неудобно". Плюс автоматом добавляется Enter в конце выбранной строки, на что может среагировать окно какого-нить клиент-банка... Есть какие-нибудь наработки в этом направлении ? В идеале, конечно, было-бы здорово с зажатым шифтом выбрать часть и через Ctrl-C скопировать в буфер. Ну или хоть поле целиком... Наверняка уже реализовано, но что-то я не нашел, поиск по ключевому слову CLIPBOARD на форуме ничего в плане GET не дал. Спасибо. PS: вставлять из буфера, различая Ctrl-V, Shift-Ins и просто Ins программа давно умеет, но нужно обратное действие и желательно наиболее "стандартными" windows-средствами.

Ответов - 11

PSP: Не претендую на красоту решения, но у меня так (GT_WVT): 1. При старте проги [pre2] SetKey( K_CTRL_INS, { || GetCopyPaste( 1 ) } ) // Copy SetKey( K_ALT_INS, { || GetCopyPaste( 2 ) } ) // Paste [/pre2] 2. [pre2] 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[/pre2] Не помню точно, почему не Ctrl-V и Ctrl-C. Что-то с ними не получалось, сделал, как написано.

Sergy: PSP пишет: Не помню точно, почему не Ctrl-V и Ctrl-C. Что-то с ними не получалось, сделал, как написано. Там проблема в том, что стандартный INKEY() дает одинаковый код, 22 для ТРЕХ комбинаций клавиш: Insert, Ctrl+V и Shift+Insert. Тоже самое с Ctrl+C = его код 3 пересекается с каким-то (не помню сейчас) из PgDn/PgUp.

PSP: Да, точно.


Dima: Пробни так [pre2] elseif nkey==22 nBits := hb_gtinfo( HB_GTI_KBDSHIFTS ) if nBits == hb_bitor( nBits, HB_GTI_KBD_CTRL ) [/pre2]

Sergy: Dima пишет: Пробни так с распознаванием проблем нет: [pre2]if (inkey=22) if (нажат_шифт или нажат_контрол) пасте_из_буфера else обработка_как_обычный_Insert endif endif[/pre2] точно так-же с копированием: код=3, если нажат контрол или шифт - значит можно копировать. вопрос с корректной обработкой текущего GET-поля и по-возможности, выделения shift+стрелки_влево_вправо. Чтобы "как в виндовс".

Dima: Sergy пишет: вопрос с корректной обработкой текущего GET-поля и по-возможности, выделения shift+стрелки_влево_вправо. Чтобы "как в виндовс". Ну такая фича не везде еще и в Минигуи работает , что уж тут говорить о консоли.... Только лишь напильник , лобзик и надфиль можно посоветовать [IMHO]

PSP: Dima пишет: Ну такая фича не везде еще и в Минигуи работает , что уж тут говорить о консоли.... Только лишь напильник , лобзик и надфиль можно посоветовать [IMHO] Эти "тонкие" инструменты лично мне еще в школе на уроках труда надоели))) Вот и решил сделать "проще и дешевле")

Dima: PSP пишет: Эти "тонкие" инструменты лично мне еще в школе на уроках труда надоели))) +1

azoo: 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 ?

AndreyZh: Ооочень много лет назад здесь мне посоветовали чуть изменить исходный файл tgetlist.prg и замещать им стандартный при сборке проектов. С тех пор пользуюсь и никогда не возникало проблем. Изменил реакцию на клавиши Ctrl+C, Ctrl+V, Ctrl+X, типы полей так же понимает. "Мой" исходник можно скачать: https://storage.olegon.ru/supermag/upload/2017/TGETLIST.PRG.7z

Sergy: azoo пишет: Куда этот фрагмент вставить в исходном примере чтобы можно было просто вставлять в GET по Ctrl-V или Shift-Insert ? В начале программы делаю так: HB_GTInfo( HB_GTI_INKEYFILTER, { | nKey | KeyDriver(nKey) } ) сам обработчик тут, главное выделено синим цветом: [pre2]* ---------------- * 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 [/pre2]



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