Mostrar ajuda num box a cada get, tipo o hint do Delphi

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Mostrar ajuda num box a cada get, tipo o hint do Delphi

Mensagem por clodoaldomonteiro »

Olá amigos!

Há poucos dias com a ajuda de vocês consegui colocar os gets numéricos para avançar da direita para a esquerda, então tomei a liberdade de modificar o getsys postado pelo Daniel e colocar uma ajuda a cada GET, ou seja, a medida em que o opegador vai navegando pelos GETs vai aparecendo um box com uma informação previamente definida pelo programador.

Para que isso podesse acontecer, foi criado um comando chamado AJUDA no formato ( AJUDA "Help a informar para o usuário" ), que está no arquivo teste.ch.
Para quebrar as linhas, basta colocar um "|" na frase, que a função dbox vai quebrar a menssagem a ser passada ao usuário, Ex:

Código: Selecionar todos

@ 1,1 GET mCampo ;
         Pict "@!";
         Vali mCampo $ 'MF'
         AJUDA 'Sexo:|   Masculino|Feminino'
READ

...vai aparecer assim:

[_]  <---- //campo a getar 
 +-------------+   <---- //ajuda mostrada na tela
 |Sexo:        |
 |  Masculino  |
 |  Feminino   |
 +-------------+



Para o box ser mostrado na tela, usei a lib do GAS (GASP52PM.LIB), que contém as funções CONTA() e DBOX().

Deverá ser usadas também as variáveis DRVxxx. que contém as informações das cores usadas na função DBOX.

Abaixo segue os arquivos:

Arquivo TESTE.CH

Código: Selecionar todos

/*
   Comandos criados para auxiliar o comando GET para receber mais outros
   parametro e armazenar na variavel de instancia "CARGO". Este artificio
   e' usado para guardar o texto de ajuda.
   Criador : Clodoaldo Monteiro
   Rotinas do GASDOS
*/

#command AJUDA <var>     =>  STORECARGO(<var>,ATAIL(getlist),1)
Arquivo TESTE.PRG (para demonstrar o uso do comando AJUDA)

Código: Selecionar todos

#include "Getexit.ch"
#include "Inkey.ch"
#include "TESTE.ch"

LOCAL nVar1 := 0.00,  ;
nVar2 := 0,  ;
cVar2 := Space(12), ;
nVar3 := 0
LOCAL GetList := {}

// vari veis para a fun‡Æo dbox() e errorsys()
drvcara=CHR(178); mold="ÚÄ¿³ÙÄÀ³ÃÄ´"
drvmenucen=.f.
drvcorpad="W+/RB"  ; drvcorbox="W+/B"      // cores default
drvcormsg="W+/N*"  ; drvcorenf="W+/R"
drvcorget="W+/BG"  ; drvcortel="W+/B"
drvcorhlp="GR+/G"  ; drvcortna="GR/N"
drvtitpad="GR+/RB" ; drvtitbox="GR+/B"     // cores dos titulos default
drvtitmsg="GR+/N*" ; drvtitenf="GR+/R"
drvtitget="GR+/BG" ; drvtittel="GR+/B"
drvtithlp="W+/G"   ; drvtittna="W/N"

CLEAR SCREEN
@ 10, 10 SAY "Enter nVar1" GET nVar1 pict '@E 999,999,999.99'

@ 11, 10 SAY "Enter nVar2" GET nVar2 PICT '@E 999,999,999.99'
                           AJUDA 'Entre com o valor da vari vel 2'

@ 12, 10 SAY "Enter cVar2" GET cVar2 PICT '@!'
                           AJUDA 'Informe a vari vel 3'

@ 13, 10 SAY "Enter nVar3" GET nVar3 PICT '@E 999,999,999.99'

READ

RETU
Arquivo GETSYS.PRG (é a mesma getsys que o daniel postou outro dia, só que com as alterações para mostrar a ajuda a cada campo)

Código: Selecionar todos

