Página 3 de 3

Copia / Colar no HARBOUR

Enviado: 07 Jun 2022 01:44
por alxsts
Olá!

Testei esta situação no Harbour 3.2.0dev (r2104281802) e acontece exatamente o mesmo problema relatado no 3.4. Mas o OP afirma que no 3.2 funciona... agora não entendi mais nada...

Copia / Colar no HARBOUR

Enviado: 07 Jun 2022 16:04
por carlaoonline
Boa tarde!

Com Harbour 3.2 (que também cola uma palavra em cada get se tiverem separadas com ponto e vírgula), resolvi dessa forma:


-> Colando um texto com ponto e vírgula através do Ctrl-V ele distribui entre os gets

-> Colando um texto com ponto e vírgula através do Ctrl-P ele colo tudo no get ativo

Da pra mudar o Ctrl-P para o que quiser, até substituir pelo Ctrl-V se quiser...

No caso aqui é tudo variável texto, é só um exemplo.

Código: Selecionar todos

// linha de comando para compilar: 
// HBMK2.EXE PROG -B hbct.hbc xhb.hbc gtwvg.hbc

// Usando
// Harbour 3.2.0dev (r2104281802)
// Turbo Incremental Link 5.69 Copyright (c) 1997-2005 Borland

#include "inkey.ch"
#include "wvtwin.ch"
#include "hbgtinfo.ch"  

REQUEST HB_LANG_PT
REQUEST HB_CODEPAGE_PT850

FUNCTION Main()
Local cNome:=cEndereco:=cBairro:=cCidade:=cEstado:=Space(50)
Local cDados
HB_SETCODEPAGE( "PT850" )
hb_langSelect( 'PT' )

SET CONSOLE OFF
SET DELETED ON
SET SCOREBOARD OFF
SET EXCLU OFF
SET CONFIRM ON
SET ESCAPE OFF
SET DATE BRITI
SET WRAP ON
SET EPOCH TO 2000 // SET EPOCH TO 1970
SET KEY 27 TO FIM()
AltD( 1 )

HarbourInit()

cDados="Joao;Rua Sobe e Desce,23;Centro;Porto Alegre;RS   "

Do While .t.
   Cls

   @ 02,10 say "Copie o texto do ultimo get e cole no primeiro"
   @ 04,10 say "Para colar utilize    Ctrl-V   ou    Ctrl-P"

   @ 20,20 say "Tecle ESC para sair." 

   @ 10,10 say "Nome    " get cNome
   @ 11,10 say "Endereco" get cEndereco
   @ 12,10 say "Bairro  " get cBairro
   @ 13,10 say "Cidade  " get cCidade
   @ 14,10 say "Estado  " get cEstado
   @ 16,10 say "Dados   " get cDados
   Read

Enddo
   
    


Function HarbourInit()
SET( _SET_EVENTMASK, INKEY_ALL - INKEY_MOVE ) // + HB_INKEY_GTEVENT )  // Set Eventmask to 1002
hb_gtInfo( HB_GTI_SELECTCOPY, .T. )  // Permite selecao para copia de dados
hb_gtInfo( HB_GTI_SELECTCOPY, "Selecione e Copie" )   // Coloca a mensagem em portugues (menu esquerdo superior windows)
hb_gtInfo( HB_GTI_RESIZABLE, .t. )



//Incio do comando.... -->> A CADA EVENTO DE MOUSE OU TECLADO PASSDA ANTES POR AQUI (POR ISSO O NOME EH INKEYFILTER).
  // HB_GTI_INKEYFILTER Não funciona com console, nem com GTWVT. Funciona soh com GTWVG e GTWVW.
  hb_gtInfo( HB_GTI_INKEYFILTER, { | nKey |
     LOCAL nBits, lIsKeyCtrl ,OLD_REG_OPEN
     nBits := hb_GtInfo( HB_GTI_KBDSHIFTS )
     lIsKeyCtrl := ( nBits == hb_BitOr( nBits, HB_GTI_KBD_CTRL ) )

     SWITCH nKey  // A tecla ou o Clic do mouse estah em nKey a cada evento do INKEYFILTER
      
        CASE K_INS
             IF lIsKeyCtrl
                hb_GtInfo( HB_GTI_CLIPBOARDPASTE )
                RETURN 0
             ENDIF

       CASE K_CTRL_P
            cTexto=hb_GtInfo( HB_GTI_CLIPBOARDDATA )
            cNome=ctexto
            get=getactive()
            get:VarPut(cTexto)
            get:UpdateBuffer()
            RETURN 0  

       CASE K_CTRL_C
            IF lIsKeyCtrl
               IF GetActive() != NIL
                  hb_gtInfo( HB_GTI_CLIPBOARDDATA, Transform( GetActive():varGet(), "" ) )
                  RETURN 0
               ENDIF
            ENDIF

     ENDSWITCH
RETURN nKey
       } )
