dbNavigator (modo DOS)

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

alvaro.bernardi
Usuário Nível 1
Usuário Nível 1
Mensagens: 40
Registrado em: 22 Nov 2008 11:02
Localização: Porto Velho

dbNavigator (modo DOS)

Mensagem por alvaro.bernardi »

Função para colocar uma barra de navegação do tipo "primeiro registro, anterior, proximo, ultimo, novo, excluir, editar, salvar, sair"

Código: Selecionar todos

funct DbNav( L_,;
             C_,;
             _BOT_DEFAULT_,;
             _ATIVO_,;
             _ARRBOTOES_,;
             HINT,;
             _COR_ATIVA_,;
             _COR_INATIVA_,;
             COR_BOX,;
             _FUNC_USER_,;
             _ICO_BOTAO_,;
             _SOMBRA_)

*****************************************************************************************************
* Funcao DbNav( <linha>, <coluna>,;
*               [<botao default>],;
*               [<ativo>],;
*               [<lista de botoes>],;
*               [<hint>],;
*               [<cores ativas>],;
*               [<cores inativas>],;
*               [<cor da caixa>],;
*               [<funçao do usuário>]
*               [<icone do botao>],;
*               [<sombra>]
*
*   linha e coluna - linha e coluna da barra
*   botao default - botao inicial da barra ( default 5 ) 
*   ativo - barra ativa (navegar) ou nao (s¢ mostrar)
*   lista de botoes - lista com os numeros dos botoes ativos ( 1 at‚ 9 ) ( defaut '0123456789')
*                   9 botoes que retornam: ( 1 a 9 )
*                      1 - Primeiro registro ( go top interno )
*                      2 - Registro anterior ( skip -1 interno )
*                      3 - Proximo registro ( skip interno )
*                      4 - Ultimo registro  ( go botton interno )
*                      5 - Incluir registro ( append blank interno )
*                      6 - Excluir registro ( delete interno )
*                      7 - Alterar registro ( read interno )
*                      8 - Localizar registro ( seek interno )
*                      9 - Sair
*   hint - ajuda r pida ( n§ da linha ) ( default 23 )
*   cores ativas - cores dos botoes ativos ( default 'W+/W,GR+/N' )
*   cores inativas - cores dos botoes inativos ( default 'N+/W,W+/N' )
*   cor da caixa - cor da caixa dos botoes ( default 'N+/B' )
*   fun‡ao do usu rio - Mensagem criado pelo usu rio para o botÆo 8
*   icone do botao - "icone" a ser mostrado no botÆo ( default = "" )
*   sombra - mostrar sombra ou nÆo ( default = .f. )  
*
*   Retorno - Tecla pressionada
*
********************************************************************************

*** Vari veis locais
local  _cont_,;                                            // Contadora
       _arr_bot_ := {},;                                   // Cria a matriz de botao vazia
       _arr_mss_ := {},;                                   // Cria a matriz de hint's vazia
       ci:= c_,;                                           // Pega a coluna inicial
       LINHA_BOT,;                                         // Linha dos botoes
       COR_NAV := setcolor(),;                             // Salva as cores
       CURSOR_NAV := setcursor(),;                         // Salva o cursor
       LINHA_SCR,;                                         // Para guardar a janela
       BOT_ATIV := {},;                                    // Cria a matriz de botoes ativos vazia
       CCC := 0                                            // Mais um contador

static _botao_                                             // Quando voltar estar  como deixou

*** Matriz de botoes
aadd( _arr_bot_, ' ® ' )                    //1
aadd( _arr_bot_, '  ' )                    //2
aadd( _arr_bot_, '  ' )                    //3
aadd( _arr_bot_, ' ¯ ' )                    //4
aadd( _arr_bot_, ' + ' )                    //5
aadd( _arr_bot_, ' - ' )                    //6
aadd( _arr_bot_, '  ' )                    //7
if empty( _ICO_BOTAO_ )
   aadd( _arr_bot_, '  ' )                 //8
else
   aadd( _arr_bot_, ' ' + _ICO_BOTAO_ + ' ' )   
endif
aadd( _arr_bot_, ' x ' )                    //9

if empty( _FUNC_USER_ )
   _FUNC_USER_ := '      Botao 8       '
endif

*** Matriz de hints
aadd( _arr_mss_, ' Primeiro  registro ' )
aadd( _arr_mss_, ' Registro  anterior ' )
aadd( _arr_mss_, '  Proximo registro  ' )
aadd( _arr_mss_, '  Ultimo  registro  ' )
aadd( _arr_mss_, '  Incluir registro  ' )
aadd( _arr_mss_, '  Excluir registro  ' )
aadd( _arr_mss_, '  Alterar registro  ' )
aadd( _arr_mss_, _FUNC_USER_ )
aadd( _arr_mss_, '        Sair        ' )

*** Verifica os parametros passados

if !empty( _bot_default_ )
   _botao_ := _bot_default_
endif

if empty( _COR_ATIVA_ )                                    // se nao passou cores
   _COR_ATIVA_  := 'W+/W,GR+/N'                            // pega default
endif

if empty( _COR_INATIVA_ )                                  // se nao passou cores
   _COR_INATIVA_ := 'N+/W,W+/N'                            // pega default
endif

if empty( HINT )                                           // se nao passou o hint
   HINT := 23                                              // poe na linha 23
endif

*** Cor do box
if empty( COR_BOX )
   COR_BOX := 'B+/B'
endif

if empty( _SOMBRA_ )
   _SOMBRA_ := .F.
endif

keyboard chr( 0 )

LINHA_SCR := savescreen( HINT, 00, HINT, 79 )              // salva a linha do hint

set message to HINT center                                 // local do hint

*** Se nao tem lista de botoes...
if empty( _ARRBOTOES_ )
   _ARRBOTOES_ := '123456789'                              // poe todos
endif
if ci - 2 < 1                                              // Coluna para os botoes
   ci := 2
endif
setcolor( COR_BOX )
@ l_-1, ci-2 to l_+1, ci+36 DOUBLE                         // Moldura da caixa

if _SOMBRA_
   sombra( l_-1, ci-2, l_+1, ci+36 )
endif

setcolor( _COR_ATIVA_ )
setcursor( 0 )                                             // Sem cursor
for _CONT_ := 1 to 9                                       // La‡o dos botoes
    if ( _ativo_ == .T. ) .and. ;
       ( alltrim( str( _CONT_ ) ) $ _ARRBOTOES_ )          // verifica se ‚ botÆo ativo
       *** ‚ botao ativo e est  na lista
       setcolor( _COR_ATIVA_ )                             // Cor do botao ativo
       @ l_, ci promp _arr_bot_[_cont_];
                      message _arr_mss_[_cont_]            // Desenha o botao ativo
       aadd( BOT_ATIV, _cont_ )                            // Pega o numero correto do botao ativo
    else
       setcolor( _COR_INATIVA_ )                           // Cor inativa
       @ l_, ci say _arr_bot_[_cont_]                      // Desenha botao inativo
    endif
    ci := ci + 4                                           // Proxima posi‡ao do botao
next
if _ativo_                                                 //  menu ativo
   menu to _botao_                                         // Ilumina os botoes ativos
endif
if _ativo_                                                 // A barra ‚ ativa
    if lastkey() == 27
       _botao_ := len( BOT_ATIV )
    endif
    ccc := BOT_ATIV[_botao_]                               // Pega o botao correto
    LINHA_BOT := savescreen( l_, 00, l_, 79 )              // Salva a linha dos botoes
    c_++
    do case
       case ccc == 1
            *** Inicio do arquivo
            @ l_, c_    say '    ' color COR_BOX
            @ l_, c_    say _arr_bot_[ccc] color 'W+/N'    // Botao pressionado
            inkey( .07 )                                   
            restscreen( l_, 00, l_, 79, LINHA_BOT )
            go top                                         // Vai para o topo
       case ccc == 2
            *** Registro anterior
            @ l_, c_+04 say '    ' color COR_BOX
            @ l_, c_+04 say _arr_bot_[ccc] color 'W+/N'
            inkey( .07 )
            restscreen( l_, 00, l_, 79, LINHA_BOT )
            skip -1                                        // Volta 1
       case ccc == 3
            *** Pr¢ximo registro
            @ l_, c_+08 say '    '
            @ l_, c_+08 say _arr_bot_[ccc] color 'W+/N'
            inkey( .07 )
            restscreen( l_, 00, l_, 79, LINHA_BOT )
            skip                                           // Avan‡a 1
            if eof()
               skip -1
            endif
       case ccc == 4
            *** Ultimo registro
            @ l_, c_+12 say '    '
            @ l_, c_+12 say _arr_bot_[ccc] color 'W+/N'
            inkey( .07 )
            restscreen( l_, 00, l_, 79, LINHA_BOT )
            go bott                                        // Fim do arquivo
            if eof()
               skip -1
            endif
       case ccc == 5
            *** Novo registro
            @ l_, c_+16 say '    '
            @ l_, c_+16 say _arr_bot_[ccc] color 'W+/N'
            inkey( .07 )
            restscreen( l_, 00, l_, 79, LINHA_BOT )
            append blank                                   // Cria novo registro
            read
       case ccc == 6
            *** Deletou o registro
            @ l_, c_+20 say '    '
            @ l_, c_+20 say _arr_bot_[ccc] color 'W+/N'
            inkey( .07 )
            restscreen( l_, 00, l_, 79, LINHA_BOT )        
            delete                                         // Marcou para apagar
       case ccc == 7
            *** Edita o registro
            @ l_, c_+24 say '    '
            @ l_, c_+24 say _arr_bot_[ccc] color 'W+/N'
            inkey( .07 )
            restscreen( l_, 00, l_, 79, LINHA_BOT )
            setcursor( CURSOR_NAV )
            read                                           // Faz a atualiza‡ao dos reads pendentes
            setcursor( 0 )                                 // Sem cursor
       case ccc == 8
            *** Fun‡Æo do usu rio
            @ l_, c_+28 say '    '
            @ l_, c_+28 say _arr_bot_[ccc] color 'W+/N'
            inkey( .07 )
            restscreen( l_, 00, l_, 79, LINHA_BOT )
            clear gets
       case ccc == 9
            *** Sinaliza para sair e limpa os gets
            @ l_, c_+32 say '    '
            @ l_, c_+32 say _arr_bot_[ccc] color 'W+/N'
            inkey( .07 )
            restscreen( l_, 00, l_, 79, LINHA_BOT )
            clear gets                                     // Limpa os gets pendentes
    endcase
endif

*** Restaura o ambiente
setcolor( COR_NAV )
setcursor( CURSOR_NAV )
set message to 
restscreen( HINT, 00, HINT, 79, LINHA_SCR )

*** Limpa as matrizes
_arr_bot_ := {}
_arr_mss_ := {}
BOT_ATIV  := {}
a rotina extra "sombra" utilizada é uma rotina para criar sombra nos botões, vc pode cria-la facilmente mudando a cor de fundo da região pretendida.

para utiliza-la veja este exemplo (é só um exemplo...)

Código: Selecionar todos

Local TelaCnfRm := SaveScreen( 0, 0, 24, 79 )
sele CNFRMBAN
quadro('06','03','20','76',' Configuracao de remessas bancarias ','W+/B')
do while .t.
   reglock(.t.)
   @ 07, 04 CLEAR TO 17, 75
   TelaRemessa()

  **********************************************************************************************
  RESPOSTA := DbNav( 19,38,9,.T.,'12345679',,,,'N/B' )  // CHAMA AQUI O DBNAV 
  // LINHA 19, COLUNA 38
  // BOTÃO ATIVO 9 (Sair)
  // .T. PARA ATIVAR
  // LISTA DOS BOTÕES A SEREM UTILIZADOS (DE 1 A 9)
  **********************************************************************************************

   do case
      case RESPOSTA == 9                       // Acenou para sair
           unlock
           exit                                     // Sai aqui
      case RESPOSTA == 5
           read
      case RESPOSTA == 6
           if MsgAlert("Tem certeza que deseja excluir este banco?", "Atencao", {" Nao "," Sim "}) = 1
              recall
           endif
      otherwise
           clear gets
   endcase
   unlock
enddo
RestScreen( 0, 0, 24, 79, TelaCnfRm )
retu( "" )
OBS: O arquivo DBF deve ser aberto antes de utilizer o DbNav, e seu Alias setado, pois ele assume o arquivo atual
Álvaro de Oliveira Bernardi
Microline Software
Porto Velho - RO
Responder