/***
*
*  Getsys.prg
*
*  Standard Clipper 5.2 GET/READ Subsystem
*
*  Copyright (c) 1991-1993, Computer Associates International, Inc.
*  All rights reserved.
*
*  This version adds the following public functions:
*
*     ReadKill( [<lKill>] )       --> lKill
*     ReadUpdated( [<lUpdated>] ) --> lUpdated
*     ReadFormat( [<bFormat>] )   --> bFormat | NIL
*
*  NOTE: compile with /m /n /w
*
*  Alterada por : Dercide de Freitas Alvarez
*  Utilize para entrada numerica "@EZ 999,999,999.99"
*  A Barra de espaco limpa o campo
*  A acentuacao devera ser feita usando virgula e aspas simples
*  sempre antes da tecla.
*  Alterada por : Daniel Denobie
*  Picture "@M" para letras minuscula (ideia do Toledo)
*
*/

#include "Inkey.ch"
#include "Getexit.ch"

/***
*  Nation Message Constants
*  These constants are used with the NationMsg(<msg>) function.
*  The <msg> parameter can range from 1-12 and returns the national
*  version of the system message.
*/
#define _GET_INSERT_ON   7     // "Ins"
#define _GET_INSERT_OFF  8     // "   "
#define _GET_INVD_DATE   9     // "Invalid Date"
#define _GET_RANGE_FROM  10    // "Range: "
#define _GET_RANGE_TO    11    // " - "

#define K_UNDO          K_CTRL_U

//#define   O_HELP   7    // texto de ajuda on-line do campo

//
// State variables for active READ
//
STATIC sbFormat
STATIC slUpdated := .F.
STATIC slKillRead
STATIC slBumpTop
STATIC slBumpBot
STATIC snLastExitState
STATIC snLastPos
STATIC soActiveGet
STATIC scReadProcName
STATIC snReadProcLine


//
// Format of array used to preserve state variables
//
#define GSV_KILLREAD       1
#define GSV_BUMPTOP        2
#define GSV_BUMPBOT        3
#define GSV_LASTEXIT       4
#define GSV_LASTPOS        5
#define GSV_ACTIVEGET      6
#define GSV_READVAR        7
#define GSV_READPROCNAME   8
#define GSV_READPROCLINE   9

#define GSV_COUNT          9



/***
*
*  ReadModal()
*
*  Standard modal READ on an array of GETs
*
*/
FUNCTION ReadModal( GetList, nPos )

   LOCAL oGet
   LOCAL aSavGetSysVars
   LOCAL nCursor := SetCursor()

   drvautohelp=IF(TYPE("drvautohelp")!="L",.t.,drvautohelp)

   IF ( VALTYPE( sbFormat ) == "B" )
      EVAL( sbFormat )
   ENDIF

   IF ( EMPTY( GetList ) )

      // S'87 compatibility
      SETPOS( MAXROW() - 1, 0 )
      RETURN (.F.)                  // NOTE

   ENDIF

   // Preserve state variables
   aSavGetSysVars := ClearGetSysVars()

   // Set these for use in SET KEYs
   scReadProcName := PROCNAME( 1 )
   snReadProcLine := PROCLINE( 1 )

   // Set initial GET to be read
   IF !( VALTYPE( nPos ) == "N" .AND. nPos > 0 )
      nPos := Settle( Getlist, 0 )
   ENDIF

   IF READINSERT()
      SETCURSOR(2)    // modo de Inser‡„o
   ELSE
      SETCURSOR(1)    // modo normal
   ENDIF

   WHILE !( nPos == 0 )
      // Get next GET from list and post it as the active GET
      PostActiveGet( oGet := GetList[ nPos ] )
      // Read the GET
      IF ( VALTYPE( oGet:reader ) == "B" )
         EVAL( oGet:reader, oGet )    // Use custom reader block
      ELSE
         GetReader( oGet )            // Use standard reader
      ENDIF
       // Move to next GET based on exit condition
      nPos := Settle( GetList, nPos )
   ENDDO

   // Restore state variables
   SETCURSOR(nCursor)
   RestoreGetSysVars( aSavGetSysVars )

   // S'87 compatibility
   SETPOS( MAXROW() - 1, 0 )

   RETURN ( slUpdated )

   /***
   *
   *  GetReader()
   *
   *  Standard modal read of a single GET
   *
   */
