dúvida de iniciante em HwGui: tela de login

Projeto HwGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

dúvida de iniciante em HwGui: tela de login

Mensagem por cjp »

Pessoal, estou tentando iniciar em HwGui, com muita dificuldade.
Fiz um programinha bem básico, que funciona.
Mas agora estou tentando incluir uma tela inicial de login nesse programinha e não está funcionando, não sei porquê.

O programinha está assim:

Código: Selecionar todos

#include "hwgui.ch"

Function Main
   Local oDlg, oFont, oFontSay, oFontC
   Local nRecs :=0
   Local nTp :=0, oSAY1, oSAY2
   private nInicio :=0

   PREPARE FONT oFont NAME "MS Sans Serif" WIDTH 0 HEIGHT -13
   PREPARE FONT oFontSay NAME "MS Sans Serif" WIDTH 0 HEIGHT -13 WEIGHT 700
   PREPARE FONT oFontC NAME "Georgia" WIDTH 0 HEIGHT -15

   INIT DIALOG oDlg TITLE "Chat" AT 100, 100 SIZE 540, 500 FONT oFont

   if !login()
      return .f.
   endif
   
   @ 20,12 SAY oSAY1 CAPTION "Inicio da coversa:" SIZE 260, 24 ;
         FONT oFontSay COLOR 8404992

   nTp=seconds()-nInicio

   IF ++nRecs == 100
      hwg_processmessage() ; nRecs := 0
   EndIf

   @ 20, 450 LINE LENGTH 500
   
   @ 10,458 BUTTON "Iniciar contagem" SIZE 150,28 ;
      ON CLICK {||iniciacontagem()}

   @ 160,458 BUTTON "Ver contagem" SIZE 150,28 ;
      ON CLICK {||vercontagem()}
     
   @ 350,458 BUTTON "Close" SIZE 90,30 ON CLICK {||oDlg:Close()}

   ACTIVATE DIALOG oDlg
  
Return Nil
      
function iniciacontagem
         Local oDlg, oFont, oSAY1
         
         nInicio:=seconds()
       
         PREPARE FONT oFont NAME "MS Sans Serif" WIDTH 0 HEIGHT -13
					
         INIT DIALOG oDlg TITLE "Inicia contagem" AT 280, 210 SIZE 250, 250 FONT oFont
       
         @ 10,40 SAY oSAY1 CAPTION "Contagem iniciada" SIZE 360, 36 //Precisa do OBJETO oSAY1
       
         @  10,190  BUTTON "Ok" SIZE 100, 32 ON CLICK {||oDlg:lResult:=.T.,hwg_EndDialog()}
       
         ACTIVATE DIALOG oDlg

return Nil     

Function vercontagem()
         Local oDlg, oFont := HFont():Add( "MS Sans Serif",0,-13 ), oTimer, oSAY1, oSAY5
         Local oE5, e5 := 0

         INIT DIALOG oDlg CLIPPER NOEXIT TITLE "Contagem" AT 250,20 SIZE 250,350 FONT oFont

         hwg_SetColorinFocus( oDlg,, 13172680 )
   
         @ 15,20 SAY oSAY1 CAPTION "Contagem:" SIZE 260, 22

         e5=seconds()-nInicio
   
         @ 15,115 SAY oSAY5 CAPTION str(e5)+" segundos" SIZE 150, 26

         @  15,250  BUTTON "Ok" SIZE 80, 32 ON CLICK {||oDlg:lResult:=.T.,hwg_EndDialog()}

         oDlg:bActivate:={||oDlg:Show(),CONTA(oSay5,e5)}

         ACTIVATE DIALOG oDlg

Return Nil

Function CONTA(oSay5,e5)
Local nX:=0
FOR nX := 1 to 50
  e5 := seconds() - nInicio
  oSay5:SetText(str(e5))
  inkey(.1)
NEXT
hwg_msginfo("Ok")
Return Nil


