Página 1 de 3

dúvida de iniciante em HwGui: tela de login

Enviado: 02 Nov 2021 20:44
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.

dúvida de iniciante em HwGui: tela de login

Enviado: 02 Nov 2021 21:15
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

dúvida de iniciante em HwGui: tela de login

Enviado: 02 Nov 2021 21:21
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

dúvida de iniciante em HwGui: tela de login

Enviado: 02 Nov 2021 21:23
por Fernando queiroz
apos passar pelo login
menu.jpg

dúvida de iniciante em HwGui: tela de login

Enviado: 02 Nov 2021 22:41
por cjp
ponha o rotina de login para fora do dialog
Funcionou. Muito obrigado.

dúvida de iniciante em HwGui: tela de login

Enviado: 02 Nov 2021 23:16
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
  

dúvida de iniciante em HwGui: tela de login

Enviado: 03 Nov 2021 02:33
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í...

dúvida de iniciante em HwGui: tela de login

Enviado: 03 Nov 2021 08:49
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.

dúvida de iniciante em HwGui: tela de login

Enviado: 03 Nov 2021 08:56
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,

dúvida de iniciante em HwGui: tela de login

Enviado: 03 Nov 2021 11:17
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.

dúvida de iniciante em HwGui: tela de login

Enviado: 03 Nov 2021 22:45
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
  

dúvida de iniciante em HwGui: tela de login

Enviado: 03 Nov 2021 23:02
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.

dúvida de iniciante em HwGui: tela de login

Enviado: 03 Nov 2021 23:19
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.

dúvida de iniciante em HwGui: tela de login

Enviado: 03 Nov 2021 23:21
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.

dúvida de iniciante em HwGui: tela de login

Enviado: 03 Nov 2021 23:26
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.