PROCEDURE GetReader( oGet )
   LOCAL   nKey,cKey,cRet,original
   LOCAL press, pp, Tecl_p, ar_db:=ALIAS(), n_cp, qt_lin_hlp, lihlp, tela_hlp,;
         c_box, t_box, tmp_, vlr_defa:=.f., ncol,nrow
   PRIVATE lPrimKey := .T.
   PRIV im_aj_at_:=0
   oget:setfocus()                               // complementar entao ativa o GET
   tmp_=READVAR()
   IF !EMPT(oget:cargo) //.AND. EMPT(&tmp_.)       // se o campo esta vazio e pode ter valor inicial
      tmp_=oget:cargo
      IF VALTYPE(tmp_)="A" .AND. LEN(tmp_)>2    // se o valor definido no "cargo"
         IF !EMPT(tmp_[3]).AND.EMPT(oget:original) // e' o valor inicial
            tmp_=EVAL(&("{||"+tmp_[3]+"}"))     // pega o default
            lihlp=LEN(get:buffer)
            IF oget:picture=NIL .OR. AT("@K",oget:picture)>0 .OR. AT("@S",oget:picture)>0
               pp="@X"
            ELSE
               pp=oget:picture
            ENDI
            oget:buffer:=LEFT(TRAN(tmp_,pp)+SPAC(lihlp),lihlp)
            oget:assign()
            updated:= .T.
            vlr_defa:=.t.
         ENDI
      ENDI
   ENDI
   oget:killfocus()                            // desativa o GET
   // Read the GET if the WHEN condition is satisfied
   IF ( GetPreValidate( oGet ) )
      // Activate the GET for reading
      oGet:setFocus()
      WHILE ( oGet:exitState == GE_NOEXIT )
         lihlp=0

         IF im_aj_at_<2    // ajuda em cada campo
            IF drvautohelp .AND. !EMPT(oget:cargo)
               tmp_=oget:cargo
               IF !EMPT(tmp_[1])
                  qt_lin_hlp=CONTA("|",tmp_[1])+1 //at2() ‚ uma fun‡Æo da fast.lib
                  IF oget:row+qt_lin_hlp+3>MAXROW()
                     IF oget:row-qt_lin_hlp-3>=0
                        lihlp=oget:row-qt_lin_hlp-3
                     ENDI
                  ELSE
                     lihlp=oget:row+1
                  ENDI
                  IF lihlp>0
                     tela_hlp=SAVESCREEN(0,0,MAXROW(),79)
                     c_box=drvcorbox; t_box=drvtitbox
                     drvcorbox=drvcorhlp; drvtitbox=drvtithlp
                     DBOX(tmp_[1],lihlp,oget:col+2,,.F.)
                     drvcorbox=c_box; drvtitbox=t_box
                  ENDI
               ENDI
            ENDI
            IF im_aj_at_=1
               DISPEND()                              // apresenta tela de uma vez so
            ENDI
         ENDI
         im_aj_at_=3

        // Check for initial typeout (no editable positions)
         IF ( oGet:typeOut )
            oGet:exitState := GE_ENTER
         ENDIF
         // Tratamento para entrada Direita -> Esquerda
         IF ( oGet:type == "N" )   .And. ( Len( oGet:buffer ) > oGet:DecPos )
            oGet:Pos := Len( oGet:buffer ) + 1
            oGet:End()
            oGet:ToDecPos()
            oGet:Left()
         ELSEIF ( oGet:type == "N" )
            oGet:Pos := Len( oGet:buffer ) + 1
            oGet:End()
         ENDIF
         cKey := ''
         nKey := 0
         // Apply keystrokes until exit
         original := oGet:buffer
         WHILE ( oGet:exitState == GE_NOEXIT )
            // Armazena a tecla que foi pressionada anteriormente
            cKey := Chr(nKey)

            // Le a Pr¢xima tecla
            nKey := inkey( 0 )

            // Ajusta Caract‚r de Retorno
            IF !READINSERT()
               cRet := CHR(19)
            ELSE
               cRet := CHR(08)
            ENDIF

            // Faz o tratamento dos acentos
            IF ( oGet:type == "C" )
               *                @ 24, 10 say oGet:picture
               *                Inkey(0)
               // Virgula
               IF ( cKey = CHR(44) )

                  IF ( nKey = ASC("c") )
                     KEYBOARD cRet + '‡'
                     LOOP
                  ENDIF

                  IF ( nKey = ASC("C") )
                     KEYBOARD cRet + '€'
                     LOOP
                  ENDIF

               ENDIF

               // Aspas
               IF ( cKey = CHR(34) )
                  IF ( nKey = ASC('U') )
                     KEYBOARD cRet + 'š'
                     LOOP
                  ENDIF
                  IF ( nKey = ASC('u') )
                     KEYBOARD cRet + '
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Mensagem por janio »

Clodoaldo,

Esse getsys.prg do Daniel está com um problema quando se usa PICT "@R" (em get's) em variáveis NUMÉRICAS. Exemplo: o nr. 123456 com pict "@R 99999-9" fica 1234-6.


Sabe como resolver isso??

Jânio

PS: Excelente essa alteração que vc fez. Parabéns!
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Mensagem por clodoaldomonteiro »

Janio!
Posso tentar a correção, vou comparar com o meu getsys e ver qual a correção.

Agora, vc está getando número em um campo tipo caractere ou o campo é tipo numérico?
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Mensagem por clodoaldomonteiro »

Janio!

Acabei de fazer um teste, getando uma variável tipo caractere com a mascara '@R 999-999-999-99' e deu tudo certo.

Não testei com campos de um arquivo, só com variáveis.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Mensagem por janio »

clodoaldomonteiro escreveu:Janio!

Acabei de fazer um teste, getando uma variável tipo caractere com a mascara '@R 999-999-999-99' e deu tudo certo.

Não testei com campos de um arquivo, só com variáveis.
Clodoaldo,

Quando a varíável é tipo CARACTERE funciona normal, como antes.

O problema está sendo quando a variável é tipo NUMÉRICA

Jânio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Detalhe: a máscara "@R" foi feita para caracteres e não para números. O prório NG do Clipper diz isso.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Mensagem por janio »

Maligno escreveu:Detalhe: a máscara "@R" foi feita para caracteres e não para números. O prório NG do Clipper diz isso.
Isso foi coisa de iniciante. Na época que criei esse sistema coloquei alguns campos numéricos sem que esses campos sejam pra fazer cálculos.

Hoje não faria mais uma coisa dessas! ;)

Em todo caso, no GETSYS original e também no XHARBOUR funciona a máscara "@R" com variáveis/campos NUMERICOS.

Jânio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Alguma chance de converter?
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Mensagem por janio »

Talvez. Nao sei...

O campo em questão é para NUMERO DE CHEQUE. O banco de dados está com milhares de registros.

Jânio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

A viabilidade se limita à quantidade de campos de vários bancos, não à quantidade de registros. Se for apenas um ou outro caso, será mais fácil.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Mensagem por clodoaldomonteiro »

Janio!

O problema é que tando na getsys que o Daniel postou quanto na minha há um novo tratamento da picture (get:picture), que não existe no getsys original do clipper.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Mensagem por janio »