Function login()
         Local oDlg, oFont := HFont():Add( "MS Sans Serif",0,-13 ), oTimer, oSAY1, oSAY5
         Local snh := space(20)
         Local oE5

         INIT DIALOG oDlg CLIPPER NOEXIT TITLE "Log in" AT 250,20 SIZE 250,350 FONT oFont

         hwg_SetColorinFocus( oDlg,, 13172680 )
   
         @ 15,20 SAY oSAY1 CAPTION "Digite a sua senha:" SIZE 260, 22
   
         @ 15,65 GET oE5 VAR snh SIZE 150, 26 //Precisa do objeto GET oE5

         @  15,250  BUTTON "Ok" SIZE 80, 32 ON CLICK {||oDlg:lResult:=.T.,hwg_EndDialog()}

         ACTIVATE DIALOG oDlg
Return .t.

Quando comento esta parte:
if !login()
return .f.
endif
Tudo funciona corretamente.

Mas, quando chamo essa função login(), ele até chama, pede a senha, mas, quando clico no Ok na tela do login, ele volta a uma tela em branco, não aparecem os botões.

Imagino que tenha algum erro na chamada do login(), mas não sei onde está o erro.

Alguém pode me ajudar?

p.s.: A função login() ainda não está pronta, ainda não fiz a verificação da senha no MySQL.
Inacio de Carvalho Neto
Fernando queiroz
Usuário Nível 4
Usuário Nível 4
Mensagens: 779
Registrado em: 13 Nov 2014 00:41
Localização: Porto Alegre/RS

dúvida de iniciante em HwGui: tela de login

Mensagem por Fernando queiroz »

ponha o rotina de login para fora do dialog

if !login()
return .f.
endif

INIT DIALOG oDlg TITLE "Chat" AT 100, 100 SIZE 540, 500 FONT oFont
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
Fernando queiroz
Usuário Nível 4
Usuário Nível 4
Mensagens: 779
Registrado em: 13 Nov 2014 00:41
Localização: Porto Alegre/RS

dúvida de iniciante em HwGui: tela de login

Mensagem por Fernando queiroz »

olha ai uma tela de login , antes da tela de menu, ela esta na rotina do menu mas antes de ativar ele
login.jpg
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
Fernando queiroz
Usuário Nível 4
Usuário Nível 4
Mensagens: 779
Registrado em: 13 Nov 2014 00:41
Localização: Porto Alegre/RS

dúvida de iniciante em HwGui: tela de login

Mensagem por Fernando queiroz »

apos passar pelo login
menu.jpg
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

dúvida de iniciante em HwGui: tela de login

Mensagem por cjp »

ponha o rotina de login para fora do dialog
Funcionou. Muito obrigado.
Inacio de Carvalho Neto
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

dúvida de iniciante em HwGui: tela de login

Mensagem por cjp »

Mais algumas dúvidas sobre a tela de login, por favor:

1) como faço para trocar os caracteres digitados na senha por asteriscos? No Harbour em modo console, uso getsecret(); mas na HwGui, não funcionou; tem algo equivalente?

2) como faço para não abrir a tela principal se não digitar a senha, ou se a senha digitada não for a correta? Acresci um botão Encerrar, mas, clicando nele, ou mesmo clicando ESC, sem digitar a senha, de qualquer forma ele está abrindo a tela principal, como se tivesse digitado a senha correta; veja que estou usando
if !login()
return .f.
endif
Aparentemente, login() não está retornando .f. como era de se esperar;

3) Tem algum local correto para colocar a verificação da senha digitada? Da forma como coloquei, qie deve estar errada, não está nem abrindo a tela de login; veja como está:

Código: Selecionar todos

Function login()
         Local oDlg, oFont := HFont():Add( "MS Sans Serif",0,-13 ), oTimer, oSAY1, oSAY5
         Local snh := space(20)
         Local oE5, cProc
		 private conexao

         INIT DIALOG oDlg CLIPPER NOEXIT TITLE "Log in" AT 250,20 SIZE 250,250 FONT oFont

         hwg_SetColorinFocus( oDlg,, 13172680 )
   
         @ 15,20 SAY oSAY1 CAPTION "Digite a sua senha:" SIZE 260, 22
   
         @ 15,65 GET oE5 VAR snh SIZE 150, 26

         @ 15,120  BUTTON "Entrar" SIZE 80, 32 ON CLICK {||oDlg:lResult:=.T.,hwg_EndDialog()}

         @ 85,120 BUTTON "Encerrar" SIZE 90,30 ON CLICK {||oDlg:Close()}

            IF !ADOconecta( 3, 4 )
			   return .f.
		    Endif
		 
		    cProc=conexao:execute("SELECT usuario FROM usuario WHERE senha='"+snh+"'")
		    if cProc:recordcount()=0
	           cProc:Close()
		       conexao:close()
               @ 15,20 SAY oSAY1 CAPTION "Senha não confere" SIZE 260, 22
			   inkey(3)
			   return .f.
		    else
		       us=cProc:Fields("usuario"):Value
	           cProc:Close()
		       conexao:close()
		    endif
		 
         ACTIVATE DIALOG oDlg
Return .t.

function ADOconecta(nProvedor,nTentativas)
		 
		 conexao := conexADO(nProvedor)
         AbreADO( conexao )
return .t.

FUNCTION AbreADO( oCN )
         oCN:Open()
RETURN oCN:State != 0
   
FUNCTION ConexADO( nProvedor )
         LOCAL cnConnection, nPort := 3306
         LOCAL cServer :="mysql.xxx.com.br"
         LOCAL cDatabase :="xxx"
         LOCAL cUser :="xxx"
         LOCAL cPassword :="xxx"
   
   hb_Default( @nProvedor, 1 )

   cnConnection := win_OleCreateObject( "ADODB.Connection" )
   cnConnection:ConnectionString := ;
      MariaDB_StringConexao() + ";" + ;
      "Server=" + cServer + ";" + ;
      "Port=" + Ltrim( Str( nPort ) ) + ";" + ;
      "Database=" + cDatabase + ";" + ;
      "User=" + cUser + ";" + ;
      "Password=" + cPassword + ";" + ;
      "Collation=latin1;" + ;
      "AUTO_RECONNECT=1;"
   cnConnection:CursorLocation    := 3 // AD_USE_CLIENT
   cnConnection:CommandTimeOut    := 300 // seconds
   cnConnection:ConnectionTimeOut := 300 // seconds
   
RETURN cnConnection

FUNCTION Mariadb_StringConexao()
         LOCAL cTxt := ""
			
            cTxt += "Driver={MariaDB ODBC 3.1 Driver}"
		 
RETURN cTxt
  
Inacio de Carvalho Neto
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

dúvida de iniciante em HwGui: tela de login

Mensagem por alxsts »

Olá!

Você precisa entender o conceito das coisas...

Tudo o que se codifica entre o INIT DIALOG e o ACTIVATE DIALOG são definições de objetos componentes da tela e a associação dos eventos destes componentes a codeblocks das ações a serem executadas quando ocorrem os eventos de mouse e teclado. O formulário só começa a funcionar quando é executado o ACTIVATE DIALOG, que ativa o manipulador de eventos da HwGUI (event handler).
As rotinas associadas aos eventos devem ser preferencialmente codificadas fora desta estrutura. Podem até ser codificadas dentro do codeblock do evento do componente mas, se for muito código, fica ruim para ler. Eu prefiro rotinas separadas.

Código: Selecionar todos

STATIC  conexao

Function login()
   Local oDlg, oFont := HFont():Add( "MS Sans Serif",0,-13 ), oTimer, oSAY1, oSAY5
   Local snh := space(20)
   Local oE5, cProc
   LOCAL cUser := Space(20), lblUsr, edtUsr

