Página 2 de 6

Enviado: 20 Jun 2007 15:22
por Maligno
alaminojunior escreveu:Este getcalc que mencionei, vem junto com o livro do Rick Spence.
A biblioteca PTools tem algo assim. Funciona muito bem. Mas não tenho essa função. Tive que fazer a minha.

Enviado: 16 Ago 2007 08:50
por Iwasa

Enviado: 16 Ago 2007 09:09
por janio
MARCELOG escreveu:Jânio disse:

"Olá Daniel,

Esse getsys.prg funciona também com xharbour??? Se não, como fazer essa adaptação para que funcione???

Preciso muito disso...

Jânio"

Basta usar o Style ES_RIGHT

MarceloG
Olá Marcelo,

Nunca ouvi falar nesse 'Style ES_RIGTH'. Como se usa isso no xharbour???

Jânio

Enviado: 19 Out 2007 11:29
por João Luiz
Olá.. Eolo

Gostaria de saber se vc conseguiu fazer com que a gets numericas fosse gigitadas da direita para a esquerda e se vc poderia me ajudar com esta função.. obrigado

Enviado: 19 Out 2007 12:21
por alaminojunior
Desculpem a pequena demora, mas ta aí a danada ( a rotina e o header ), foi o Rick Spence quem escreveu.

Código: Selecionar todos

/***
* GetCalc.prg
*
* Calculator style input
*/

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

FUNCTION GetCalcTest

LOCAL nVar1 := 0,  ;
      nVar2 := 0,  ;
      cVar2 := Space(12), ;
      nVar3 := 0

LOCAL GetList := {}

  CLEAR SCREEN
  @ 10, 10 SAY "Enter nVar1" GET nVar1 CALC
  @ 11, 10 SAY "Enter nVar2" GET nVar2 CALC
  @ 12, 10 SAY "Enter cVar2" GET cVar2 CALC
  @ 13, 10 SAY "Enter nVar3" GET nVar3

  READ

RETURN NIL


proc GetCalc( oGet )

  // read the GET if the WHEN condition is satisfied
  IF ( GetPreValidate(oGet) )
    // activate the GET for reading
    oGet:SetFocus()

    // RS added this
    // Start at last position
    oGet:end()
    // Just to here

    DO WHILE ( oGet:exitState == GE_NOEXIT )
      // check for initial typeout (no editable positions)
      IF ( oGet:typeOut )
        oGet:exitState := GE_ENTER
      ENDIF

      // apply keystrokes until exit
      DO WHILE ( oGet:exitState == GE_NOEXIT )
        GetCalcApplyKey(oGet, InKey(0))
      ENDDO

      // disallow exit if the VALID condition is not satisfied
      IF ( !GetPostValidate(oGet) )
        oGet:exitState := GE_NOEXIT
      ENDIF
    ENDDO
    // de-activate the GET
    oGet:KillFocus()
  ENDIF

RETURN


/***
* GetCalcApplyKey()
* Apply a single Inkey() keystroke to a GET.
*
* NOTE: GET must have focus.
* Standard stuff. RS changed only BS and otherwise
*/

#define K_UNDO          K_CTRL_U

proc GetCalcApplyKey(oGet, nKey)

local cKey
local bKeyBlock
local cTemp
local nTemp

  // check for SET KEY first
  IF (bKeyBlock := SetKey(nKey)) <> NIL
    GetDoSetKey(bKeyBlock, oGet)
    RETURN                              // NOTE
  ENDIF

  DO CASE
    CASE nKey == K_UP
      oGet:exitState := GE_UP

    CASE nKey == K_SH_TAB
      oGet:exitState := GE_UP

    CASE nKey == K_DOWN
      oGet:exitState := GE_DOWN

    CASE nKey == K_TAB
      oGet:exitState := GE_DOWN

    CASE nKey == K_ENTER
      oGet:exitState := GE_ENTER

    CASE nKey == K_ESC
      IF Set(_SET_ESCAPE)
        oGet:undo()
        oGet:exitState := GE_ESCAPE
      ENDIF

    CASE nKey == K_PGUP
      oGet:exitState := GE_WRITE

    CASE nKey == K_PGDN
      oGet:exitState := GE_WRITE

    CASE nKey == K_CTRL_HOME
      oGet:exitState := GE_TOP

    // both ^W and ^End terminate the READ (the default)
    CASE nKey == K_CTRL_W
      oGet:exitState := GE_WRITE

    CASE nKey == K_UNDO
      oGet:Undo()

    CASE nKey == K_BS .OR. nKey == K_DEL
      oGet:delete()
      IF oGet:type == "C"
        cTemp := oGet:unTransform()
        cTemp := " " + Substr(cTemp, 1, Len(cTemp) - 1)
        oGet:buffer := Transform(cTemp, oGet:picture)
      ELSE
        nTemp := oGet:unTransform()
        IF At(".", oGet:buffer) != 0
          // There is a decimal point
          nTemp := nTemp / 10
        ELSE
          // No decimal point, division already taken place
          // by deleting last character
        ENDIF
        oGet:buffer := Transform(nTemp, oGet:picture)
      ENDIF
      oGet:display()

    OTHERWISE
      IF (nKey >= Asc('0') .AND. nKey <= Asc('9')) .OR. ;
          (nKey == Asc('.') .AND. ;
           oGet:type == "C" .AND. At(".", oGet:buffer) == 0)

        cKey := Chr(nKey)
        IF oGet:type == "C"
          cTemp := oGet:unTransform()
          cTemp := SubStr(cTemp, 2) + " "
          oGet:buffer := Transform(cTemp, oGet:picture)
        ELSE
          nTemp := oGet:unTransform()
          nTemp := nTemp * 10
          oGet:buffer := Transform(nTemp, oGet:picture)
        ENDIF
        // NOTE - important to use OverStrike here to set changed
        // Alternative is to stuff key yourself. However, that does
        // not set changed, therefore var is not updated.
        oGet:overStrike(cKey)
        oGet:end()
        oGet:display()
    ENDIF
  ENDCASE

RETURN

Código: Selecionar todos

/***
* Getcalc.ch
*
* Definition of GET CALCULATOR command.
*/

#command @ <row>, <col> GET <var>                             ;
                        [<clauses,...>]                       ;
                        CALCULATOR                            ;
                        [<moreClauses,...>]                   ;
                                                              ;
      => @ <row>, <col> GET <var>                             ;
                        [<clauses>]                           ;
                        SEND reader := {|oGet|                ;
                                        GetCalc(oGet) }       ;
                        [<moreClauses>]

Enviado: 19 Out 2007 19:51
por clodoaldomonteiro
Alamino!

Também estou interessado em alterar a direção dos get numéricos e testei a sua função mais tive os seguintes problemas:

- Não aceitou a mascara @E;
- Quando enche o campo o foco deveria saltar para o próxomo campo e no entando, inicialmente o tamanho do get é aumentado e depois é colocado asteriscos "*".

Você conseguiu corrigir esses erros?

Enviado: 20 Out 2007 03:04
por clodoaldomonteiro
Olá amigos!

Meu getsys foi alterado pela GAS, e usei as informações deste post (colocadas pelo Daniel) para implementar esse getsys e colocar a opção de get numérico rolando da direita para a esquerda e ficou muito bom mesmo.

Havia um tempo que queria fazer isso e graças a todos vocês tá tudo rodando perfeitamente.

Um agradecimento especial ao Daniel que colocou os códigos do getsys modificado aqui, valeu mesmo.

Agora vou postar o getsys do GAS com as alterações no forum da Gas Informática, para que todos os usuários GAS possam usufruir dessa modificação.

Enviado: 20 Out 2007 08:38
por juniorcamilo
Ola amigos. eu testei o getsys do Daniel em meu sistema funcionou muito bem, so por um fato, em um certo get meu na tela de venda eu pesso para digitar o valor pago para mostrar o Troco, ai c por acaso na relacao de itens tiveres varios itens com quantidade 3 casas decimais * preço de venda 2 casas decimas e ainda desconto de porcentagem da uma dizima que a funcao nao compreende nao tive tempo de estudar este caso mas vi acontecer.. o valor pago no cujo get é recebindo com dizima e mostrado com 2 casas decimais, mas quando Teclo ENTER parece que ele no 'validade' acha que eu estou digitando valor menor que o total da venda ai ele diz total pago nao deve ser menor que a da venda.. Boiei mesmo....rsrsr

