Página 1 de 1

Obter o nome do GET e voltar para ele após função

Enviado: 25 Dez 2018 20:12
por LIST SYSTEMS
Olá, Amigos!

Um Feliz Natal para todos!

Sei que hoje é época de festas mas preciso de uma ajuda, caso seja possível.

1 - Preciso obter o nome do primeiro get de meu formulário
2 - Quando o usuário clica em um PushButton nesse formulário, é executada uma função que verifica se o usuário preencheu todas as variáveis. Se não, estabelece o foco com ":setfocus()" para o get cujo nome foi obtido anteriormente.

Como faço isso?

Eis meu código:

Código: Selecionar todos

FUNCTION MAIN()
	//CORES DOS BOTOES
	//01 BOTAO SEM FOCO
	//02 BOTAO COM FOCO
	//03 BOTAO COM FOCO E PRESSIONADO
	//04 TECLA DE ATALHO DO BOTAO
	LOCAL cCORBOTOES := "W+/B,W+/R,W+/BG,W+/GR+"
  PUBLIC cEMPRESA := SPACE(20)
  PUBLIC cUSUARIO := SPACE(20)
  PUBLIC cSENHA := SPACE(20)
	PUBLIC bENTRAR := .T.
	PUBLIC bSAIR := .T.
	PUBLIC lACESSAR := .F.
  
  DO WHILE .T.
		SETCOLOR(N/W,W+/BG)
		@ 10,22 CLEAR TO 16,58
  	@ 10,22 TO 16,58
    SET CURSOR ON
    @ 11,24 SAY "EMPRESA...:" GET cEMPRESA PICTURE "@!" SEND COLORSPEC := "W+/GR+,W+/BG"
		oGETPRI := ALLTRIM(STR(GETACTIVE():NAME))
    @ 12,24 SAY "USUARIO...:" GET cUSUARIO PICTURE "@!" SEND COLORSPEC := "W+/GR+,W+/BG"
    @ 13,24 SAY "SENHA.....:" GET cSENHA PICTURE "@!" SEND COLORSPEC := "W+/GR+,BG/BG"
		@ 15,34 GET bENTRAR PUSHBUTTON CAPTION "ENTRAR" COLOR cCORBOTOES STYLE "[]" STATE {||ACESSOBOTOES('ENTRAR')}
		@ 15,48 GET bSAIR PUSHBUTTON CAPTION "SAIR" COLOR cCORBOTOES STYLE "[]" STATE {||ACESSOBOTOES('SAIR')}
    READ
    IF LASTKEY() = 27
    	EXIT
    ENDIF
		IF lACESSAR == .T.
			//CHAMA MENU PRINCIPAL
			//CARDAPIO()
			lACESSAR = .F.
			EXIT
		ELSEIF lACESSAR == .F.
			EXIT
		ENDIF
	ENDDO
  SET CURSOR OFF
RETURN(NIL)

FUNCTION ACESSOBOTOES(cACAO)
DO CASE
	CASE UPPER(ALLTRIM(cACAO)) == "ENTRAR"
		lACESSAR = .T.
		cEMPRESA = UPPER(ALLTRIM(cEMPRESA)) + SPACE(20 - LEN(ALLTRIM(cEMPRESA)))
    cUSUARIO = UPPER(ALLTRIM(cUSUARIO)) + SPACE(20 - LEN(ALLTRIM(cUSUARIO)))
    cSENHA = UPPER(ALLTRIM(cSENHA)) + SPACE(20 - LEN(ALLTRIM(cSENHA)))
    IF (LEN(ALLTRIM(cEMPRESA)) > 0) .AND. (LEN(ALLTRIM(cUSUARIO)) > 0) .AND. (LEN(ALLTRIM(cSENHA)) > 0)
			lACESSAR = .T.
	  ELSE
	  	ALERT("PREENCHA OS CAMPOS EMPRESA, USUARIO E SENHA PARA OBTER ACESSO AO SISTEMA!",{"OK"},"W+/B")
			//ESTABELECE FOCO NO GET cEMPRESA
			lACESSAR = .F.
		ENDIF
	CASE UPPER(ALLTRIM(cACAO)) == "SAIR"
		lACESSAR = .F.
ENDCASE
RETURN(lACESSAR)

Obter o nome do GET e voltar para ele após função

Enviado: 25 Dez 2018 22:45
por Fernando queiroz
eu mudaria um pouco a logica em vez de


@ 11,24 SAY "EMPRESA...:" GET cEMPRESA PICTURE "@!" SEND COLORSPEC := "W+/GR+,W+/BG"
oGETPRI := ALLTRIM(STR(GETACTIVE():NAME))
@ 12,24 SAY "USUARIO...:" GET cUSUARIO PICTURE "@!" SEND COLORSPEC := "W+/GR+,W+/BG"
@ 13,24 SAY "SENHA.....:" GET cSENHA PICTURE "@!" SEND COLORSPEC := "W+/GR+,BG/BG"


usaria assim

@ 11,24 SAY "EMPRESA...:" GET cEMPRESA PICTURE "@!" VALID {|| IF( LEN(ALLTRIM(cEMPRESA)) > 0), .T., .F.) }
@ 12,24 SAY "USUARIO...:" GET cUSUARIO PICTURE "@!" VALID {|| IF( LEN(ALLTRIM(cUSUARIO)) > 0), .T., .F.) }
@ 13,24 SAY "SENHA.....:" GET cSENHA PICTURE "@!" VALID {|| IF( LEN(ALLTRIM((cSENHA)) > 0), .T., .F.) }


ELE SO PASSARIA PARA O PROXIMO CAMPO SE ESTIVESSE PREENCHIDO CORRETAMENTE

Uma outra opção é criar uma função de validação para cada campo

@ 11,24 SAY "EMPRESA...:" GET cEMPRESA PICTURE "@!" VALID {|| VERIFICAEMPRESA( ) }
@ 12,24 SAY "USUARIO...:" GET cUSUARIO PICTURE "@!" VALID {|| VERIFICAUSUARIO( ) }
@ 13,24 SAY "SENHA.....:" GET cSENHA PICTURE "@!" VALID {|| VERIFICASENHA( ) }

FUNCTION VERIFICAEMPRESA( )
IF (LEN(ALLTRIM(cEMPRESA)) > 0)
RETURN .T.
ELSE
ALERT("PREENCHA O CAMPOS EMPRESA*",{"OK"},"W+/B")
RETURN .F.
ENDIF

Obter o nome do GET e voltar para ele após função

Enviado: 25 Dez 2018 23:12
por Fernando queiroz
Outra coisa que achei estranho é que você não criou os OBJETOS para poder setar o foco neles

ex:

Local oEdit2, mCPFCGC


@ 89,134 GET oEdit2 VAR mCPFCGC SIZE 128,24 PICTURE '99999999999999' MAXLENGTH 14 VALID {|| VERIFICA_CLIENTE( )}


oEdit2:setfocus()

Obter o nome do GET e voltar para ele após função

Enviado: 26 Dez 2018 06:04
por JoséQuintas
Fernando queiroz escreveu:Outra coisa que achei estranho é que você não criou os OBJETOS para poder setar o foco neles
Tá confundindo HWGui e Harbour

LIST SYSTEMS escreveu:1 - Preciso obter o nome do primeiro get de meu formulário
Pra ficar bom, seria melhor alterar a getsys e dividir o valid em duas partes, uma pra validar, e outra pra interagir com o usuário.
Poderia até deixar com cor diferente o que estiver inválido.
No módulo, poderia tirar vantagem do READ SAVE.

Só uma rotina simbólica, porque depende muito do que existe em VALID pra dar certo, e depende da GETSYS que estiver usando.
Também deve precisar ajuste para o que não é GET (como button e outros)

Código: Selecionar todos

@ 2, 2 SAY "dddd" GET x VALID x > 0
@ 3, 2 SAY "xxxx" GET z VALID z > 0
DO WHILE .T.
   READ SAVE
   lExit := .T.
   FOR EACH oElement IN GetList
      IF oElement:When() .AND. ! oElement:Validate()
         oElement:SetFocus()
        lExit := .F.
         EXIT
      ENDIF
   NEXT
   IF lExit
      EXIT
   ENDIF
ENDDO
CLEAR GETS