//   private conexao

   INIT DIALOG oDlg ;
        CLIPPER NOEXIT ;
        TITLE "Log in" ;
        AT 250,20 SIZE 250,250 ;
        FONT oFont

   hwg_SetColorinFocus( oDlg,, 13172680 )

   @ 13,20 SAY lblUsr ;
           CAPTION "Usuario           :" ;
           SIZE 260, 22 ;

   @ 13,65 GET edtUsr ;
           VAR cUser ;
           SIZE 150, 26
           // Pode colocar um VALID aqui para executar CheckPass(). Preferi colocar no onClick do botao abaixo
   @ 15,20 SAY oSAY1 ;
           CAPTION "Digite a sua senha:" ;
           SIZE 260, 22

   @ 15,65 GET oE5 ;
           VAR snh ;
           PASSWORD ; // ---> NOTE
           SIZE 150, 26

   @ 15,120  BUTTON "Entrar" ;
             SIZE 80, 32 ;
             ON CLICK { || If( CheckPass( oDlg ), ( oDlg:close(), ProximoForm() ), edtUsr:setFocus() ) }

   @ 85,120 BUTTON "Encerrar" ;
            SIZE 90,30 ;
            ON CLICK {|| hwg_EndDialog() }

   ACTIVATE DIALOG oDlg

Return .t.

FUNCTION CheckPass( oDlg )

   LOCAL oRs, lRet := .T.

   IF !ADOconecta( 3, 4 )
      hwg_MsgStop( "Falha ao conectar ao banco de dados", "Erro" )
      Return .F.
   Endif
   
   //cProc=conexao:execute("SELECT usuario FROM usuario WHERE senha='"+snh+"'")

   // busca pelo nome do usuário e nao pela senha. Varios usuarios podem ter a mesma senha...
   oRs := conexao:execute("SELECT usuario, senha FROM usuario WHERE usuario ='" + oDlg:edtUsr:varGet() +"'")

   if oRs:recordcount() > 0
      If AllTrim( oRs:fields(2):value() ) != AllTrim( oDlg:oE5:varGet() )
         hwg_MsgStop( "Senha não confere", "Erro" )
         lRet := .F.
      Endif
   
      // o que seria isto?
      //us=cProc:Fields("usuario"):Value
      //cProc:Close()
      //conexao:close()
   endif

   oRs:Close()
   conexao:close()

RETURN lRet

function ADOconecta(nProvedor,nTentativas)
 
   conexao := conexADO(nProvedor)
   AbreADO( conexao )
return .t.

FUNCTION AbreADO( oCN )
   oCN:Open()
RETURN oCN:State != 0

FUNCTION ConexADO( nProvedor )
   LOCAL cnConnection, nPort := 3306
   LOCAL cServer :="mysql.xxx.com.br"
   LOCAL cDatabase :="xxx"
   LOCAL cUser :="xxx"
   LOCAL cPassword :="xxx"

   hb_Default( @nProvedor, 1 )
   
   cnConnection := win_OleCreateObject( "ADODB.Connection" )
   
   cnConnection:ConnectionString := ;
               MariaDB_StringConexao() + ";" + ;
                   "Server=" + cServer + ";" + ;
                   "Port=" + Ltrim( Str( nPort ) ) + ";" + ;
                   "Database=" + cDatabase + ";" + ;
                   "User=" + cUser + ";" + ;
                   "Password=" + cPassword + ";" + ;
                   "Collation=latin1;" + ;
                   "AUTO_RECONNECT=1;"
   cnConnection:CursorLocation    := 3 // AD_USE_CLIENT
   cnConnection:CommandTimeOut    := 300 // seconds
   cnConnection:ConnectionTimeOut := 300 // seconds

RETURN cnConnection

FUNCTION Mariadb_StringConexao()
   LOCAL cTxt := ""
   
   cTxt += "Driver={MariaDB ODBC 3.1 Driver}"
 
RETURN cTxt
Segue uma ideia para o teu código postado. Ajuste e teste aí...
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

dúvida de iniciante em HwGui: tela de login

Mensagem por Itamar M. Lins Jr. »

Olá!
Seu código na função login, qual é o ultimo comando ? Depois de ACTIVATE ?
COmo vc quer que retorne .T. ou .F. ?
Use ai:
LOCAL lRet := .F.
If pass == OK ; lRet := .T.
e no firnal, return lRet
Não ficarei analisando códigos muito grande.
No final de toda função existe algum tipo de retorno para quem a chamou.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Fernando queiroz
Usuário Nível 4
Usuário Nível 4
Mensagens: 779
Registrado em: 13 Nov 2014 00:41
Localização: Porto Alegre/RS

