Clipper On Line • Ver Tópico - Copia / Colar no HARBOUR

Copia / Colar no HARBOUR

Projeto Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

 

Copia / Colar no HARBOUR

Mensagempor alxsts » 07 Jun 2022 01:44

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...
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2945
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Copia / Colar no HARBOUR

Mensagempor carlaoonline » 07 Jun 2022 16:04

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.

// 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.

//-------------------------------------------
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.
Anexos
prog.zip
NÃO É ZIP, RENOMEIE PARA .EXE
(410 KiB) Baixado 37 vezes
Avatar de usuário

carlaoonline
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 190
Data de registro: 24 Ago 2014 22:38
Cidade/Estado: Porto Alegre-RS
Curtiu: 73 vezes
Mens.Curtidas: 22 vezes

Copia / Colar no HARBOUR

Mensagempor leandrolinauer » 23 Jul 2022 10:04

Bom dia a todos
Estou usando o código abaixo e agora funciona perfeitamente no HARBOUR 3.4
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.
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
leandrolinauer
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 375
Data de registro: 16 Out 2006 10:59
Cidade/Estado: Paranaíba-MS
Curtiu: 0 vez
Mens.Curtidas: 12 vezes

Copia / Colar no HARBOUR

Mensagempor leandrolinauer » 28 Jul 2022 16:14

Boa tarde a todos.
De volta ao problema.
o comando abaixo só copia uma parte do buffers, faltando o restante.

              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.
     hb_gtInfo( HB_GTI_CLIPBOARDDATA,  Transform( AllTrim(GetActive():buffer),"") )
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
leandrolinauer
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 375
Data de registro: 16 Out 2006 10:59
Cidade/Estado: Paranaíba-MS
Curtiu: 0 vez
Mens.Curtidas: 12 vezes

Copia / Colar no HARBOUR

Mensagempor alxsts » 28 Jul 2022 16:40

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
SET TYPEAHEAD TO 4096
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2945
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Copia / Colar no HARBOUR

Mensagempor leandrolinauer » 30 Jul 2022 11:28

Bom dia alxsts.
SET TYPEAHEAD TO 4096

Deu certo.

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.
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
leandrolinauer
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 375
Data de registro: 16 Out 2006 10:59
Cidade/Estado: Paranaíba-MS
Curtiu: 0 vez
Mens.Curtidas: 12 vezes

Copia / Colar no HARBOUR

Mensagempor alxsts » 30 Jul 2022 17:45

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:
cTexto := hb_GtInfo( HB_GTI_CLIPBOARDDATA )

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

RETURN 0
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2945
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Copia / Colar no HARBOUR

Mensagempor leandrolinauer » 04 Ago 2022 11:23

Bom dia Alex.
Ficou show, funcionou blz, agora só pra incrementar mais ainda.
 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
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
leandrolinauer
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 375
Data de registro: 16 Out 2006 10:59
Cidade/Estado: Paranaíba-MS
Curtiu: 0 vez
Mens.Curtidas: 12 vezes

Copia / Colar no HARBOUR

Mensagempor carlaoonline » 04 Ago 2022 17:52

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:
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:
            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...
Avatar de usuário

carlaoonline
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 190
Data de registro: 24 Ago 2014 22:38
Cidade/Estado: Porto Alegre-RS
Curtiu: 73 vezes
Mens.Curtidas: 22 vezes

Copia / Colar no HARBOUR

Mensagempor leandrolinauer » 15 Ago 2022 16:50

Boa tarde, desculpe a demora, perfeito sua linha de codigo funcionou perfeitamente
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.
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
leandrolinauer
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 375
Data de registro: 16 Out 2006 10:59
Cidade/Estado: Paranaíba-MS
Curtiu: 0 vez
Mens.Curtidas: 12 vezes

Anterior



Retornar para Harbour

Quem está online

Usuários vendo este fórum: Google [Bot] e 8 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro