Página 1 de 1

Gerar formulario sob demanda

Enviado: 07 Jun 2021 21:56
por mauricioportela
A intenção é, gerar um formulário sob demanda, a partir de um array:

estou trabalhando nos detalhes.

Código: Selecionar todos

#include "box.ch"

/*
    A intenção aqui é: a partir de um vetor com os dados para os GETs, gerar a tela sob demanda.

    TODO:
        1. Implementar limites em linhas e colunas;
        2.
            2.1. Colocar mais de um grupo (Label + Edit) na mesma linha;
            ou
            2.2. Alinhar os GETs na coluna de maior valor. **
        
        3. Separar essa funcao (Main) em pequenas funcoes.
*/

FUNCTION Main()
    PUBLIC cCorFrame, cCorLabel, cCorEdit, cCorBotao, cCorTitulo, cCorFundo
    cCorFrame   := "B/W+*"
    cCorLabel   := "B+/W+*"
    cCorEdit    := "W+/N+*"
    cCorBotao   := "W+/R+*,GR+/R"
    cCorTitulo  := "W+/B"
    cCorFundo   := "N/BG+*"

    SETMODE(25,80)
    SET DATE FORMAT TO "dd/mm/yyyy"
    SET TIME FORMAT TO "hh:mm:ss"
    SET SCORE OFF

    CLS
    Novo()

    SET SCORE ON
    @ 23, 00
RETURN Nil


// Funcao Formulario Usuario - (Novo/Editar/Mostrar)


FUNCTION Novo()
    LOCAL cTela, cCor
    LOCAL cTitulo
    LOCAL nId, cNome, cLogin, cSenha, dNascimento, cCPF, cTelefone, cCelular, ;
          cEMail, cSituacao, dInicio, dTermino, cObservacao
    LOCAL aCampo, aTamanho
    LOCAL nLinha, nTopo, nDireita, nPiso, nEsquerda, nColuna

    cTela := SAVESCREEN(,,,,)
    cCor  := SETCOLOR()

    // -------------------------------------------------------------------------
    cTitulo     := "Novo Usuario"
    nId         := SPACE(10)
    cNome       := SPACE(50)
    nNivel      := 1
    cLogin      := SPACE(50)
    cSenha1     := SPACE(20)
    cSenha2     := SPACE(20)
    dNascimento := CTOD("  /  /    ")
    cCPF        := SPACE(11)
    cTelefone   := SPACE(10)
    cCelular    := SPACE(11)
    cEMail      := SPACE(50)
    cSituacao   := SPACE(1)
    dInicio     := DATE()               // CTOD("  /  /    ")
    dTermino    := CTOD("  /  /    ")
    cObservacao := SPACE(50)
    // -------------------------------------------------------------------------
    aCampo := { { "Identificacao", nId        , "9999999999"         }, ;       // , "autozero"  
                { "Nome Completo", cNome      , "@!"                 }, ;       // , "uppercase" 
                { "Nivel"        , nNivel     , "9"                  }, ;       // , "numero"    
                { "Login"        , cLogin     , ""                   }, ;       // , "lowercase" 
                { "Senha"        , cSenha1    , ""                   }, ;       // , "senha"     
                { "Confirma"     , cSenha2    , ""                   }, ;       // , "senha"     
                { "Nascimento"   , dNascimento, "@D"                 }, ;       // , "data"      
                { "CPF"          , cCPF       , "@R 999.999.999-99"  }, ;       // , "cpf"       
                { "Telefone"     , cTelefone  , "@R (99) 9999-9999"  }, ;       // , "telefone"  
                { "Celular"      , cCelular   , "@R (99) 99999-9999" }, ;       // , "celular"   
                { "e-mail"       , cEMail     , ""                   }, ;       // , "email"     
                { "Situacao"     , cSituacao  , "!"                  }, ;       // , "situacao"  
                { "Inicio"       , dInicio    , "@D"                 }, ;       // , "data"      
                { "Termino"      , dTermino   , "@D"                 }, ;       // , "data"      
                { "Observacao"   , cObservacao, ""                   } }        // , "texto"     
    // -------------------------------------------------------------------------

    aTamanho := MaiorElemeto(aCampo)

    CLS
    @ 00, 00, MAXROW(), MAXCOL() BOX SPACE(9) COLOR cCorFundo

    nLinha    := INT((MAXROW() - LEN(aCampo))/2)
    nTopo     := nLinha
    nDireita  := aTamanho[1] + aTamanho[2] +1
    nPiso     := nTopo + LEN(aCampo) +2
    nEsquerda := INT((MAXCOL() - nDireita )/2)
    nColuna   := nEsquerda +1

    janela( nTopo, nEsquerda, nPiso, nDireita, cTitulo )
    nLinha += 2
    FOR x := 1 TO LEN( aCampo )
        @ nLinha, nColuna SAY aCampo[x,1] COLOR cCorLabel
        @ nLinha, (nColuna + aTamanho[1] +1) GET aCampo[x,2] PICTURE aCampo[x,3] COLOR cCorEdit
        nLinha++
    NEXT
    READ
    SETCOLOR(cCor)
    RESTSCREEN(,,,, cTela)
RETURN Nil


FUNCTION janela( nTopo, nEsquerda, nPiso, nDireita, cTitulo )
    @ nTopo, nEsquerda, nPiso, (nEsquerda + nDireita +1) BOX SPACE(9) COLOR cCorFrame
    HB_Shadow(nTopo, nEsquerda, nPiso, (nEsquerda + nDireita +1))
    @ nTopo, nEsquerda SAY SPACE(nDireita +2) COLOR cCorTitulo
    @ nTopo, nEsquerda +1 SAY cTitulo COLOR cCorTitulo
RETURN Nil

FUNCTION MaiorElemeto( aVetor )
    LOCAL nTamLabel := 0
    LOCAL nTamEdit  := 0
    LOCAL m, nTamVetor
    LOCAL aTamanho
    nTamVetor := LEN(aVetor)
    FOR m := 1 TO nTamVetor
        IF nTamLabel > LEN(aVetor[m,1])
            nTamLabel := nTamLabel
        ELSE
            nTamLabel := LEN(aVetor[m,1])
        ENDIF
        IF VALTYPE(aVetor[m,2]) == "N"
            nTamEdit := IF( nTamEdit > aVetor[m,2], nTamEdit, aVetor[m,2])
        ELSEIF VALTYPE(aVetor[m,2]) == "D"
            nTamEdit := IF( nTamEdit > 8, nTamEdit, 8)
        ELSE
            nTamEdit := IF( nTamEdit > LEN(aVetor[m,2]), nTamEdit, LEN(aVetor[m,2]))
        ENDIF
    NEXT
    aTamanho := { nTamLabel, nTamEdit }
RETURN aTamanho

Att.

Mauricio Portela