dúvida de iniciante em HwGui: tela de login

Mensagem por Fernando queiroz »

Código: Selecionar todos

	@ 260,95 GET oOperador VAR ::USUARIO SIZE 361,28  NOBORDER MAXLENGTH 20 ;   
			FONT HFont():Add( '',0,-19,400,,,);
			COLOR 12632256  BACKCOLOR 0;
			VALID {|| ::SENHA:="", oSenha:Refresh(), .T. }

	@ 260,146 GET oSenha VAR ::SENHA SIZE 361,28PASSWORD NOBORDER MAXLENGTH 9 ;
			FONT HFont():Add( '',0,-19,400,,,);
			COLOR 12632256  BACKCOLOR 0 ;
			VALID {|| OK_SENHA:= ::SENHA_LOGIN_VALIDA(  ) , hwg_Enddialog(), .T. }
segue codigo para usuario e senha,
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

dúvida de iniciante em HwGui: tela de login

Mensagem por Itamar M. Lins Jr. »

Olá!
Aparentemente, login() não está retornando .f. como era de se esperar;
INIT DIALOG ...
ACTIVATE
É a mesma coisa que um GET(Init DIALOG) e READ(Activate)!
Lembre-se de SAIR do INIT DIALOG, fechar ele e depois coloque como vc quer o retorno abaixo do activate.
if !login()
hwg_msginfo("acesso negado...")
return .f.
endif

Código: Selecionar todos

Function login()
        local lResult := .F.

         INIT DIALOG oDlg 

         @ 15,65 GET oE5 VAR snh SIZE 150, 26 //pode colocar a VALID aqui ou no BUTTON.

         @ 15,120  BUTTON "Entrar" SIZE 80, 32 ON CLICK {|| iif(SENHA OK,{||lResult:=.T.,hwg_EndDialog()}, {|| hwg_msgstop("erro..."),oE5:setfocus(), etc...} )}

         ACTIVATE DIALOG oDlg
Return lResult

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

dúvida de iniciante em HwGui: tela de login

Mensagem por alxsts »

Olá!

Li o post das (11:17) deste tópico hoje pela manhã e estava bem diferente. Foi editado sem aviso....

Parece que o autor percebeu que estava errado quanto às coisas que havia escrito sobre o funcionamento de múltiplos comandos dentro de um code block, como citei em minha mensagem anterior e demonstro abaixo...

Código: Selecionar todos

#include "hwgui.ch"
#include "common.ch"

FUNCTION _frmLogin

Local FrmMain

LOCAL oGroup1, oLabel1, oEditbox1, oEditbox2, oLabel2, oButton2, oButton1
LOCAL cUser, cPass

  INIT DIALOG FrmMain TITLE "Teste" ;
    AT 610,115 SIZE 294,305 ;
        FONT HFont():Add( 'Verdana',0,-13,400,,,) CLIPPER NOEXIT ;
     STYLE WS_SYSMENU+WS_SIZEBOX+WS_VISIBLE

   @ 36,96 SAY oLabel1 CAPTION "Usuário" OF oGroup1  SIZE 80,22   

   @ 152,97 GET oEditbox1 VAR cUser OF oGroup1  SIZE 95,24 ;
        STYLE WS_BORDER   PICTURE '@X' MAXLENGTH 15    ;
        FONT HFont():Add( 'Arial Narrow',0,-13,400,,,); 
        TOOLTIP 'Nome do Usuário'

   @ 154,152 GET oEditbox2 VAR cPass OF oGroup1  SIZE 91,24 ;
        STYLE WS_BORDER   MAXLENGTH 15  PASSWORD   ;
        FONT HFont():Add( 'Arial Narrow',0,-13,400,,,); 
        TOOLTIP 'Digite sua senha'

   @ 36,153 SAY oLabel2 CAPTION "Senha" OF oGroup1  SIZE 80,22   

   @ 187,209 BUTTON oButton2 CAPTION "&Sair"  OF oGroup1  SIZE 80,32 ;
        STYLE WS_TABSTOP+BS_FLAT  ;
        ON CLICK {|| hwg_EndDialog() } 

   @ 74,210 BUTTON oButton1 CAPTION "&Ok"  OF oGroup1  SIZE 80,32 ;
        STYLE WS_TABSTOP+BS_FLAT   ; 
        TOOLTIP 'Confirmar'  ;
        ON CLICK { || If( CheckPass( FrmMain ), ( FrmMain:close(), ProximoForm() ), oEditbox1:setFocus() ) }  /* NOTE */

   ACTIVATE DIALOG FrmMain

