Página 3 de 4

Enviado: 13 Out 2007 14:54
por Eolo
Uai, 2 campos? É só ter 2 inkey(0), dentro de 2 DO WHILEs etc etc.

Cara, o GETSYS tem o que dentro dele? INKEY(0)! E o Tbrowse()?? INKEY(0)! Po, se os dois usam, porque eu não posso usar também?

Eu, particularmente, tenho "n" usuários com "y" senhas em "p" sistemas, sem mexer uma vírgula no GETSYS nem no STD nem no Cargo nem em mais nada. Só que essa funçãozinha chulé que eu postei antes. E que funciona.

Enviado: 13 Out 2007 15:58
por Maligno
A idéia, Eolo, é proporcionar todos os controles que se encontra no GETSYS, mas sem gambiarra. Uma coisa mais natural. E havendo um nome e duas senhas a coisa já precisaria ficar gambiarra demais. Minha opinião. :)

Eu alterei o GETSYS e consegui deixar super simples: @... GET ... PIC "@R!P 10". Senha em maiúscula com 10 caracteres. É dessa naturalidade que estou falando.

Mas a função (de autor desconhecido) que o Stanis postou já fica bem legal. Não altera, mas apenas acrescenta uma função no GETSYS. Depois é só configurar o reader especial no objeto do campo. Não é uma maravilha, mas pra quem não tem nada, resolve muitíssimo bem.

Enviado: 13 Out 2007 16:49
por Stanis Luksys
Eolo escreveu:Eu, particularmente, tenho "n" usuários com "y" senhas em "p" sistemas, sem mexer uma vírgula no GETSYS nem no STD nem no Cargo nem em mais nada.
Isso varia de sistema para sistema, e de programador para programador. Evidente que o Clipper por si só oferece quase que todos os recursos em sua forma padrão.

Mas acredito sinceramente que não seja possível desenvolver um sistema muito versátil sem realizar nenhuma alteração nos processos do Clipper. Um grande exemplo disso foi de o dbEdit ter sido obsoletado pela própria CA, em favor do TBrowse. O pessoal já andava tentando fazer milagre com o coitado do dbEdit. Já vi rotina que muda cor de coluna do dbEdit, coisa de louco!

Alterar o GETSYS propriamente eu não digo, mas trabalhar com a GetList é fundamental em vários aspectos (este da senha é um exemplo).

Outra coisa: o ERRORSYS do Clipper é também muito pobre, impossível ter um sistema grande baseado nele. O próprio manual do Clipper se refere a ele como um EXEMPLO, para servir de base a controle de erros e excessões mais complexas.

Se assim não fosse, nenhum deles viria com fontes, estariam em LIBs.

Acredito que o verdadeiro potencial do Clipper COMEÇA quando se chega nas limitações de seus padrões. É quando vem a necessidade de se alterar este tipo de rotina "interna".

Mas é só uma opinião.

Enviado: 13 Out 2007 18:01
por Maligno
Mas é só uma opinião.
Da qual partilho totalmente. E acrescento: todo o sistema básico do Clipper é pobre. E não ocorre isso apenas com o Clipper. Em praticamente qualquer linguagem. Daí a necessidade de expansão. Quem se dispõe a isso só tem a ganhar.

Enviado: 14 Out 2007 12:12
por clodoaldomonteiro
Tô com o Malígno e o Stanis

O que eu queria fazer, e já fiz, era enviar e-mail pelo sistema, usando o smtpsend.exe, com os seguintes campos:

Código: Selecionar todos

Host SMTP.........:
Email remetente...:
Email destinatário:
Título do email...:
Senha do remetente:
... daí porque eu queria um campo de senha mais dinâmico.

O meu sistema já tem um box de ajuda a cada campo, como o hint do delphi, tem um gerenciador do ERROS, que grava todos os erros em um DBF e manda para mim via e-mail (dica de vocês aqui do forum), envia e-mail de um backup da base de dados, e sempre tô querendo colocar novidades nele, com a ajuda de TODOS VOCÊS.
Maligno escreveu: Eu alterei o GETSYS e consegui deixar super simples: @... GET ... PIC "@R!P 10". Senha em maiúscula com 10 caracteres. É dessa naturalidade que estou falando.
Malígno, onde devo alterar o getsys para colocar uma mascara nova?

Enviado: 14 Out 2007 12:47
por Maligno
Malígno, onde devo alterar o getsys para colocar uma mascara nova?
Poxa, faz uma pergunta mais fácil. :)))
São em vários lugares: onde se faz a impressão, no aplicador de teclas, etc. Pra te dar o caminho das pedras certinho vou ter que estudar o GETSYS de novo. Vai ficar difícil.

Enviado: 14 Out 2007 20:46
por clodoaldomonteiro
Vou tentar por aqui, pois a GAS alterou o getsys e pode num ter muita coisa a ver com o seu getsys.

Valeu.

Enviado: 14 Out 2007 23:19
por Maligno
pode num ter muita coisa a ver com o seu getsys
Pode ter certeza de que não tem nada a ver com o meu GETSYS. :)

Enviado: 15 Out 2007 00:53
por Stanis Luksys
Opa,

No Volume 2 do Ramalho também tem uma alteração bacana no getsys para fazer os "reads temporizados", isso é legal pro sujeito não esquecer uma tela de alteração aberta e ir almoçar, enquanto outra pessoa pode estar alterando o mesmo registro...

Isso aí...

Enviado: 15 Out 2007 18:10
por Pablo César
clodoaldomonteiro escreveu:O que eu queria fazer, e já fiz, era enviar e-mail pelo sistema
Ja pensou alterar o GETSYS para aceitar nos GETs somente minúsculas ?
clodoaldomonteiro escreveu:... daí porque eu queria um campo de senha mais dinâmico.
Isso aí, aconteceu comigo também. E a alteração do GETSYS nesse caso a considero essencial. Claro que quando falamos GETSYS não necessáriamente tem que manter o mesmo nome de arquivo. Isto é, eu tenho GETSYS1.PRG, GETSYS2.PRG dependendo cada caso. Principalmente no meu caso que o meu sistema é modular, onde tenho dezenas de executáveis que compõem o sistema.
clodoaldomonteiro escreveu:grava todos os erros em um DBF e manda para mim via e-mail (dica de vocês aqui do forum)
Isso aí, isso que é usar a cabeça ! Parabéns Clodoaldo. Eu também tenho isso funcionando, só que não exatamente por email (mas também recebo em forma de mensagem em casa). Inclusive, permita-me aconselhar-lhe que na hora que o sistema dá um erro, que esse erro somente seja enviado uma única vez por email. Senão acaba te enchendo de erros que ás vezes são corrigidos e o que falta é atualizar o sistema. Apenas, comento isto para lembrete.
clodoaldomonteiro escreveu:Tô com o Malígno e o Stanis
Ahhhh, somente eles mercem crédito ?. Buahhhh.... Tá vendo, isso porque eu não me manifestei mais... Muitas vezes não me manifesto, porque acabo concordando com o que os colegas dizem. Brincadeira, o crédito não interessa e sim o objetivo cumprido. Sempre é bom comentar coisas que até parecem óbvias mas que no fundo podem serem aperfeiçoadas sempre.

Enviado: 15 Out 2007 18:56
por clodoaldomonteiro
Pablo!

Desculpe não ter mencionado vc nos agradecimentos, mas fique sabendo que vc já me ajudou muito com as suas dicas, inclusive nesse tópico, e gostaria sempre a ajuda de todos vocês, senhores da programação em clipper. hehe.

Realmente esse é o melhor forum da internet. Fico feliz de participar dele, ainda que, não ajudando muito e sim usufruindo das dicas, mais prometo melhorar e ajudar mais do que ser ajudado.

Grato pela atenção de todos.

Enviado: 15 Out 2007 21:31
por Pablo César
Ahhh não precisa pedir desculpas, foi apenas uma coçadinha minha... hihihi.
Fico feliz de participar dele, ainda que, não ajudando muito e sim usufruindo das dicas, mais prometo melhorar e ajudar mais
Eu também sou grato e tenho certeza que você algum dia irá contribuir com os seus conhecimentos ao pessoal que taí e por quê não eu ainda aprenda algo de você também. Todos nós sempre temos algo aprender na vida. Por isso que existe este forum.