Maligno escreveu:A viabilidade se limita à quantidade de campos de vários bancos, não à quantidade de registros. Se for apenas um ou outro caso, será mais fácil.
Acho esse caminho mais difícil. Eu bem poderia criar um novo DBF com a mesma estrutura do antigo, mudando apenas o campo em questão para CARACTERE e fazer uma rotina para copiar os registros do antigo para o novo convertendo os registros numéricos para caractere.

Mas....

Aí eu terei que mudar o tratamento dessa variável em todos PRG's que fazem referência a esse campo. São muitos os PRG's: Recebimento de Caixa, Troca de cheque, emissão de borderaux, consulta de cheque recebido, etc, etc.

Acho mais fácil alguém (que saiba) fazer essa adaptação nesse getsys.prg.

Jânio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Re: Mostrar ajuda num box a cada get, tipo o hint do Delphi

Mensagem por Itamar M. Lins Jr. »

clodoaldomonteiro escreveu:Olá amigos!

Há poucos dias com a ajuda de vocês consegui colocar os gets numéricos para avançar da direita para a esquerda, então tomei a liberdade de modificar o getsys postado pelo Daniel e colocar uma ajuda a cada GET, ou seja, a medida em que o opegador vai navegando pelos GETs vai aparecendo um box com uma informação previamente definida pelo programador.

Qualquer coisa é só postar aqui.
Puts! rapaz essa ruma de código...
Em [x]Harbour com Hwgui é só usar no final do get:
TOOLTIP "Minha Frase"
Isso em qualquer componente.

O [x]harbour é de graça, só custa o tempo de aprender uns novos comandos a Hwgui, Minigui, etc. Que são lib gráficas tambem...
Sem falar do visual, recursos etc...

Saudações
Itamar M. Lins Jr.
Avatar do usuário
miracle
Usuário Nível 3
Usuário Nível 3
Mensagens: 117
Registrado em: 14 Jun 2007 16:28
Localização: Sao Paulo SP

Mensagem por miracle »

Tenta isso aqui:

Código: Selecionar todos

//(...)
@ nVALOR = 0
//(...)
@ 10,10 SAY "VALOR R$" GET nVALOR WHEN MSG() PICTURE "@E 999999.99"
//(...)
FUNCTION MSG
LOCAL tTELAPREVIA
LOCAL tCORPREVIA
SAVE SCREEN TO tTELAPREVIA
tCORPREVIA = SETCOLOR()
SET COLOR TO 15/16
IF READVAR() = "NVALOR" //O NOME DO CAMPO TEM QUE SER MAIUSCULO!
    @ 11,17 CLEAR TO 13,49
    @ 11,17 TO 13,49
    @ 12,19 SAY "PREENCHA COM O VALOR DO TITULO"
ENDIF
INKEY(3)
SET COLOR TO tCORPREVIA
CLEAR SCREEN
RESTORE SCREEN FROM tTELAPREVIA
RETURN(.T.)
A não ser que você queira algo diferente, acho que se você fizer assim seu problema de mostrar dicas na tela fica resolvido
Clipper 5.2e + DBFCDX + Exospace 1.0g
MARCELOG
Usuário Nível 4
Usuário Nível 4
Mensagens: 546
Registrado em: 15 Mar 2005 16:54
Localização: Divinópolis/MG

Mensagem por MARCELOG »

Eu vi originalmente essa dica no site do Anderson e até usei por um determinado tempo.
Ao receber o foco, a procedure era disparada para salvar a tela e colocar o hint no lugar certo.
Lembro de ter feito algumas alterações para deixar semi-automático o processo.
Algo como pegar o get atual, sua posição e tamanho para exibir a mensagem corretamente.
Quanto ao getsys.prg, sempre usei o original, alterando apenas método reader (acho que é isso) para obter um comportamento diferente.
Então, não dava zebra de jeito nenhum.
Dê uma olhada em www.caclipperwebsite.com, pode ser útil.

MarceloG.
Água mole em pedra dura tanto bate que até espirra!
Responder