//...fim do comando hb_gtInfo.
   

Return

Function Fim()
DbCloseAll()
Quit

Outra alternativa (caso não queira usar o INKEYFILTER ) é colocar antes do READ um SET KEY 16 TO COLAR() // Ctrl-P

E acionar a função abaixo que tb funciona.

Código: Selecionar todos

//-------------------------------------------
Function Colar()
//-------------------------------------------
cTexto=hb_GtInfo( HB_GTI_CLIPBOARDDATA )
cNome=ctexto
get=getactive()
get:VarPut(cTexto)
get:UpdateBuffer()
Return   

Anexei o arquivo já compilado, só renomear para .EXE e executar caso alguém queira testar sem ter que compilar o código acima.

Copia / Colar no HARBOUR

Enviado: 23 Jul 2022 10:04
por leandrolinauer
Bom dia a todos
Estou usando o código abaixo e agora funciona perfeitamente no HARBOUR 3.4

Código: Selecionar todos

hb_gtInfo( HB_GTI_INKEYFILTER, ;
      { | nKey |
      LOCAL nBits, lIsKeyCtrl
      nBits := hb_GtInfo( HB_GTI_KBDSHIFTS )
      lIsKeyCtrl := ( nBits == hb_BitOr( nBits, HB_GTI_KBD_CTRL ) )
      SWITCH nKey
      CASE HB_K_CLOSE
         RETURN K_ESC
      CASE K_MWBACKWARD
         RETURN K_DOWN
      CASE K_MWFORWARD
         RETURN K_UP
      CASE K_RBUTTONDOWN
         RETURN K_ESC
      CASE K_RDBLCLK
         RETURN K_ESC
      CASE K_SH_TAB
         RETURN K_UP
      CASE K_CTRL_V
         IF lIsKeyCtrl
            IF GetActive() != NIL
//               hb_GtInfo( HB_GTI_CLIPBOARDPASTE ) ///FALHA EXATAMENTE AQUI, separa em varios gets o  conteudo separado por ;
//TROQUE POR
               HB_KeyPut(hb_GtInfo( HB_GTI_CLIPBOARDDATA )) //FUNCIONA PERFEITAMENTE

               RETURN 0
            ENDIF   
         ENDIF
      CASE K_CTRL_C
         IF lIsKeyCtrl
            IF GetActive() != NIL
               hb_gtInfo( HB_GTI_CLIPBOARDDATA, Alltrim(Transform( GetActive():buffer,"")) ) 
               RETURN 0
            ENDIF
         ENDIF
      ENDSWITCH
      RETURN nKey
       } )
Valeu pessoal.

Copia / Colar no HARBOUR

Enviado: 28 Jul 2022 16:14
por leandrolinauer
Boa tarde a todos.
De volta ao problema.
o comando abaixo só copia uma parte do buffers, faltando o restante.

Código: Selecionar todos

              HB_KeyPut(hb_GtInfo( HB_GTI_CLIPBOARDDATA )) //so faz um pouco

Testando outros comandos para pegar o buffer todo, copiando esta correto porque colei no bloco de notas e foi todo o campo certinho.

Código: Selecionar todos

     hb_gtInfo( HB_GTI_CLIPBOARDDATA,  Transform( AllTrim(GetActive():buffer),"") )

Copia / Colar no HARBOUR

Enviado: 28 Jul 2022 16:40
por alxsts
Olá!

Qual o tamanho deste buffer? Qual o tamanho da variável get que recebe o conteúdo do buffer? Ela comporta o conteúdo?

Não sei se vai funcionar mas tente colocando antes de ler o buffer

Código: Selecionar todos

SET TYPEAHEAD TO 4096

Copia / Colar no HARBOUR

Enviado: 30 Jul 2022 11:28
por leandrolinauer
Bom dia alxsts.

Código: Selecionar todos

SET TYPEAHEAD TO 4096
Deu certo.

Código: Selecionar todos

cTexto=hb_GtInfo( HB_GTI_CLIPBOARDDATA )
cNome=ctexto
get=getactive()
get:VarPut(cTexto)
get:UpdateBuffer()
RETURN 0 
Também da certo, só não deixa o restante dos espaços no get quando maior

Valeu.

Copia / Colar no HARBOUR

Enviado: 30 Jul 2022 17:45
por alxsts
Olá!

Que bom que funcionou.

Note que 4096 é o limite máximo de tamanho para o buffer do teclado. Mas um get com este tamanho é pouco usual. Neste caso, melhor seria usar MemoEdit()...
Também da certo, só não deixa o restante dos espaços no get quando maior
Se entendi direito, quis dizer que se a variável do get tem tamanho 100 e colar 80 a variável do get ficará com 80... é isto? Neste caso, cole com o tamanho da variável get:

Código: Selecionar todos

cTexto := hb_GtInfo( HB_GTI_CLIPBOARDDATA )

Getactive():varPut( PadR( cTexto, Len( GetActive():buffer ) ) )
GetActive():updateBuffer()

RETURN 0

Copia / Colar no HARBOUR

Enviado: 04 Ago 2022 11:23
por leandrolinauer
Bom dia Alex.
Ficou show, funcionou blz, agora só pra incrementar mais ainda.

Código: Selecionar todos

 Getactive():VarPut( PadR( AllTrim(Getactive():VarGet()) + hb_GtInfo( HB_GTI_CLIPBOARDDATA ), Len( GetActive():buffer ) ) )
 Getactive():UpdateBuffer()
Como pegar o GET atualizado, por exemplo.
Campo EMAIL:
Valor atual: email@email.com.br
Vou acrescentar mais emails copiados do buffers, estou no GET email e atualizo para:
email@email.com.br; -> acrescento o separador ; e colo.
o código acima faz isto
email@email.com.broutroemail@email.com.br
Ou seja, o separado não vem ou qualquer outra coisa que eu tenha atualizado no GET, ele pega como era antes da atualização.
Valeu

Copia / Colar no HARBOUR

Enviado: 04 Ago 2022 17:52
por carlaoonline
Boa tarde!

A saga continua no processo de melhoria contínua:
leandrolinauer escreveu:Ficou show, funcionou blz, agora só pra incrementar mais ainda.
Com essa incrementada abaixo agora ficou assim:

o clipboard é colado a partir da posição do cursor e respeitando o estado da tecla insert, ou seja, se o cursor estiver no meio do campo então o que está antes será preservado e conforme o estado do insert o restante do cursor para frente é empurrado ou substituído.

Código enxuto:

Código: Selecionar todos

getactive():VarPut( PadR(Left(getactive():buffer,(getactive():pos()-1)) + hb_GtInfo( HB_GTI_CLIPBOARDDATA )+if(ReadInsert(),Right(getactive():buffer, Len(getactive():buffer)-(getactive():pos()-1)),Right(getactive():buffer, Len(getactive():buffer)- ((getactive():pos()-1)+len(hb_GtInfo( HB_GTI_CLIPBOARDDATA )))  )   )  , Len(getactive():buffer)) )

getactive():UpdateBuffer()
Código expandido:

Código: Selecionar todos

            cClip=hb_GtInfo( HB_GTI_CLIPBOARDDATA )
            cGetAtual=getactive():buffer
            nSize=Len(getactive():buffer)
            nPos=(getactive():pos()-1)
            cGetTemp=Left(cGetAtual,nPos) + cClip

            IF ReadInsert()
               cGetAposClip=Right(cGetAtual, nSize-nPos)
             ELSE
               cGetAposClip=Right(cGetAtual, nSize- (nPos+len(cClip))  )
            ENDIF
            cGetNovo=PadR(cGetTemp+cGetAposClip,nSize)

            getactive():VarPut(cGetNovo)
            getactive():UpdateBuffer()
Faltou só enviar o cursor para o final do clipboard inserido...

Copia / Colar no HARBOUR

Enviado: 15 Ago 2022 16:50
por leandrolinauer
Boa tarde, desculpe a demora, perfeito sua linha de codigo funcionou perfeitamente

Código: Selecionar todos

getactive():VarPut( PadR(Left(getactive():buffer,(getactive():pos()-1)) + hb_GtInfo( HB_GTI_CLIPBOARDDATA )+if(ReadInsert(),Right(getactive():buffer, Len(getactive():buffer)-(getactive():pos()-1)),Right(getactive():buffer, Len(getactive():buffer)- ((getactive():pos()-1)+len(hb_GtInfo( HB_GTI_CLIPBOARDDATA )))  )   )  , Len(getactive():buffer)) )
 getactive():UpdateBuffer()
 getactive():end()  //final do get
Valeu.