Enviado: 26 Out 2007 00:08
por clodoaldomonteiro
Olá amigos!

Foi questionado a possibilidade de se colocar no getsys campos tipo senha, pois depois de muito trabalho consegui fazer isso.

Para dizer ao getsys que o campo é uma senha é necessário informar o picture '@P'.

Fiz a modificação no getsys postado pelo Daniel, mesclando um exemplo de campo senha que foi postado aqui no forum.

O bom é que ficou tudo junto: campo senha '@R', minusculo '@M', AJUDA a cada campo e números rolando para a direita.

A função do getsys a alterar foi a GETREADER e eu tirei os tratamentos de acentos somente para ficar menor.

Código: Selecionar todos

PROCEDURE GetReader( oGet )

   LOCAL   nKey,cKey,cRet,original
   PRIVATE lPrimKey := .T.

   // Read the GET if the WHEN condition is satisfied
   IF ( GetPreValidate( oGet ) )

      // Activate the GET for reading
      oGet:setFocus()
      oGet:CARGO := "" //senha

      WHILE ( oGet:exitState == GE_NOEXIT )

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

            //tratamento de campo senha senha
            if '@P' $ oget:picture
               IF     nKey >= 32 .AND. nKey <= 255
                  oGet:CARGO := oGet:CARGO() + CHR(nKey)
                  GetApplyKey(oGet, 42, original)  // NOME COMPLETO
               ELSEIF nKey = 8
                  oGet:CARGO := SUBSTR(oGet:CARGO(), 1, LEN(oGet:CARGO()) - 1)
                  GetApplyKey(oGet, nKey, original)  // NOME COMPLETO
               ELSEIF nKey = 13 // Sai com tecla ENTER e retorna a
                  // senha digitada
                  GetApplyKey(oGet, nkey, original)  // NOME COMPLETO
               ELSEIF nKey = 27 // Sai com Tecla ESC e retorna vazio
                  GetApplyKey(oGet, nkey, original)  // NOME COMPLETO
               ELSEIF nKey = 5           // Volta para o get anterior
                  oGet:CARGO := space(15)//preenche o get com espa‡os
                  GetApplyKey(oGet, nKey, original) // NOME COMPLETO
               ENDIF
            endif
            // Verifica tecla pressionada
            if !('@P' $ oget:picture)  //se nÆo for campo senha
               GetApplyKey( oGet, nkey, original )
            endif
            *
            lPrimKey := .F.
            *
         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

   //tratamento de campo senha senha
   if '@P' $ oget:picture
      IF oGet:EXITSTATE() <> 7
         oGet:VARPUT(oGet:CARGO())
      ENDIF
   endif
   
   RETURN
Sei que postei essa informação em outro post, mais quis deixar aqui também, pois foi nesse post que pedi ajuda aos amigos.

Enviado: 28 Out 2007 11:33
por asimoes
Clodoaldo,
Blz.

Como você faz para validar uma senha usando a modificação feita no getsys.

EX.:
cSenha:=SPACE(6)
Exemplo: @10,00 SAY "Informe a senha: " GET cSenha PICT "@P" VALID VALSEN(cSenha)=.T.
READ

Não consegui validar desta forma o get passa "******" para a função ValSen()

Tem jeito?

Obs.: estou usando o getsys2.prg que você me enviou.

[]´S

clodoaldomonteiro escreveu:Seguindo a dica de vocês incluí as seguintes linhas:

Código: Selecionar todos

...
...
ELSEIF L2 = 5           // Volta para o get anterior
   P1:CARGO := space(15)//preenche o get com espaços
   GetApplyKey(P1, L2)  // NOME COMPLETO
....
....
... e ficou tudo certinho.

Valeu a força.[/code]

Enviado: 28 Out 2007 20:42
por clodoaldomonteiro
Não tinha testado com o VALID.

Mas me diga o que é que você quer validar, para que eu possa entender melhor, pois eu só valido se a senha é válida depois do READ e se não existir eu LOOP e volto pro início do WHILE, depois se o contador estourar três tentativas sai definitivamente.

Mas se ainda assim você quiser usar o VALID, eu posso tentar concertar o erro.