Clipper On Line • Ver Tópico - colocar picture para digitar somente minuscula...tem como?

colocar picture para digitar somente minuscula...tem como?

Discussão sobre a linguagem CA-Clipper.

Moderador: Moderadores

 

Mensagempor diogenes_varela » 23 Mar 2007 13:53

Augusto escreveu:
Então, quando você colocar na PICTURE a expressão "@M", o GET só vai aceitar letras minúsculas...


Nesse caso nem é necessário IF/ENDIF, só o PICT "@40!" após o GET, sendo 40 o total de caracteres desejados.
Os computadores não sabem o que fazem. Nós, na maioria das vezes, também não...

E disse ao Programador: "Todos os teus programas terão erros e irás corrigi-los até ao fim dos teus dias". Gen. 1:9
Avatar de usuário

diogenes_varela
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 206
Data de registro: 04 Nov 2006 19:33
Cidade/Estado: Brasília - DF
Curtiu: 0 vez
Mens.Curtidas: 1 vez

Mensagempor Eolo » 23 Mar 2007 18:21

Pessoal,

Um comentário: dependendo a aplicação, só o LOWER() não resolve, porque ele não converte qq caracter em minúscula, caso, por exemplo, do "c cedilha" e dos caracteres acentuados. O UPPER(), na outra mão, mesma coisa. Se a aplicação é para email, pior ainda, já que esses caracteres especiais não poderiam nem ser aceitos.

Então, dentro do GETSYS, antes do LOWER(), tem que limitar a entrada a caracteres permitidos em emails ou links ("a/z" e "0/9", além de ".-_ etc").


Se a aplicação é outra e permite caracteres especiais, então é preciso criar uma função "LOWER2()", que troque "Ç/ç", "Ã/ã", Ü/ü etc., usando o STRTRAN() ou STUFF(), já que o LOWER() não funciona nestes casos.

Eolo
Avatar de usuário

Eolo
Colaborador

Colaborador
 
Mensagens: 1134
Data de registro: 08 Dez 2005 17:24
Cidade/Estado: São Paulo - SP
Curtiu: 0 vez
Mens.Curtidas: 41 vezes

Mensagempor Augusto » 23 Mar 2007 18:48

diogenes_varela escreveu:Explique-me, por favor, o motivo da sua fúria...

Parceiro Diógenes,
Prá começar e prá encerrar... não tem ninguém aqui furioso...

A questão é que a sua sugestão de inibir o CAPS é válida só que ela abrangeria toda e qualquer entrada enquanto, a necessidade do autor do tópico, era apenas para um GET específico, por isso a sugestão do Toledo foi aceita (veja os posts seguintes ao dele) e não a sua embora, seja tbm uma solução mais não para esse caso especificamente... daí eu dizer que vc "provavelmente" não leu por completo o tópico ou se leu não compreendeu...

O importante é que o colega foi atendido...
:xau Fui...
goulart@provsul.com.br

Faça da PROVSUL o seu Provedor de Serviços WEB
Visite: www.PROVSUL.com.br
Avatar de usuário

Augusto
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 465
Data de registro: 26 Ago 2003 17:50
Cidade/Estado: Maricá/RJ
Curtiu: 3 vezes
Mens.Curtidas: 1 vez

Edição de GET para Emails

Mensagempor Pablo César » 24 Mar 2007 01:36

Sim o importante é que foi atendido, você também tem razão. Mas o que é muito bom (não ver os colegas serem asperos, achando que a idéia de cada um é melhor). Temos que entender, que isto é um FORUM e que se debatem idéias e podem surgir as mais variadas possibilidades. Claro que é sempre motivada com a necessidade de um colega, mas também temos que dar lugar a novos exemplos, novas idéias. Todas as que você postaram, foram muito válidas. E como eu disse desde um principio deste TÓPICO, eu faria algo mais apurado (mas cabe saber o que o colega precisa). Tal é assim que o colega Eolo, matou direitinho a questão toda. Também não estou tirando razão de cada um, porque as vezes uma demanda simples requer também uma simples solução. Mas a fim de deixar os colegas analisarem o meu GETSYS, vou colocá-lo a seguir:

// NOTE: compile with /m /n                                                    

#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

// 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

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

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
RestoreGetSysVars( aSavGetSysVars )

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