RETURN FrmMain:lresult


FUNCTION CheckPass( oDlg )

     LOCAL oRs, lRet := .T.
  
     If oDlg:oEditbox1:getText() != "Teste" .Or. oDlg:oEditbox2:getText() != "123"
        hwg_MsgStop( "Usuário ou senha inválidos", "Erro" )
        lRet := .F.
     Endif
  
  RETURN lRet
  
  FUNCTION ProximoForm()
  
     hwg_MsgInfo( "Isto vem da função ProximoForm()", "Mesnagem" )
  
  RETURN NIL
  
[]´s
Alexandre Santos (AlxSts)
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

dúvida de iniciante em HwGui: tela de login

Mensagem por cjp »

Vou responder por partes para ficar mais claro (sobretudo pra mim):
Olá!

Você precisa entender o conceito das coisas...

Tudo o que se codifica entre o INIT DIALOG e o ACTIVATE DIALOG são definições de objetos componentes da tela e a associação dos eventos destes componentes a codeblocks das ações a serem executadas quando ocorrem os eventos de mouse e teclado. O formulário só começa a funcionar quando é executado o ACTIVATE DIALOG, que ativa o manipulador de eventos da HwGUI (event handler).
As rotinas associadas aos eventos devem ser preferencialmente codificadas fora desta estrutura. Podem até ser codificadas dentro do codeblock do evento do componente mas, se for muito código, fica ruim para ler. Eu prefiro rotinas separadas.
Acho que entendi esta parte.
Inacio de Carvalho Neto
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

dúvida de iniciante em HwGui: tela de login

Mensagem por cjp »

Segue uma ideia para o teu código postado. Ajuste e teste aí...
Ajustei (dentro dos meus limitados conhecimentos) e testei.
Funcionou parcialmente, está entrando na tela principal depois de colocar a senha.
Mas ainda está entrando na tela principal mesmo que coloque a senha errada. Ou seja, aparentemente, não está testando a senha corretamente.
Pelo que vi, ele entra na CheckPass, conecta no banco de dados, mas não está verificando a senha.
Veja como fiz até agora:

Código: Selecionar todos

Function Main
   Local oDlg, oFont, oFontSay, oFontC

   PREPARE FONT oFont NAME "MS Sans Serif" WIDTH 0 HEIGHT -13
   PREPARE FONT oFontSay NAME "MS Sans Serif" WIDTH 0 HEIGHT -13 WEIGHT 700
   PREPARE FONT oFontC NAME "Georgia" WIDTH 0 HEIGHT -15

   if !login()
      return .f.
   endif

function proximoform   
   Local oDlg, oFont, oFontSay, oFontC
   Local nRecs :=0
   Local nTp :=0, oSAY1, oSAY2
   
   INIT DIALOG oDlg TITLE "Chat" AT 100, 100 SIZE 540, 500 FONT oFont

   @ 20,12 SAY oSAY1 CAPTION "Inicio da coversa:" SIZE 260, 24 ;
         FONT oFontSay COLOR 8404992

   nTp=seconds()-nInicio

   IF ++nRecs == 100
      hwg_processmessage() ; nRecs := 0
   EndIf

   @ 20, 450 LINE LENGTH 500
   
   @ 10,458 BUTTON "Iniciar contagem" SIZE 150,28 ;
      ON CLICK {||iniciacontagem()}

   @ 160,458 BUTTON "Ver contagem" SIZE 150,28 ;
      ON CLICK {||vercontagem()}
     
   @ 350,458 BUTTON "Encerrar" SIZE 90,30 ON CLICK {||oDlg:Close()}

   ACTIVATE DIALOG oDlg
  
