Nesse caso nem é necessário IF/ENDIF, só o PICT "@40!" após o GET, sendo 40 o total de caracteres desejados.Augusto escreveu:
Então, quando você colocar na PICTURE a expressão "@M", o GET só vai aceitar letras minúsculas...
colocar picture para digitar somente minuscula...tem como?
Moderador: Moderadores
-
diogenes_varela
- Usuário Nível 3

- Mensagens: 206
- Registrado em: 04 Nov 2006 19:33
- Localização: Brasília - DF
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
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
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
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
- Augusto
- Usuário Nível 3

- Mensagens: 473
- Registrado em: 26 Ago 2003 17:50
- Localização: Maricá/RJ
- Contato:
Parceiro Diógenes,diogenes_varela escreveu:Explique-me, por favor, o motivo da sua fúria...
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
goulart@provsul.com.br
Faça da PROVSUL o seu Provedor de Serviços WEB
Visite: www.PROVSUL.com.br
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Edição de GET para Emails
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:
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
Código: Selecionar todos
// 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
returnParece 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
colocar picture para digitar somente minuscula...tem como?
Toledo, achei maravilhosa essa função q vc postou
Eu tava precisando dessa solução, obrigado por compartilhar
Código: Selecionar todos
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.
lugab
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
colocar picture para digitar somente minuscula...tem como?
De vez em quando eu uso uma função genérica pra ajudar, apesar de ter outras opções
Código: Selecionar todos
@ 5, 5 get mEmail VALID ReturnValue( .T., mEmail := Lower( mEmail ) )
FUNCTION ReturnValue( xValue, ... )
RETURN xValue
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
