Página 1 de 1

Alternativa a funcao ALERT()

Enviado: 21 Jun 2023 17:19
por mauricioportela
Alternativa a funcao ALERT()

Código: Selecionar todos

//
// Janela com botoes de opcao
// Alternativa a funcao ALERT()
// 
// Funcao:
//      Janela_Opcao(cTitulo, aMensagem, aOpcoes)
//
// Parametros:
//      cTitulo      String
//      aMensagem    Array de String (cada item, uma linha)
//      aOpcoes      Botoes (prompt)
// 
//

#include "box.ch"

#command COR TELA => SETCOLOR("W+/B*")
#command COR SAIDA => SETCOLOR("W/N")

FUNCTION Main()

    SETMODE(25,80)

    COR TELA
    CLS
    ReguaH(0)

    // -------------------------------------------------------------------------
    cTela     := SAVESCREEN(0,0,MAXROW(),MAXCOL())
    cTitulo   := "Tipo de Usuario"
    aMensagem := {"Novo usuario:", ;
                  "Qual o tipo de usuario?"}
    aOpcoes   := {"Administrador","Operador","Suporte*"}
    nRetorno  := Janela_Opcao(cTitulo, aMensagem, aOpcoes)
    @ MaxRow(), 02 SAY nRetorno
    inkey(0)
    RESTSCREEN(0,0,MAXROW(),MAXCOL(),cTela)
    // -------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    cTela     := SAVESCREEN(0,0,MAXROW(),MAXCOL())
    // Tamanho do Titulo maior que a maior linha do array de mensagem ...
    cTitulo   := "Sobre a Empresa Desenvolvedora do Sistema BLA BLA BLA"
    aMensagem := {"Empresa Desenvolvedora do Sistema", ;
                  "Versao 1.0", ;
                  "Registrado para:", ;
                  "Empresa Cliente Ltda", ;
                  "12.123.123/0001-99", ;
                  "Status: Ativo"}
    nRetorno  := Janela_Opcao(cTitulo, aMensagem,)
    @ MaxRow(), 02 SAY nRetorno
    inkey(0)
    RESTSCREEN(0,0,MAXROW(),MAXCOL(),cTela)
    // -------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    cTela     := SAVESCREEN(0,0,MAXROW(),MAXCOL())
    cTitulo   := "Copia de Seguranca"
    aMensagem := {"Deseja criar a copia de seguranca, compactando a base de dados agora?"}
    aOpcoes   := {"Sim","Nao"}
    nRetorno  := Janela_Opcao(cTitulo, aMensagem, aOpcoes)
    @ MaxRow(), 02 SAY nRetorno
    inkey(0)
    RESTSCREEN(0,0,MAXROW(),MAXCOL(),cTela)
    // -------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    cTela     := SAVESCREEN(0,0,MAXROW(),MAXCOL())
    cTitulo   := "Sair do Sistema"
    aMensagem := {"Deseja realmente sair do Sistema?"}
    aOpcoes   := {"Sim","Nao"}
    nRetorno  := Janela_Opcao(cTitulo, aMensagem, aOpcoes)
    @ MaxRow(), 02 SAY nRetorno
    inkey(0)
    RESTSCREEN(0,0,MAXROW(),MAXCOL(),cTela)
    // -------------------------------------------------------------------------

RETURN Nil

FUNCTION ReguaH(nLinha)
    @ nLinha  , 0 SAY REPLICATE("1234567890",8)
    @ nLinha+1, 0 SAY REPLICATE(SPACE(9)+"|",8)
RETURN Nil

FUNCTION Janela_Opcao(cTitulo, aMensagem, aOpcoes)
    LOCAL cCor := SETCOLOR()
    LOCAL cTela, nTopo, nEsquerda, nBase, nDireita, nBarra, nEscolha
    LOCAL nTamRow, nTamCol, nTamMsg, nTamItem, nTamTodasAsOpcoes
    LOCAL x, w, y

    aOpcoes           := iif( aOpcoes == Nil, {"OK"}, aOpcoes)
    nTamRow           := MAXROW()
    nTamCol           := MAXCOL()
    nTamMsg           := LEN(aMensagem)
    nTamItem          := 0
    nTamTodasAsOpcoes := 0

    FOR x := 1 TO nTamMsg
        nTamItem := iif(LEN(aMensagem[x]) >= nTamItem, LEN(aMensagem[x]), nTamItem)
    NEXT
    FOR w := 1 TO LEN(aOpcoes)
        nTamTodasAsOpcoes += LEN(aOpcoes[w]) +4
    NEXT

    // espacos entre os botoes
    nTamTodasAsOpcoes += (LEN(aOpcoes)-1) 

    // Ajusta o tamanho à maior linha ...
    nTamItem := iif(nTamItem >= nTamTodasAsOpcoes, nTamItem, nTamTodasAsOpcoes)

    // coordenadas para a janela ...
    nTopo     := ((nTamRow - nTamMsg)/2) -1
    nEsquerda := ((nTamCol - nTamItem)/2) -1
    nBase     := nTopo + nTamMsg +3
    nDireita  := nEsquerda + nTamItem +1
    nBarra    := (nDireita - nEsquerda) +1

    // Se o tamanho do Titulo for maior que a maior linha do array de mensagem ...
    // Ajusta o Titulo para apresentar o necessario com reticencias ("...")
    cTitulo := iif(nBarra <= LEN(cTitulo),SUBSTR(cTitulo,1,nBarra-5) + "...",cTitulo)

    // Salva a tela ...
    cTela := SAVESCREEN(nTopo, nEsquerda, nBase, nDireita)

    // Desenha a janela ...
    @ nTopo, nEsquerda, nBase, nDireita BOX SPACE(9) COLOR "W+/N*"

    // Desenha a barra de titulo ...
    @ nTopo, nEsquerda SAY SPACE(nBarra) COLOR "W+/B"
    @ nTopo, nEsquerda+1 SAY cTitulo COLOR "W+/B"

    // Imprime as linhas do array na janela ...
    FOR x := 1 TO nTamMsg
        @ nTopo + x, nEsquerda +1 SAY aMensagem[x] COLOR "W+/N*"
    NEXT

    // Posiciona na ultima linha dentro da janela ...
    @ nBase -1,  (nEsquerda + (nDireita - nTamTodasAsOpcoes))/2 SAY ""  COLOR "W+/N*"

    // ajusta as cores do prompt (menu) ...
    SETCOLOR("W+/N*,GR+/R*")
    FOR y := 1 TO LEN(aOpcoes)
        @ nBase -1, COL() +1 PROMPT CHR(16) + CHR(32) + aOpcoes[y] + CHR(32) + CHR(17)
    NEXT
    MENU TO nEscolha

    // restaura a tela e retorna a cor original ...
    RESTSCREEN(nTopo, nEsquerda, nBase, nDireita, cTela)
    SETCOLOR(cCor)

    // retorna o valor do botao selecionado ...
RETURN nEscolha
Att.
Mauricio Portela

Alternativa a funcao ALERT()

Enviado: 18 Jul 2023 10:17
por clodoaldomonteiro
Olá Maurício.

Faltou informar se é pra Clipper, Harbour ou xHarbour.

Grato pela dica.

Alternativa a funcao ALERT()

Enviado: 18 Jul 2023 15:08
por mauricioportela
Ola!

Acredito que sirva para todos, pois eu usei somente comandos/funcoes nativas. Eu uso o harbour 3.2 (TUI).

Att.
Mauricio

Alternativa a funcao ALERT()

Enviado: 18 Jul 2023 20:56
por alxsts
Olá!

Grato pela contribuição.

No Harbour existe uma função nativa que faz a mesma coisa e ainda permite que se escolha a cor do alerta, além de ter um parâmetro que indica o tempo que a mensagem deve ser exibida. Veja hb_Alert ()

Alternativa a funcao ALERT()

Enviado: 19 Jul 2023 00:10
por mauricioportela
Ola!

Tem a questão de estética (perfumaria). veja:

Att.
Mauricio

Alternativa a funcao ALERT()

