Clipper On Line • Ver Tópico - Comando copiar
Página 1 de 1

Comando copiar

MensagemEnviado: 28 Abr 2016 09:12
por Daiane
Olá colegas,
alguém saberia me informar como posso copiar o conteúdo armazenado em campos editáveis da minha tela de cadastro?
minha ideia é o seguinte,tenho 4 campos e preciso copiar os valores armazenados nesses campos,quero criar um botão que copie de vez esses valores.

estava querendo usar o chr(3) q tem a mesma função do ctrl + c
mas não sei como posso utilizar.
se houver algum exemplo de explicação eu agradeço.

fiz uma pesquisa,mas so encontrei uma maneira de copiar arquivos :(

Comando copiar

MensagemEnviado: 28 Abr 2016 09:53
por viniciuspc
não captei a sua duvida :%

Você possui uma tela com 4 campos e deseja salvar o conteúdo em um arquivo ou tabela, é isso?

[]´s

Comando copiar

MensagemEnviado: 28 Abr 2016 09:56
por Daiane
não, na verdade é assim suponha que: ]Campo1:= 1234 Campo2:= 5678 Campo3 9874 Campo4:=6532
quero criar um botão que copie dessa forma 1234567898746532
para eu poder colar em outra tela de cadastro.

entendeu?
basicamente quero usar o crtl C + ctrl V. so q sem digitar no teclado e sim num simples botão ele faria isso,entendeu?

Comando copiar

MensagemEnviado: 28 Abr 2016 10:07
por viniciuspc
Ok,

Se os campos forem do tipo carácter, basta concatenar retirando os espaços em branco. Se for numérico, você deve converter primeiro.

Então, o botão chama uma função assim:

Campo5 := Alltrim(Campo1)+Alltrim(Campo2)+Alltrim(Campo3)+Alltrim(Campo4) && caso seja carácter

OU

Campo5 := Alltrim(Str(Campo1)))+Alltrim(Str(Campo2))+Alltrim(Str(Campo3))+Alltrim(Str(Campo4)) && caso seja numérico

Neste exemplo, Campo5 será do tipo carácter.

seria isso?

[]´s

Comando copiar

MensagemEnviado: 28 Abr 2016 10:38
por Jairo Maia
Olá Daiane,

Veja se esse exemplo ajuda. Note que considerei os campos como caractere, se um ou mais for numérico precisa fazer como o Vinícius colocou acima.

Nota: Veja no exemplo as funções Copiar() e Colar(). Espero que ajude...
#include "inkey.ch"  // arquivo com definições das teclas

Function Main()

Local nCtrlC:=SetKey( K_CTRL_C, { || Copiar() } )
Local nCtrlV:=SetKey( K_CTRL_V, { || Colar() } )

Private cCampo1, cCampo2, cCampo3, cCampo4, cBuffer, cResultado:=Space(20)

Clear Screen

cCampo1 := "1234   "
cCampo2 := "5678   "
cCampo3 := "9874   "
cCampo4 := "6532   "

@ 3,10 Say "Pressione CTRL+C para copiar os campos, e depois ESC para sair"

@ 5,10 Say "Campo1:" Get cCampo1
@ 6,10 Say "Campo2:" Get cCampo2
@ 7,10 Say "Campo3:" Get cCampo3
@ 8,10 Say "Campo4:" Get cCampo4
Read

@ 12,10 Say "==> Pressione CTRL+V para colar o resultado"
@ 15,10 Say "Resultado:" Get  cResultado
Read

SetKey( K_CTRL_C, nCtrlC )
SetKey( K_CTRL_V, nCtrlV )

Return Nil

Function Copiar()
cBuffer := AllTrim( M->cCampo1 ) + AllTrim( M->cCampo2 ) + AllTrim( M->cCampo3 ) + AllTrim( M->cCampo4 )
Return

Function Colar()
Clear TypeaHead
KeyBoard cBuffer
Return Nil

Comando copiar

MensagemEnviado: 28 Abr 2016 10:58
por Daiane
Obrigada pelas respostas.
Jairo Maia,neste exemplo que vc mostrou teria como copiar e colar no Notepad ou em qualquer arquivo texto ?
pq na verdade preciso copiar para colar numa outra aplicação que tem o mesmo cadastro,entende?

Comando copiar

MensagemEnviado: 28 Abr 2016 12:20
por Toledo
Veja se este código copia para a área de transferência:

Function Copiar()
   cBuffer := AllTrim( M->cCampo1 ) + AllTrim( M->cCampo2 ) + AllTrim( M->cCampo3 ) + AllTrim( M->cCampo4 )
   HB_GTINFO( HB_GTI_CLIPBOARDDATA, cBuffer)
Return


Abraços,

Comando copiar

MensagemEnviado: 28 Abr 2016 13:09
por Jairo Maia
Olá Pessoal,

Toledo, funcionou certinho. Show de bola...

Apenas uma OBSERVAÇÃO:

Para que o exemplo funcione corretamente, precisa acrescentar no início do exemplo a linha:
#include "hbgtinfo.ch"
E ao compilar acrescentar a lib: -lgtwvg
:-Y

Comando copiar

MensagemEnviado: 28 Abr 2016 14:13
por Daiane
Peço mais uma vez ajuda aos caros colegas pois fiz e não ta copiando
coloquei um print p ver se estava sendo chamado a rotina copiar e não está
Vou deixar o código caso alguém possa dar uma olhada.

outro detalhe é que dar erro no Clear TypeHead, o sistema para de funcionar fica travando e não sai

*Prg para teste de Copiar e colar dados

#include "FiveWin.ch"
#include "inkey.ch"
#include "hbgtinfo.ch"

static TesteInkey
//----------------------------------------------------------------------------//

CLASS TesteInkey FROM JanDlg
    export:
       METHOD getInstance(oWnd)
       METHOD BuildDlg()
    hidden:
      METHOD New(oWnd) CONSTRUCTOR
      METHOD DeleteW()
      METHOD Copiar()
      METHOD Colar()
      
      DATA xCampo1,xCampo2,xCampo3,xCampo4,xCampo5,xCampo6
      DATA gCampo1,gCampo2,gCampo3,gCampo4,gCampo5,gCampo6
      DATA bCopiar, bColar ,cBuffer

     

ENDCLASS

//----------------------------------------------------------------------------//

METHOD getInstance(oWnd)  CLASS TesteInkey

   IF TesteInkey = nil
      TesteInkey := ::New(oWnd,"#8041",325,130,"Teste Inkey")
   ELSE
      TesteInkey:oChld:SetFocus()
   ENDIF
return TesteInkey 

//------------------------------------------------------------------------------
METHOD New(oWind,cIcone,vLarg,vAlt,cTitulo) CLASS TesteInkey
   super:New(oWind,cIcone,vLarg,vAlt,cTitulo)
   
   ACTIVATE DIALOG ::oDlg NOMODAL VALID ( TesteInkey:oChld:End(), .t.)
RETURN self
//------------------------------------------------------------------------------
METHOD BuildDlg(oWnd) CLASS TesteInkey
     local nCtrlC:= SetKey( K_CTRL_C, { || ::Copiar() } )
   local nCtrlV:= SetKey( K_CTRL_V, { || ::Colar() } )
   
   DEFINE DIALOG ::oDlg RESOURCE "#1161" OF ::oChld
   
   Clear Screen
      
   ::xCampo1 := "1234"
   ::xCampo2 := "5678"
   ::xCampo3 := "4679"
   ::xCampo4 := "9564"
   ::xCampo5 := "3256"
   
   REDEFINE GET      ::gCampo1   VAR ::xCampo1  ID 4001 OF ::oDlg
   REDEFINE GET      ::gCampo2   VAR ::xCampo2  ID 4002 OF ::oDlg
   REDEFINE GET      ::gCampo3   VAR ::xCampo3  ID 4003 OF ::oDlg
   REDEFINE GET      ::gCampo4   VAR ::xCampo4  ID 4004 OF ::oDlg
   REDEFINE GET      ::gCampo5   VAR ::xCampo5  ID 4005 OF ::oDlg
   REDEFINE GET      ::gCampo6   VAR ::xCampo6  ID 4006 OF ::oDlg 
   

   SetKey( K_CTRL_C, nCtrlC )
   SetKey( K_CTRL_V, nCtrlV )
   
return Nil
//------------------------------------------------------------------------------
METHOD DeleteW() CLASS TesteInkey
   TesteInkey:= nil
return .T.
//------------------------------------------------------------------------------
METHOD Copiar() CLASS TesteInkey
  ::cBuffer := AllTrim( ::xCampo1 ) + AllTrim( ::xCampo2 ) + AllTrim( ::xCampo3 ) + AllTrim( ::xCampo5 ) + AllTrim( ::xCampo6 )
  HB_GTINFO( HB_GTI_CLIPBOARDDATA, ::cBuffer)
Return
//------------------------------------------------------------------------------   
METHOD Colar() CLASS TesteInkey
    Clear TypeaHead
    KeyBoard ::cBuffer
return Nil   

Comando copiar

MensagemEnviado: 28 Abr 2016 14:43
por viniciuspc
Interessante, não conhecia este comando!

http://www.pctoledo.com.br/forum/viewtopic.php?p=72440

mas apenas no modo gráfico? não teria no harbour/DOS puro?

[]´s

Comando copiar

MensagemEnviado: 28 Abr 2016 14:55
por Daiane
Sera q é alguma biblioteca? ou pelo fato deu usar o fivewin?
pois não adiantou,nem copiou e nem colou

Comando copiar

MensagemEnviado: 28 Abr 2016 17:01
por Jairo Maia
Olá Pessoal,

viniciuspc escreveu:mas apenas no modo gráfico? não teria no harbour/DOS puro?
Vinícius, apesar do exemplo usar hbgtinfo.ch e a lib gtwvg, ele está em Harbour/DOS (Console) puro.