Return Nil
      
Function login()
   Local oDlg, oFont := HFont():Add( "MS Sans Serif",0,-13 ), oTimer, oSAY1, oSAY5
   Local oE5, cProc
   LOCAL cUser := Space(20), lblUsr, edtUsr
   private snh := space(20)

   private conexao

   INIT DIALOG oDlg ;
        CLIPPER NOEXIT ;
        TITLE "Log in" ;
        AT 250,20 SIZE 250,250 ;
        FONT oFont

   hwg_SetColorinFocus( oDlg,, 13172680 )

   @ 13,20 SAY lblUsr ;
           CAPTION "Usuario           :" ;
           SIZE 260, 22 ;

   @ 13,65 GET edtUsr ;
           VAR cUser ;
           SIZE 150, 26
           // Pode colocar um VALID aqui para executar CheckPass(). Preferi colocar no onClick do botao abaixo
   @ 15,20 SAY oSAY1 ;
           CAPTION "Digite a sua senha:" ;
           SIZE 260, 22

   @ 15,65 GET oE5 ;
           VAR snh ;
           PASSWORD ; // ---> NOTE
           SIZE 150, 26

   @ 15,120  BUTTON "Entrar" ;
             SIZE 80, 32 ;
             ON CLICK { || If( CheckPass( oDlg ), ( oDlg:close(), ProximoForm() ), edtUsr:setFocus() ) }

   @ 85,120 BUTTON "Encerrar" ;
            SIZE 90,30 ;
            ON CLICK {|| hwg_EndDialog() }

   ACTIVATE DIALOG oDlg

Return .t.

FUNCTION CheckPass( oDlg )

   LOCAL oRs, lRet := .T.

   IF !ADOconecta( 3, 4 )
      hwg_MsgStop( "Falha ao conectar ao banco de dados", "Erro" )
      Return .F.
Else	  
      hwg_MsgStop( "Sem falha ao conectar ao banco de dados", "Sem erro" )
   Endif
   
   cProc=conexao:execute("SELECT usuario FROM usuario WHERE senha='"+snh+"'")

   // busca pelo nome do usuário e nao pela senha. Varios usuarios podem ter a mesma senha...
   oRs := conexao:execute("SELECT usuario, senha FROM usuario WHERE usuario ='" + oDlg:edtUsr:varGet() +"'")

   if oRs:recordcount() > 0
      If AllTrim( oRs:fields(2):value() ) != AllTrim( oDlg:oE5:varGet() )
         hwg_MsgStop( "Senha não confere", "Erro" )
         lRet := .F.
Else		 
         hwg_MsgStop( "Senha confere", "Sem erro" )
      Endif
   
      // o que seria isto?
      us=cProc:Fields("usuario"):Value
      //cProc:Close()
      //conexao:close()
   endif

   oRs:Close()
   conexao:close()

RETURN lRet

// o que seria isto?
//us=cProc:Fields("usuario"):Value
Aqui eu pegaria o código do usuário, que consta na tabela MySql. Cada usuário tem seu código, representando por uma única letra.

Detalhe: STATIC conexao deu erro na compilação.
Inacio de Carvalho Neto
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

dúvida de iniciante em HwGui: tela de login

Mensagem por cjp »

// busca pelo nome do usuário e nao pela senha. Varios usuarios podem ter a mesma senha...
No caso não tem. Meu sistema impede que vários usuários tenham a mesma senha. Como são poucos usuários, isso não é problema.
Inacio de Carvalho Neto
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

dúvida de iniciante em HwGui: tela de login

Mensagem por Itamar M. Lins Jr. »

Olá!
estava errado quanto às coisas
Errado não, só misturei sua postagem com a dele.
Como vc já sabe como é, não precisa explicar.
O problema foi a mistura ai. Muita explicação p/ pouca coisa ainda coloquei códigos dos outros na explicação.
Isso no código dele.
Se nos atermos ao código dele, facilita mais. Corrigindo(explicando) o mínimo possível dentro do código dele, ao invés de postar mais códigos e telas.
Removi a parte, pq não era código dele.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Responder