Enviado: 19 Jul 2023 11:57
por JoséQuintas
Usuário console já é muito ridicularizado.
Fazendo isso piorou.

Volte 40 anos no tempo, nos exemplos do Clipper 5.2, e vai ter algo melhor que isso.
É no exemplo de browse, que simula uma planilha de lotus 123.
Não sei se tem o mesmo exemplo no Clipper 5.3, só tenho certeza sobre o 5.2.

Se eu encontrar aqui em algum lugar o 5.2, posto aqui.

De qualquer forma, o trabalho foi interessante, porque até mesmo GUI depende desse básico.
Não é qualquer um que vai criando funções pra facilitar as coisas, ainda mais partindo do zero.

Alternativa a funcao ALERT()

Enviado: 19 Jul 2023 15:36
por clodoaldomonteiro
alxsts escreveu:Olá!

Grato pela contribuição.

No Harbour existe uma função nativa que faz a mesma coisa e ainda permite que se escolha a cor do alerta, além de ter um parâmetro que indica o tempo que a mensagem deve ser exibida. Veja hb_Alert ()
Vi que existe a mesma coisa no xHarbour.
Alert()
Displays a text-mode dialog box with a message.
Syntax
Alert( <xMessage>, [<aOptions>], [<cColor>], [<nDelay>] ) --> nChoice

Arguments
<xMessage>
This is the message to display in the dialog box. It can be of any data type but is usually a character string or an array filled with strings. If <xMessage> is a character string, the semicolon is treated as a new line character. When it is an array, each element is displayed in a new line of the dialog box.
<aOptions>
<aOptions> is an array filled with character strings. Each element is displayed as prompt for the user to make a selection. If no parameter is passed, <aOptions> defaults to { "Ok" }.
<cColor>
This is a color string holding two color values. The Normal color is used to display the dialog box along with <xMessage>. The options to select from are displayed in the Enhanced color. The default is "W+/R,W+/B".
<nDelay>
Optionally, a numeric value can be specified, indicating the number of seconds to wait for a key press before the dialog box closes automatically. It defaults to zero, which means that the dialog box does not close automatically. Return
The function returns a numeric value indicating the ordinal position within <aOption> of the prompt selected by the user. When the ESC key is pressed, the user aborted the selection and the return value is 0.
If <nDelay> is specified and this number of seconds has elapsed without a key press, the return value is 1.

Código: Selecionar todos

// The example displays a message to terminate or resume the program.
// After 5 seconds without user response, the program quits automatically.

   PROCEDURE Main()
      LOCAL cMessage, aOptions, nChoice

      cMessage := "Quit program?;(auto-quit in 5 seconds)"
      aOptions := { "Yes", "No" }

      nChoice := Alert( cMessage, aOptions, , 5)

      DO CASE
      CASE nChoice == 0
         ? "Program not interrupted ..."
      CASE nChoice == 1
         QUIT
      CASE nChoice == 2
         ? "Program resumed ..."
      ENDCASE

    RETURN
T+

Alternativa a funcao ALERT()

Enviado: 19 Jul 2023 16:12
por mauricioportela
Ola!

Não sei se entendi as mensagens acima mencionando que o (x)Harbour tem a função.

Minha intenção foi contribuir com uma "alternativa", ou seja, dá mais uma opção para usar no sistema.

Já passei por situações onde aparecia na tela, mensagens dentro do "alert" e, alguns "consultores" de clientes metendo o pau no sistema, dizendo que era coisa ultrapassada etc...

Att.
Mauricio

Alternativa a funcao ALERT()

Enviado: 19 Jul 2023 16:13
por JoséQuintas
Sim
hbmk2 -find alert

Harbour core (installed):
Alert()
hb_Alert()
hb_gtAlert()

Estou sem leitor de CD/DVD, senão colocaria a do exemplo do Clipper.

Alternativa a funcao ALERT()

Enviado: 19 Jul 2023 17:06
por JoséQuintas
Como está em CD/DVD e não tenho leitor, pesquisei no google clipper 5.2 samples
samples.png
VivaClipper não serve, o próximo é do github