Enviado: 20 Out 2007 16:12
por janio
Daniel escreveu:
janio escreveu:
Olá Daniel,

Esse getsys.prg funciona também com xharbour??? Se não, como fazer essa adaptação para que funcione???

Preciso muito disso...

Jânio
Ola Jânio

Ela funciona em xHarbour sem ter que mexer em nada.
Daniel,

Essa função nao tá funcionando com Pict "@R" em variaveis NUMERICAS. Em variáveis CARACTER tá ok.

Exemplo:

Com pict "@R 99999-9", o numero 123456 fica 1234-6

Como consertar??

Jânio

Enviado: 22 Out 2007 08:41
por Daniel
Jânio

eu testei aqui não achei erro. vc pode esta declarando a variavel com tamanho menor.

Enviado: 22 Out 2007 09:22
por janio
Daniel escreveu:Jânio
vc pode esta declarando a variavel com tamanho menor.
Tamanho menor??? Não entendi. Variávies NUMERICAS se inicia com ZERO sem especificar tamanho, tipo nVARIAVEL := 0.

É o que eu faço.

Jânio

Enviado: 22 Out 2007 09:59
por Daniel
Jânio

testei aqui como vc falou, mais so deu erro quando usa ponto decimal. este erro tambem deu em clipper sem esta funcao.

usei este exemplo para testar
Cls
x:= Space(6)
x1:= Space(8)
x2:= 0
@ 8, 12 Say "Teste" Get x Picture "@r 99999-9"
@ 10, 12 say "Teste" Get x1
@ 12, 12 say "Teste" Get x2 Picture "9999999"
Read
@ 14, 12 say x
@ 16, 12 say x1 Picture "@R 999999-99"
@ 18, 12 say x2 Picture "@R 99999-99"
inkey(0)
aqui deu certo

Cls
x:= Space(6)
x1:= Space(8)
x2:= 0
@ 8, 12 Say "Teste" Get x Picture "@r 99999-9"
@ 10, 12 say "Teste" Get x1
@ 12, 12 say "Teste" Get x2 Picture "@e 99,999.99"
Read
@ 14, 12 say x
@ 16, 12 say x1 Picture "@R 999999-99"
@ 18, 12 say x2 Picture "@R 9999-99"
inkey(0)
aqui deu erro como vc falou

Enviado: 22 Out 2007 10:36
por janio
Daniel escreveu:Jânio

usei este exemplo para testar
Cls
x:= Space(6)
x1:= Space(8)
x2:= 0
@ 12, 12 say "Teste" Get x2 Picture "9999999"
Read
@ 18, 12 say x2 Picture "@R 99999-99"
inkey(0)
aqui deu certo

x2:= 0
@ 12, 12 say "Teste" Get x2 Picture "@e 99,999.99"
Read
@ 18, 12 say x2 Picture "@R 9999-99"
inkey(0)
Colega Daniel,

Veja no seu exemplo que vc 'getou' PICT "9999999" e "@e 99,999.99" na variável x2 (única numérica).

Não é este o meu caso! O meu problema estar em getar variáveis numéricas com PICT "@R". PICT "@R" em variáveis CARACTER tá ok aqui também.

Faça o teste assim:
x2:= 0
@ 12, 12 say "Teste" Get x2 Picture "@R 999999-9"
Read

Digite: 123456 e pressione <ENTER>. Vc vai ver que ficou assim: 1234-6, ou seja, 'comeu' o 5.

Jânio

Enviado: 23 Out 2007 14:30
por TerraSoftware
Alguem sabe como isolar no codigo fonte do daniel somente o algoritimo responsável pelo get numérico?

Outra coisa: usando o fonte em questão a tecla Backspace naum funcionou nos get´s numéricos com decimais. Alguem pode me ajudar com relacao a isso?

Enviado: 23 Out 2007 16:23
por diogenes_varela
Digite: 123456 e pressione <ENTER>. Vc vai ver que ficou assim: 1234-6, ou seja, 'comeu' o 5.
Comigo saiu tudo normal: 12345-6