Copia / Colar no HARBOUR
Moderador: Moderadores
-
alxsts
- Colaborador

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
Copia / Colar no HARBOUR
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...
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)
Alexandre Santos (AlxSts)
- carlaoonline
- Usuário Nível 3

- Mensagens: 190
- Registrado em: 24 Ago 2014 22:38
- Localização: Porto Alegre-RS
Copia / Colar no HARBOUR
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.
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.
Anexei o arquivo já compilado, só renomear para .EXE e executar caso alguém queira testar sem ter que compilar o código acima.
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.
- Anexos
-
prog.zip- NÃO É ZIP, RENOMEIE PARA .EXE
- (410 KiB) Baixado 252 vezes
-
leandrolinauer
- Usuário Nível 3

- Mensagens: 413
- Registrado em: 16 Out 2006 10:59
- Localização: Paranaíba-MS
Copia / Colar no HARBOUR
Bom dia a todos
Estou usando o código abaixo e agora funciona perfeitamente no HARBOUR 3.4
Valeu pessoal.
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
} )
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
-
leandrolinauer
- Usuário Nível 3

- Mensagens: 413
- Registrado em: 16 Out 2006 10:59
- Localização: Paranaíba-MS
Copia / Colar no HARBOUR
Boa tarde a todos.
De volta ao problema.
o comando abaixo só copia uma parte do buffers, faltando o restante.
Testando outros comandos para pegar o buffer todo, copiando esta correto porque colei no bloco de notas e foi todo o campo certinho.
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
Código: Selecionar todos
hb_gtInfo( HB_GTI_CLIPBOARDDATA, Transform( AllTrim(GetActive():buffer),"") )
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
-
alxsts
- Colaborador

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
Copia / Colar no HARBOUR
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
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[]´s
Alexandre Santos (AlxSts)
Alexandre Santos (AlxSts)
-
leandrolinauer
- Usuário Nível 3

- Mensagens: 413
- Registrado em: 16 Out 2006 10:59
- Localização: Paranaíba-MS
Copia / Colar no HARBOUR
Bom dia alxsts.
Deu certo.
Também da certo, só não deixa o restante dos espaços no get quando maior
Valeu.
Código: Selecionar todos
SET TYPEAHEAD TO 4096
Código: Selecionar todos
cTexto=hb_GtInfo( HB_GTI_CLIPBOARDDATA )
cNome=ctexto
get=getactive()
get:VarPut(cTexto)
get:UpdateBuffer()
RETURN 0
Valeu.
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
-
alxsts
- Colaborador

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
Copia / Colar no HARBOUR
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()...
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()...
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:Também da certo, só não deixa o restante dos espaços no get quando maior
Código: Selecionar todos
cTexto := hb_GtInfo( HB_GTI_CLIPBOARDDATA )
Getactive():varPut( PadR( cTexto, Len( GetActive():buffer ) ) )
GetActive():updateBuffer()
RETURN 0[]´s
Alexandre Santos (AlxSts)
Alexandre Santos (AlxSts)
-
leandrolinauer
- Usuário Nível 3

- Mensagens: 413
- Registrado em: 16 Out 2006 10:59
- Localização: Paranaíba-MS
Copia / Colar no HARBOUR
Bom dia Alex.
Ficou show, funcionou blz, agora só pra incrementar mais ainda.
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
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()
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)
- carlaoonline
- Usuário Nível 3

- Mensagens: 190
- Registrado em: 24 Ago 2014 22:38
- Localização: Porto Alegre-RS
Copia / Colar no HARBOUR
Boa tarde!
A saga continua no processo de melhoria contínua:
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 expandido:
Faltou só enviar o cursor para o final do clipboard inserido...
A saga continua no processo de melhoria contínua:
Com essa incrementada abaixo agora ficou assim:leandrolinauer escreveu:Ficou show, funcionou blz, agora só pra incrementar mais ainda.
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: 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()
-
leandrolinauer
- Usuário Nível 3

- Mensagens: 413
- Registrado em: 16 Out 2006 10:59
- Localização: Paranaíba-MS
Copia / Colar no HARBOUR
Boa tarde, desculpe a demora, perfeito sua linha de codigo funcionou perfeitamente
Valeu.
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
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)