Tem o clipper inteiro, ao que parece.
Falei que era exemplo de browse, de planilha, então... algo sobre browse e sobre planilha, spreadsheet em inglês
Cheguei nesse TBROW, SPRDSHT.

https://github.com/ibarrar/clipper/tree ... OW/SPRDSHT

Baixei, mas precisei colocar o nome de MAIN() no primeiro fonte, pois esse é o ponto de partida, senão o harbour não executa nada.
clipper.png
Está aí então.
Uma novidade de décadas atrás.
Exemplo original do Clipper.

Nota: Lembro tudo de minhas ferramentas de trabalho, mesmo que não use mais o Clipper há uns 15 anos.

Alternativa a funcao ALERT()

Enviado: 19 Jul 2023 17:29
por JoséQuintas
Uia, vale até um destaque

Código: Selecionar todos

/*****
 *
 * BUTTONS.CH
 * Header file for the button functions
 *
 *
 */

#xtranslate   .row          =>   \[1\]
#xtranslate   .col          =>   \[2\]

#xtranslate   .len          =>   \[3\]

#xtranslate   .shadRow      =>   \[4\]
#xtranslate   .shadCol      =>   \[5\]
#xtranslate   .letCol       =>   \[6\]
#xtranslate   .upShadCol    =>   \[7\]

#xtranslate   .butStr       =>   \[8\]
#xtranslate   .butLet       =>   \[9\]

#define       SIZE               9

#define       BUTTOMBGHI         "N/BG*"
#define       BUTTOMBGLO         "N/BG"
#define       BUTTOMLETHI        "R+/BG*"
#define       BUTTOMLETLO        "R+/BG"

#define       TRUE               .T.
#define       FALSE              .F.

// EOF - BUTTONS.CH //
e o fonte button.prg

Código: Selecionar todos

   // Build String
   aArray.butStr := SUBSTR(cStr, 1, nAt - 1) +;
                  SUBSTR(cStr, nAt + 1)
   aArray.len    := LEN(aArray.butStr)
   aArray.letCol := nCol + nAt - 1
   aArray.butLet := SUBSTR(aArray.butStr, nAt, 1)

   // Where
   aArray.row       := nRow
   aArray.col       := nCol
   aArray.ShadRow   := nRow + 1
   aArray.ShadCol   := nCol + 1
   aArray.upShadCol := nCol + aArray.len
Parece até classe, ou talvez seja, mas não do jeito que a gente conhece hoje.

Alternativa a funcao ALERT()

Enviado: 19 Jul 2023 18:00
por mauricioportela
Ola!

Quintas, realmente, é um trabalho excelente!

Eu testei aqui tbm. Pra quem ainda tem trabalhos TUI, como eu, dá pra aproveitar a ideia!

Obrigado!

Att.
Mauricio

Alternativa a funcao ALERT()

Enviado: 19 Jul 2023 18:29
por JoséQuintas
mauricioportela escreveu:Quintas, realmente, é um trabalho excelente!
Eu testei aqui tbm. Pra quem ainda tem trabalhos TUI, como eu, dá pra aproveitar a ideia!
Obrigado!
Faz parte do Clipper 5.2, vinha como exemplo.

Se usa console mesmo, pode optar pelas alternativas harbour dele mesmo.
Só de mudar a quantidade de linhas/colunas já te dá a opção de trabalhar melhor com as telas.
Também pode usar as mensagens do windows, e outras coisas mais, se achar que vale a pena.
Acaba usando os mesmos fontes, e pode alterar quando quiser, e se quiser.

Alternativa a funcao ALERT()

Enviado: 19 Jul 2023 18:31
por alxsts
Olá!

Na Seção Downloads do Fórum tem um Zip contendo a instalação completa do Clipper 5.2e (cópia das pastas já instalado). Instalação do Clipper versão 5.2e (Modo instalado) - Site do Maligno

Lembrando que a Seção Downloads do Fórum está com problema de acesso no estilo clássico de exibição do Fórum. Para que funcione, use o link "Mudar para estilo Celular".

Clipper5 download