Página 1 de 2

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

Enviado: 21 Out 2007 01:54
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 + '

Enviado: 21 Out 2007 09:37
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!

Enviado: 21 Out 2007 09:48
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?

Enviado: 21 Out 2007 09:57
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.

Enviado: 21 Out 2007 10:26
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

Enviado: 21 Out 2007 10:34
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.

Enviado: 21 Out 2007 12:54
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

Enviado: 21 Out 2007 17:06
por Maligno
Alguma chance de converter?

Enviado: 21 Out 2007 19:08
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

Enviado: 21 Out 2007 19:30
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.

Enviado: 21 Out 2007 22:10
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.

Enviado: 22 Out 2007 09:35
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

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

Enviado: 22 Out 2007 11:03
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.

Enviado: 22 Out 2007 12:59
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

Enviado: 22 Out 2007 17:01
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.