Daiane escreveu:Sera q é alguma biblioteca? ou pelo fato deu usar o fivewin?
Daiane, biblioteca creio que não, se não daria falta de função. Quanto a ser em FiveWin, não sei nada de FiveWin. Vamos aguardar algum colega que conhece FiveWin e ver se dá uma luz...

Comando copiar

MensagemEnviado: 28 Abr 2016 17:05
por asimoes
Daiane,

O fórum mais apropriado para as suas duvidas é o fiveWin http://www.pctoledo.com.br/forum/viewforum.php?f=2

Comando copiar

MensagemEnviado: 29 Abr 2016 09:37
por Daiane
Olá pessoal,muito obrigada pela ajuda de vocês
Enfim encontrei a solução para copiar para o clipboard do windows
muito simples e fácil

METHOD Copiar() CLASS TesteInkey

Define ClipBoard oCop Of ::oDlg

oCop:clear()

oCop:setText( AllTrim( ::xCampo1 ) + AllTrim( ::xCampo2 ) + AllTrim( ::xCampo3 ) + AllTrim( ::xCampo5 ) + AllTrim( ::xCampo6 ) )

Return .t.

Comando copiar

MensagemEnviado: 02 Mai 2016 09:59
por viniciuspc
Jairo Maia escreveu:
viniciuspc escreveu:mas apenas no modo gráfico? não teria no harbour/DOS puro?

Vinícius, apesar do exemplo usar hbgtinfo.ch e a lib gtwvg, ele está em Harbour/DOS (Console) puro.


Obrigado Jairo! :)Pos

Sempre utilizei o famigerado menu de contexto da janela DOS para o Edit->Copy e Edit->Past! não sabia que existia algo assim para o DOS Puro!

Então, fiz uma função bem genérica que atende um pouco os get´s normais!

Function Ctrl_C()
******** **************************************************
* copia o conteudo de um get para a area de transferencia *
* http://www.pctoledo.com.br/forum/viewtopic.php?p=72440
* http://pctoledo.com.br/forum/viewtopic.php?f=4&p=105627#p105627
* Problema : Ctrl + C = PgDn, Ctrl-ScrollLock no inkey.ch       *
*            então temos que diferenciar
***********************************************************
local cVar:=''
If IsKeyCtrl()
   if GetActive():type == 'N'
      cVar:=Alltrim(Str(GetActive():varGet()))
   Elseif GetActive():type == 'D'
      cVar:=Alltrim(DTOC(GetActive():varGet()))
   else
      cVar:=Alltrim(GetActive():varGet())
   Endif
Endif   
IF !EMPTY(cVar)
   Ctrl_C_Var(cVar)
ENDIF   
Return

Function Ctrl_C_Var(cVar)
******** ********************************************************
* copia o conteudo de uma variavel para a area de transferencia *
*****************************************************************
IF !EMPTY(cVar)
   HB_GTINFO( HB_GTI_CLIPBOARDDATA, cVar )
ENDIF   
Return
         
Function Ctrl_V()
******** ********************************************************
* cola um conteudo da area de transferencia para o GET corrente *
* PROBLEMA : CTRL + V = Ins no inkey.ch!                        *
* então devemos diferenciar se a tecla CTRL foi pressionada     *
*****************************************************************
local cVar:=''
local lIns
If IsKeyCtrl()
   Clear TypeaHead
   cVar:=Alltrim(HB_GTINFO( HB_GTI_CLIPBOARDDATA))
   keyboard cVar
Else
   lIns := ReadInsert()  && retorna o estado do Ins
   ReadInsert(.not.lIns) && alterna o estado do Ins
   KSETINS(.not.lIns)    && ct.lib
Endif   
return

Function IsKeyCtrl()
******** *************************************************
* http://www.pctoledo.com.br/forum/viewtopic.php?p=72440 *
* verificar se a tecla CTRL foi pressionada!             *
**********************************************************
Local nBits := hb_gtinfo( HB_GTI_KBDSHIFTS )
Return nBits == hb_bitor( nBits, HB_GTI_KBD_CTRL )


Utilizando os set´s abaixo no main!

set key K_CTRL_C to Ctrl_C()
set key K_CTRL_V to Ctrl_V()


e incluindo

#include "hbgtinfo.ch"

A parte de colar ficou genérica gracas ao keyboard, pois basta mandar o conteúdo da área de transferência para o teclado! isto pode gerar um problema caso o conteúdo extrapole o tamanho do campo.... mas vai dar para o gasto!

O problema ficou com o comando de copiar.. pois ele funciona apenas na classe get. e gostaria de utilizar ele na classe browse (Tbrowse), isto é fácil de resolver criando uma função de copiar para cada classe, e alterar o set key dependendo de qual classe utilizar! mais ai deixa de ser genérica e passa a ser mais especifica! mas não sei como saber se tem algum objeto browse ativo ou não... existe isso?

Fui claro?

:xau