/***
*
*  GetReader()
*
*  Standard modal read of a single GET
*
*/
PROCEDURE GetReader( oGet )
// Read the GET if the WHEN condition is satisfied
IF ( GetPreValidate( oGet ) )

   // Activate the GET for reading
   oGet:setFocus()

   WHILE ( oGet:exitState == GE_NOEXIT )

         // Check for initial typeout (no editable positions)
         IF ( oGet:typeOut )
            oGet:exitState := GE_ENTER
         ENDIF
         
         // Apply keystrokes until exit
         WHILE ( oGet:exitState == GE_NOEXIT )
                 
               if UPPER(READVAR())="CMAIL"
                  VK:=INKEY(0)
                  KCLP:=.t.       // Permite F10 para clipboard
                  KLOW:=.t.       // Permite caracteres minusculas
                  KUPP:=.f.       // Permite caracteres maiusculas
                  KNUM:=.t.       // Permite caracteres numericos
                  KOUT:="@._-"    // Permite esse caracteres definidos
                  DO CASE
                     CASE VK=-9 .AND. KCLP=.T.
                          VCHR:=CLIP_BOARD()
                          FOR IC=1 TO LEN(ALLTRIM(VCHR))
                              GetApplyKey( oGet, ASC(SUBSTR(VCHR,IC,1)) )
                          NEXT
                     CASE AT(CHR(VK),KOUT)>0  // Outros caracteres
                          VCHR:=CHR(VK)
                     CASE VK=128 .AND. !(KLOW=.F. .AND. KUPP=.F.) // Ç
                          IF KUPP=.T.
                             VCHR:=CHR(VK)
                          ELSE
                             VCHR:=CHR(135)
                          ENDIF
                     CASE VK=135 .AND. !(KLOW=.F. .AND. KUPP=.F.)  // ç
                          IF KLOW=.T.
                             VCHR:=CHR(VK)
                          ELSE
                             VCHR:=CHR(128)
                          ENDIF
                     CASE VK>96 .AND. VK<123 .AND. !(KLOW=.F. .AND. KUPP=.F.)  // a-z
                          IF KLOW=.T.
                             VCHR:=CHR(VK)
                          ELSE
                             VCHR:=UPPER(CHR(VK))
                          ENDIF
                     CASE VK>64 .AND. VK<91 .AND. !(KLOW=.F. .AND. KUPP=.F.)  // A-Z
                          IF KUPP=.T.
                             VCHR:=CHR(VK)
                          ELSE
                             VCHR:=LOWER(CHR(VK))
                          ENDIF
                     CASE VK>47 .AND. VK<58 .AND. KNUM=.T.  // 0-9
                          VCHR:=CHR(VK)
                     CASE VK=4
                          VCHR:=CHR(VK)
                     CASE VK=19
                          VCHR:=CHR(VK)
                     CASE VK=1
                          VCHR:=CHR(VK)
                     CASE VK=25
                          VCHR:=CHR(VK)
                     CASE VK=7
                          VCHR:=CHR(VK)
                     CASE VK=6
                          VCHR:=CHR(VK)
                     CASE VK=5
                          VCHR:=CHR(VK)
                     CASE VK=24
                          VCHR:=CHR(VK)
                     CASE VK=8
                          VCHR:=CHR(VK)
                     CASE VK=13
                          VCHR:=CHR(VK)
                     CASE VK=27
                          VCHR:=CHR(VK)
                     OTHERWISE
                          VCHR:=""
                  ENDCASE
                  GetApplyKey( oGet, ASC(VCHR) )
               ELSE
                  GetApplyKey( oGet, INKEY(0) )
               ENDIF
            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


Daqui pra baixo é igual ao original do CLIPPER.

Parece estranho o que fiz, mas foi necessário. Porque nesses GETs eu queria que pudessem navegar entre os outros GETs, deixando de estar activos quando pressionem a tecla de de navegação (seta pra cima, pra baixo). Mesmo eu estando num GET onde digita-se a senha. Funcionou, super legal. Claro, você vão dizer que é trabalhoso, mas no meu caso resolveu porque meu sistema é MODULAR. Isto é, meu sistema é composto por dezenas de EXEcutáveis. E cada executável cumpre uma função e tem um GETSYS1, GETSYS2. Embora seus sistema não fossem MODULARES, também daria para criar uma opção GENÉRICA que atendesse qulquer questão menos a determina em cada CASE.

Não sei, porque gostamos de achar que o nosso é melhor (eu também estou fazendo isso agora), mas de todas formas, tudo isto é sadio. E espero que os colegas não fiquem bravo comigo, as vezes a verdade doi profundamente. Lindo é ver o conhecimento de TODOS vocês.

Se precisarem, alguma explicação do por quê fiz isto, aquilo no meu fonte. Terei o prazer de explicar.

Um clip-abraço pessoal ! :)Pos
Avatar de usuário

Pablo César
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 5312
Data de registro: 31 Mai 2006 10:22
Cidade/Estado: Curitiba - Paraná
Curtiu: 142 vezes
Mens.Curtidas: 152 vezes

colocar picture para digitar somente minuscula...tem como?

Mensagempor lugab » 01 Abr 2017 07:14

Toledo, achei maravilhosa essa função q vc postou
LOCAL GetList := {}
cls
cEmail=SPAC(40)
@ 10,10 SAY "Endereco de E-mail:" GET cEmail VALID { |oGet| L_OWER(oGet,cEmail) }
READ
RETU
FUNC L_OWER(oGet,v_email)
oGet:buffer := LOWER(v_email)
oGet:assign()
retu .T.

Eu tava precisando dessa solução, obrigado por compartilhar
lugab
lugab
Colaborador

Colaborador
 
Mensagens: 843
Data de registro: 19 Mai 2009 15:58
Curtiu: 126 vezes
Mens.Curtidas: 38 vezes

colocar picture para digitar somente minuscula...tem como?

Mensagempor JoséQuintas » 01 Abr 2017 09:46

De vez em quando eu uso uma função genérica pra ajudar, apesar de ter outras opções

@ 5, 5 get mEmail VALID ReturnValue( .T., mEmail := Lower( mEmail ) )

FUNCTION ReturnValue( xValue, ... )
   RETURN xValue
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Anterior



Retornar para CA-Clipper

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 5 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro