Blog de Major Anilto

Os anúncios devem ficar desbloqueados para que este site exista e continue gratuito.

Uma função simples para mostrar os codigos de caracteres de 32 até 255

Foto de Major Anilto

Esta função mostra os caracteres de 32 até 255.


#include "hbgtinfo.ch"
REQUEST HB_LANG_PT
REQUEST HB_CODEPAGE_EN

function main()
    local l
    local i
    SetMode(60,180)
    
    REQUEST HB_GT_WVT_DEFAULT    
    HB_LANGSELECT('PT')
    HB_CDPSELECT('EN')    
    
       
    HB_GtInfo( HB_GTI_MAXIMIZED, .F. )
    HB_GtInfo( HB_GTI_FONTNAME, "Courier new" )
    HB_GtInfo( HB_GTI_WINTITLE, "Teste de menu" )
    
    for i = 32 to 255
        ?? i
        ?? "=" + chr(i) + " "
    next
    wait "Pressione uma tecla"
return

Estudo da função MenuModal() para criação de menus (modo console)

Foto de Major Anilto

(Texto de acordo com a documentação original do Clipper.)

A função MENUMODAL() ativa a barra superior de um menu (top bar).

Descrição:

MENUMODAL() é uma função de interface de usuário que implementa o sistema de menu suspenso em CA-Clipper.

Faz parte da arquitectura aberta do sistema GET do CA-Clipper. MENUMODAL() é similar ao comando READ na medida em que espera que o usuário execute uma ação. No entanto, a função MENUMODAL() só responderá a ações do menu.

Para implementar um objeto de menu ao mesmo tempo que outros objetos, utilize a função READMODAL() que tem um dos seus argumentos como objeto TopBarMenu.

Quando o utilizador escolhe um item do menu, o controle é passado para o bloco de códigos associado a esse item específico do menu. Os blocos de códigos são definidos utilizando a classe MenuItem.

Os itens do menu podem ser selecionados usando o teclado ou o mouse.

Para selecionar um item de menu com o mouse, basta selecionar o item TopBarMenu com o mouse e então escolher o item de menu PopUp apropriado.

Nota: A função MENUMODAL() irá pegar um evento do menu do usuário e então terminará. Para evitar isto, o seguinte pode ser usado, e o mesmo permitirá que o programa aceite continuamente os eventos do menu:

 

     DO WHILE (MENUMODAL(o_menu,...) <> ExitMenu)
     ENDDO

 

Sintaxe:

MENUMODAL( oTopBar, nSelection , nMsgRow, nMsgLeft, nMsgRight, cMsgColor ) --> MenuID

Argumentos:

oTopBar é um objeto TopBarMenu criado a partir da classe TopBarMenu.

nSelection é o item TopBarMenu selecionado por default.

nMsgRow o número da linha onde aparecerão as mensagens de item de menu.

nMsgLeft especifica a margem esquerda para as mensagens dos itens do menu.

nMsgRight especifica a margem direita para as mensagens dos itens do menu.

cMsgColor define a cadeia de cores para as mensagens do item de menu.É composto por um único par de primeiro plano/fundo.

 

Retorno:

MENUMODAL() devolve a ID do menu do item de menu escolhido. As IDs dos menus são atribuídas utilizando a classe MenuItem.

A tabela a seguir lista as teclas ativas que podem ser usadas durante o MENUMODAL():

Tecla ---- Ação

Seta esquerda, Ctrl+S: Move para o próximo item TopBarMenu à esquerda. Se não houver mais itens à esquerda, o item mais à direita do TopBarMenu será selecionado.

Seta direita, Ctrl+D: Move para o próximo item TopBarMenu à direita. Se não houver mais itens à direita, o item mais à esquerda do TopBarMenu será selecionado.

Seta para cima, Ctrl+E: Ir para o item anterior do menu PopUp. Se não houver mais itens acima do item atual, o item do menu na parte inferior será selecionado.

Seta para baixo, Ctrl+X: Move para o próximo item do menu PopUp. Se não houver mais itens abaixo do item atual, o item do menu no topo será selecionado.

 

Exemplos:

Veja o arquivo de exemplo Menu.prg no diretório \CLIP53\SOURCE\SAMPLE. O exemplo demonstra a combinação dos objetos TopBarMenu, PopUpMenu e MenuItem para criar um menu com uma série de opções disponíveis. Veja "Introdução ao Sistema de Menus" no Guia de Programação e Utilitários para mais informações sobre o uso desta função.

 

Arquivos:

Biblioteca: CLIPPER.LIB, arquivo fonte: SOURCE\SYS\MENUSYS.PRG

 

Um exemplo básico (com algumas melhorias Harbour):

/*
	Exemplo de menu usando menumodal e 
	menusys1 (menusys original modificado para eventos do mouse
	Major Anilto - 17Abr2020
*/

#include "button.ch"
#include "inkey.ch"
#include "box.ch"

/* Para usar acentuações, mouse, etc */
#include "hbgtinfo.ch"		//acrescentado no harbour
REQUEST HB_LANG_PT			//acrescentado no harbour - português
REQUEST HB_CODEPAGE_PTISO	//acrescentado no harbour - codepage 
REQUEST HB_GT_WVT_DEFAULT

Function Main()
	LOCAL oInfo
	LOCAL Retorno := 0
	LOCAL sai := "N"
	PUBLIC Coluna := 80
	PUBLIC Linha := 40
	
	/* Para usar acentuações, etc.) */
	HB_LANGSELECT('PT')
	HB_CDPSELECT('PTISO')   
   	HB_GtInfo( HB_GTI_MAXIMIZED, .F. )
	HB_GtInfo( HB_GTI_FONTNAME, "Courier Prime" )
	HB_GtInfo( HB_GTI_WINTITLE, "Teste de menu" )
	
	/* Configurações do ambiente */
	SET( _SET_EVENTMASK, INKEY_ALL )	   
	MSETCURSOR(.T.)
	set cursor off
	set score off
	setmode(Linha,Coluna)
	Cls
	/* Isto permite mudar toda a paleta de cores */
	PALETA()
	/* Chamada para criar um objeto de menu */
	oInfo:=CriaMenu()
	/* Loop para execução do menu */
	WHILE Retorno == 0
		Retorno := MENUMODAL(oInfo,1,Linha-1,0,Coluna-1,"W+/b")
		/* Aqui chama alguma função para tratar a saída do sistema */
	ENDDO
Return ( NIL )
	
/* Criação da estrutura do menu */
Function CriaMenu() // Usando a função MenuModal()
   LOCAL oTopBar, oPopUp, oPopUp1, oPopUp2
   LOCAL COR := "w/bg,W+/rb,gr+/bg,gr+/rb,w/N,w/B" 
   LOCAL COR1 := "w+/b,W+/rb,gr+/g,gr+/rb,w/N,w/B"
   
	/* Cria a barra de menus na linha 1, a partir da coluna 1 até a coluna Coluna-2) */
    oTopBar := TopBar( 1,0, Coluna - 1) 	/* linha, coluna tamanho */
    oTopBar:ColorSpec :=cor1				/* especifica as cores */
	
	/* Coloca os elementos do menu */
    oTopBar:AddItem( MenuItem ( "Pedido",{ || Pedido()},,"Novo pedido") )			
    oTopBar:AddItem( MenuItem ( "Cadastro",{ || Cadastro()},, "Cadastro de clientes") )	
    oTopBar:AddItem( MenuItem ( "Fornecedores",{ || Forn()},,"Cadastro de fornecedores") )		
    oTopBar:AddItem( MenuItem ( "Estoque",{ || Estoque()},, "Controle de estoque") )	
    oTopBar:AddItem( MenuItem ( "Utilitários",{ || Util()},,"POPUP") )	
	
Return ( oTopBar)

/* Funções chamadas pelos itens do menu */
Function Pedido()
Alert("Novos pedidos")
Return

Function Cadastro()
Alert("Cadastramento de clientes")
Return

Function Forn()
Alert("Cadastramento de fornecedores")
Return

Function Estoque()
Alert("Controle de estoque")
Return

Function Util()
Alert("Utilitários do sistema")
Return

/* Função que muda a paleta de cores */
Function paleta()
	local aPal := { 	0x000000, ; //0 N
						0xd27619, ; //1 B
						0x004d00, ; //2 G
						0xc1ac00, ; //3 BG
						0x1c1cb7, ; //4 R
						0xdaa89f, ; //5 RB
						0xc8ccd7, ; //6 GR
						0x222222, ; //7 N+
						0x888888, ; //8 W 
						0xfab481, ; //9 B+
						0x84c781, ; //10 G+
						0xf2ebb2, ; //11 BG+
						0x7373e5, ; //12 R+
						0xdb9db3, ; //13 RB+
						0x58eeff, ; //14  GR+
						0xffffff }  //15 W+
	aPal1 := HB_GtInfo( HB_GTI_PALETTE, aPal)

Return NIL

Downloads: 

menu3.zip — Baixado 33 vezes

Gerador de menus (modo console)

Foto de Major Anilto

Encontrei nos meus arquivos um pequeno gerador de menus, criado por Jan Bucek em 1998. Compilei no Harbour e está funcionando.

Não é muito amigável, feio prá c...,  meio difícil de lidar, mas gera a estrutura necessária para criar menus com a classe de menus do Harbour (originalmente do Clipper), que depois deve ser copiada e colada no seu programa principal e chamado através da função menumodal().

No pacote .zip anexo, coloquei também o MenuSYS1.prg (MenuSYS original modificado para aceitar mais eventos do mouse), que deve ser compilado junto com seu programa para que tenha as facilidades do mouse à disposição.

 

Downloads: 

genmenu1.zip — Baixado 31 vezes

Modificando o Menusys do Harbour (e Clipper 5.3) - 2

Foto de Major Anilto

Andei corrigindo algumas falhas da minha antiga modificação do menusys do Clipper 5.3 para uso com mouse.

Desta vez editei no Notepad++ formatado para ANSI, colocando lang em PT e codepage PTISO. Assim consegui manter a acentuação do português e sem os pequenos defeitos apresentados nos PRG anteriores (menuloja.prg). É interessante observar as rotinas de tratamento de eventos do mouse, isso pode ser util para outras aplicações modo console que precisam tratar do mouse. As ficaram supercarregadas porque no original desse programa eu usava a LLIBG com a função VGAPalette(), que dava para escolher cores melhores, mas essa biblioteca não funciona  no Harbour. 

 

Downloads: 

menu.zip — Baixado 28 vezes

Recomendação para os novos adeptos do Clipper.

Foto de Major Anilto

Clipper - é a linguagem xBase de maior sucesso. Sua última versão foi o 5.3b
Harbour - é a linguagem que sucedeu o Clipper, um projeto aberto de uma porção de Clippeiros. Pensada para ser 100% retrocompatível com o Clipper e CAtools. Compila em diversos sistemas operacionais, tanto modo texto quanto modo gráfico. Incorporou também o natimorto CA-VO.

hbgi, hbqt, hbui, HwGUI, ooHG, qt5xhb, T-Gtk, WebSocket, wxHarbour, xHGtk são bibliotecas gráficas para Harbour que compilam no modo gráfico (janelas)

HMG - É a biblioteca gráfica mais completa e atualizada, feita especialmente para produzir programas em modo gráfico (janelas).

HMG Lights - IDE da HMG (Harbour MiniGUI), que tem ferramentas de desenvolvimento de formulários (telas), tipo Delphi.

HMG Extended - É a IDE sucessora da HMG Ligths, atualmente a mais utilizada e atualizada das IDEs para Harbour.

Marinas IDE - Outra IDE gráfica baseada no Harbour e QT5.

FIveWIn, Xailer, xHarbour Advantage Database Server, ADVPL, e outras, são implementações comerciais do CA-Clipper e Harbour (o xHarbour é um fork do Harbour que tem também uma versão livre, mas, afora sua versão comercial, não está sendo atualizado).

Atualmente a linguagem Harbour está na versão 3.0 (oficial), mas tem a versão 3.2 (estável), que é a mais atualizada até o momento. Também tem uma versão 3.4, mas as melhorias desta versão foram incorporadas à versão 3.2, que tende a se tornar a versão oficial da linguagem, inclusive a HMG é baseada na versão 3.2.

Para HMG, a IDE oficial é a Harbour Minigui Extended Edition, cuja versão atual é a 20.03, publicada em 31Mar20. Essa IDE recebe regularmente correções e melhorias.

Sugiro, para quem pretende trabalhar com Harbour, que aprenda a trabalhar no modo gráfico com HMG (usando a IDE extended), e também no modo texto, usando a compilação 3.2 do Harbour (no modo console). Sugiro também dar uma olhada no "Designer para formulários MiniGui", do Ivan Marcelino ( https://www.youtube.com/channel/UCoJugNWHx1_sYgtUqp1KaCw ).

Atualmente Harbour é multiparadigma (estruturada, orientada a banco de dados, orientada a objetos, e, de certa forma, funcional, por conta do blocos de códigos, que são uma espécie de "clausuras" típicas das linguagens funcionais). Também trabalha facilmente com SQL (SQLite, MySQL, MariaSQL, PostGREE, e outros).

Outra sugestão é abandonar de vez aplicativos como DOSBox e VDosPlus, isso não tem futuro, pois com pouco trabalho, os programas em Clipper podem ser atualizados para Harbour e podem funcionar muito melhor nos modernos sistemas operacionais, sem precisar desses emuladores.

Sejam bem vindos ao mundo Harbour, o porto seguro do Clipper.

Modificando o Menusys do Harbour (e Clipper 5.3)

Foto de Major Anilto

Em 2003 eu havia feito modificações mo MENUSYS.PRG do Clipper para aceitar a biblioteca LLibG. Junto com essa modificação, modifiquei também alguns comportamentos do mouse.

Atualmente o tratamento do mouse foi incorporado ao Harbour Menusys, dispensando o uso da LLibG. Resgatei meu código do Menusys modificado e fiz umas poucas alterações para compilar com o Harbour. Para que vejam as diferenças, compilei Menuloja.prg com o menusys do Harbour (hbmk2 menuloja), e Menuloja1 com meu menusys modificado (hbmk2 menuloja menusys1). Funcionou de boa. A diferença entre os dois é que no original não há captura do movimento do mouse, sendo necessário clicar nas opções. No modificado, quando o mouse passa por cima da opção ela abre automaticamente submenus. Vou postar os códigos no site, para quem quiser estudar as funções menumodal e menusys.

Para compilar menuloja:

hbmk2 menuloja

Para compilar menuloja1:

hbmk2 menuloja1 menusys1

(Isso compila o menusys modificado e sobrepõe o original)

Downloads: 

menusys.zip — Baixado 18 vezes

Para quem usa Norton Guides

Foto de Major Anilto

Os guias d e Norton Guides ainda são usados por muitos programadores. O programa WEG ( http://www.davep.org/norton-guides/#weg ) é capaz de ler os Norton Guides. O arquivo anexo contém os guias para o Clipper 5.e e CATools, que ainda são úteis no contexto Harbour.

Downloads: 

norton_guides.zip — Baixado 17 vezes

O Jogo do QUINZE - Problemas com HBMK2 (e solução)

Foto de Major Anilto

Às vezes o HBMK2 reclama da falta de alguma biblioteca e dá uma dica, como, por exemplo: (quinze_2.pdf)

Veja a dica:


hbmk2: Dica: Adicionar opção 'hbnf.hbc' faltando nas funções: ft_Rand1()

Neste caso, o comum é adicionar o arquivo faltante em um arquivo de projeto. Por exemplo, o programa abaixo eu compilei
usando 'HBMK2 QUINZE.PRG' e indicou a falta de uma função, sugerindo acrescentar o arquivo 'hbnf.hbc' à compilação.
Para resolver isso criei um arquivo 'quinze.hbp' (aquivo de projeto) com o seguinte conteúdo e compilei com 'hbmk2 quinze.hbp':


hbnf.hbc
quinze.prg

Com isso o HBMK2 encontra as funções faltantes e compila corretamente.

(quinze.pdf)

Programa quinze.prg (é um jogo -sliding puzzle game- onde você tem que colocar as peças na posição correta):


#include "inkey.ch"
#include "box.ch"


procedure Main()
    // console init
    SET SCOREBOARD OFF
    SetMode(30,120) 
    ret := 0

    // main loop
    yn := .T.  
    DO WHILE yn == .T.
        // draw console
        cls
        @ 0, 0 TO MaxRow(), MaxCol() DOUBLE
        SetColor("BG+/B,W/N")
        @ 0, 4 SAY "  Sliding puzzle game  "
        SetColor()

        // input size of grid
        tam := 0           
        @ MaxRow() - 2, 4 SAY "Tamanho do grid: " GET tam PICTURE "9"
        READ 

        // Initialize numbers
        lista := ARRAY (tam * tam)
        FOR z := 1 TO tam * tam
            lista[z] := z
        NEXT
        lista1 := lista
        grid := ARRAY (tam,tam)

        // populate grid with numbers
        FOR i := 1 TO tam 
            FOR j := 1 TO tam 
                grid[i,j] := lista1[ (i-1) * tam + j] 
            NEXT 
        NEXT
        Mostra(@grid)
        InKey(0)

        // initialize the game
        n := 0
        t := 0
        lista := lista1     // lista for scrambling, lista1 preserve numbers in order
        DO WHILE .T.
            // scrambling numbers
            FOR i := 1 TO tam*tam
                n := Int ( ft_Rand1(tam * tam - 1) + 1 )
                t := lista[n]
                lista[n] := lista[i]
                lista[i] := t
            NEXT
            // have solution?
            possp := 0
            invct := 0  // change counter
            FOR i := 1 TO tam * tam -1
                IF lista[i] != tam*tam 
                    FOR j := i + 1 TO tam * tam 
                        IF lista[j] != tam*tam
                            IF lista[i] > lista[j]
                                invct++ 
                            ENDIF 
                        ENDIF
                    NEXT
                ELSE
                    possp := i
                ENDIF
            NEXT
            linv := If( ( (invct % 2) == 0 ), .T., .F.)
            lkin := If( ( (tam - Int( (possp -1) / tam )) % 2) == 0, .T., .F. )
            
            IF ( (tam % 2) != 0)    // if grid size is odd
                IF linv                 // if number of positions changes is even, solvable
                    EXIT
                ELSE 
                    LOOP                // if is odd, not solvable, scramble more
                ENDIF               // if grid size is even
            ELSE                    
                                        // If changes is even and space position is in odd line
                                        // or changes is odd and space position is in even line
                                        // (XOR condition) is solvable 
                IF (linv .AND. !lkin) .OR. (!linv .AND. lkin) // XOR !!! 
                    EXIT
                ElSE                    // else scramble more
                    LOOP    
                ENDIF
            ENDIF

        ENDDO

        // populate the grid with scrambled numbers
        FOR i := 1 TO tam 
            FOR j := 1 TO tam 
                grid[i,j] := lista[ (i-1) * tam + j] 
            NEXT 
        NEXT
        ret := Mostra(@grid)

    // play
        key := 0
        DO WHILE LastKey() != K_ESC
            key := 0 
            // find the space coords
            xe := 0
            ye := 0
            lv := tam*tam
            FOR i := 1 TO tam 
                FOR j := 1 TO tam 
                    IF grid[i,j] == lv 
                        xe :=i
                        ye :=j
                    ENDIF
                NEXT
            NEXT
            // the direction keys
            key := inkey(0)
            DO CASE 
                CASE key == K_UP
                    IF xe > 1
                        grid[xe,ye] := grid[xe-1,ye]
                        grid[xe-1,ye] := lv
                    ENDIF
                    ret := Mostra(@grid)            
                CASE key == K_DOWN
                    IF xe < tam
                        grid[xe,ye] := grid[xe+1,ye]
                        grid[xe+1,ye] := lv
                    ENDIF
                    ret := Mostra(@grid)   
                CASE key == K_LEFT
                    IF ye > 1
                        grid[xe,ye] := grid[xe,ye-1]
                        grid[xe,ye-1] := lv
                    ENDIF
                    ret := Mostra(@grid)   
                CASE key == K_RIGHT
                    IF ye < tam
                        grid[xe,ye] := grid[xe,ye+1]
                        grid[xe,ye+1] := lv
                    ENDIF
                    ret := Mostra(@grid)   
            ENDCASE  
            IF ret == tam*tam-1                             // ret is qtty numbers in position
                @ MaxRow() - 3, 4 SAY "Solucionado!"        // if ret == (size*size) -1
                key := K_ESC                                // all numbers in position
                EXIT                                        // game solved
            ENDIF
        ENDDO
        @ MaxRow() - 2, 4 SAY "Novo jogo??? (yn): " GET yn PICTURE "Y"
        READ 
        cls
        @ MaxRow() - 3, 4 SAY "                  "
    ENDDO
return NIL

FUNCTION Mostra(grid)
    // Show the gris
    fim := 0                                                    // how many numbers in position?
    SetColor("BG+/B,W/N") 
    @ 5,10 , 5 + tam * 2, 9 + tam * 4 BOX B_SINGLE + Space(1)
    i := 0
    FOR y := 1 TO tam
        FOR x := 1 TO tam
            IF grid[x,y] == tam * tam                           // show space
                SetColor(" B/GR+, W/N")
                @ x*2 + 4, i + 11 SAY "  " 
                SetColor("BG+/B,W/N")
            ELSE 
                IF ( (x-1) * tam + y ) == grid[x,y]             // show number in position
                    SetColor("W/G,W/N")
                    @ x*2 + 4, i + 11 SAY grid[x,y] PICTURE "99" 
                    fim++
                ELSE                                            // show number out position
                    SetColor("BG+/B,W/N")
                    @ x*2 + 4, i + 11 SAY grid[x,y] PICTURE "99"
                ENDIF
            ENDIF
        NEXT
        i = i + 4
    NEXT
    SetColor(" W/N, BG+/B")
RETURN fim

Downloads: 

Programa "Jogo do quinze" — Baixado 47 vezes
erro_hbmk2 — Baixado 18 vezes
tela_do_jogo — Baixado 28 vezes

Mouse com Harbour - testes

Foto de Major Anilto

O código abaixo compila no harbour 3.2 com windows 10, porém não assume o mouse do windows:


#include "inkey.ch"


Function Main()

    SET EVENTMASK TO HB_INKEY_ALL

    While LastKey() != K_ESC

        Clear Screen
        DispBox( 0, 1, 2, MaxCol(), Nil, "GR+/N" )
        DispBox( 3, 1, MaxRow(), MaxCol(), Nil, "G+/N" )

        @ 1,3  PROMPT "Finalizar"
        @ 1,16 PROMPT "Ag.financeira"
        @ 1,32 PROMPT "Contas bancárias"
        @ 1,52 PROMPT "Telefones"
        @ 1,66 PROMPT "Compromissos"

        MENU TO OPC

        If MRow() != 1
            Loop
        ElseIf LastKey() != K_ESC
            Alert( "Você clicou na opção: " + Hb_NToS( opc ) )
            InKey(5)
        EndIf

    EndDo

Return Nil

Agora, acrescentando um REQUEST HB_GT_WVT_DEFAULT, aceita o mouse no windows 10:


#include "inkey.ch"
REQUEST HB_GT_WVT_DEFAULT

Function Main()

SET EVENTMASK TO HB_INKEY_ALL

While LastKey() != K_ESC

Clear Screen
DispBox( 0, 1, 2, MaxCol(), Nil, "GR+/N" )
DispBox( 0, 1, 2, MaxCol(), Nil, "GR+/N" )


        @ 1,3  PROMPT "Finalizar"
        @ 1,16 PROMPT "Ag.financeira"
        @ 1,32 PROMPT "Contas bancárias"
        @ 1,52 PROMPT "Telefones"
        @ 1,66 PROMPT "Compromissos"

        MENU TO OPC

        If MRow() != 1
            Loop
        ElseIf LastKey() != K_ESC
            Alert( "Você clicou na opção: " + Hb_NToS( opc ) )
            InKey(5)
        EndIf

    EndDo

Return Nil

E por fim, acrescentando as opções de HBInfo dá para ajustar as acentuações e localização:


#include "inkey.ch"
/* HBGTInfo para maior controle do console */
#include "hbgtinfo.ch"
/* Mudando o padrão WIN (console antigo) para WVT (console após o Windows Vista - acho) */
REQUEST HB_GT_WVT_DEFAULT
/* Os REQUEST abaixo servem para carregar os detalhes da lingagem e página de códigos */
REQUEST HB_LANG_PT
REQUEST HB_CODEPAGE_UTF8

Function Main()

    /* Chamando a linguagem previamente requisitada e a página de códigos */
    HB_LANGSELECT('PT')
    HB_CDPSELECT('UTF8')
    /* Opções de HBGTInfo */
    HB_GtInfo( HB_GTI_MAXIMIZED, .F. )
    HB_GtInfo( HB_GTI_FONTNAME, "Lucida Console" )
    HB_GtInfo( HB_GTI_WINTITLE, "Teste para Mouse" )
    /* Fim de opções de HBGTInfo */
    
    SET EVENTMASK TO HB_INKEY_ALL

    While LastKey() != K_ESC

        Clear Screen
        DispBox( 0, 1, 2, MaxCol(), Nil, "GR+/N" )
        DispBox( 3, 1, MaxRow(), MaxCol(), Nil, "G+/N" )

        @ 1,3  PROMPT "Finalizar"
        @ 1,16 PROMPT "Ag.financeira"
        @ 1,32 PROMPT "Contas bancárias"
        @ 1,52 PROMPT "Telefones"
        @ 1,66 PROMPT "Compromissos"

        MENU TO OPC

        If MRow() != 1
            Loop
        ElseIf LastKey() != K_ESC
            Alert( "Você clicou na opção: " + Hb_NToS( opc ) )
            InKey(5)
        EndIf

    EndDo

Return Nil

O Harbour funciona em pelo menos três contextos HB_GT: 
1. HB_GT_WIN, que trabalha com os padrões do console (CMD) tipo DOS e Windows até XP);
2. HB_GT_WVT, que trabalha com os consoles (CMD) dos WIndows modernos;
3. HB_GT_GUI, para interfaces gráficas tipo janelas.
Por padrão, se não usar REQUEST HB_GT_xxx, o compilador carrega o contexto HB_GT_WIN, por isso há problemas com mouse nos Windows modernos.

Compilando com IDEs HMG, provavelmente a IDE assuma automaticamente o contexto HB_GT_WVT no modo console, e HB_GT_GUI para modo janelas.

Pacote para iniciar com Harbour 3.2

Foto de Major Anilto

O Harbour é um compilador para a linguagem xBase, geralmente chamada de Clipper (a linguagem implementada pelo compilador CA-Clipper),fazendo-a funcionar nos modernos ambientes operacionais. O site oficial é . O objetivo desta postagem é oferecer um pacote contendo a versão 3.2 da linguagem, bem como detalhes para uma instalação simples.

O pacote disponibilizado em < https://1drv.ms/u/s!AqVDFbVSDZM-iOoeJl8UAUSYzLyInQ?e=FPbNh2(link is external) > (OneDrive), e também aqui, contém a instalação pronta do compilador Harbour 3.2, bem como o compilador MinGW necessário para a construção de arquivos executáveis. No pacote também foi incluido o arquivo 'harbour.xml', que serve para "colorizar" os aquivos .prg editados no Notepad++.

Para instalar o arquivo 'harbour.xml' no Notepad++, basta acessar 'Configurações - importar -importar temas' e acessar o arquivo no local em que foi descompactado (provavelmente em C:\hb32, se você seguir o padrão).

Depois de baixar, descompacte em 'C:\', que o descompactador criará automaticamente o diretório 'C:\HB32' e seus subdiretórios, que são basicamente a instalação padrao do Harbour. Copie o arquivo 'hb32.bat' para o diretório raiz (c:\).

Para testar se tudo funciona corretamente, abra o Notepad++ (ou o editor de sua preferência) e crie um pequeno programa na pasta 'C:\hb32\testes'. Recomendo usar o programa abaixo para o primeiro teste:

// Programa "Hello, World" para o Harbour (salve como hello.prg)
Function Main
SetMode(50,180)
CLS
? "Hello, World
? "Hello, World"
? "Hello, World Cruel!"
InKey(5)
Return

Feito isso, chegou a hora de testar se a instalação realmente está funcionando. Primeiro abra o prompt de comando do windows (CMD). No console que abrir, digite 'hb32'. Isso deverá setar um path para o Harbour e o Mingw, e em seguida, irá para a pasta 'c:\hb32' (se quiser fazer a instalação em outra pasta, modifique o arquivo hb32.bat de acordo com sua instalação) e executará o utilitário 'hbmk2' para teste. Se não funcionar, verifique sua instalação. Navegue até a pasta 'testes', onde estará gravado o arquivo 'hello.prg' e compile digitando:

	hbmk2 hello

Isso deverá criar o 'hello.exe', que poderá ser executado em seguida. O programa imprime os textos entre aspas, e espera 5 segundos para voltar ao prompt de comando. Se tudo ocorreu como planejado, você terá uma instalação funcional do Harbour, pronta para compilar seus programas .prg, em modo console. Se quiser trabalhar com interface gráfica, pesquise na internet o fórum HMG (Harbour MiniGUI), que é a ferramenta ideal (mas não a única) para programar aplicativo gráficos para Windows e outros SO.

Lembrando que essa instalação é para trabalhar com Windows. Para outros SO é necessário seguir as recomendaçoes do site oficial do Harbour.

Resumindo a instalação:

1. Baixe o pacote HB32.rar e descompacte na raiz de seu HD (c:\)
2. Abra o editor de texto (recomendo Notepad++) e digite o programa hello.prg na pasta c:\hb32\testes\
3. Abra o CMD do Windows e digite 'hb32'
4. Navegue até a pasta c:\hb32\testes
5. Digite 'hbmk2 hello'
6. Execute o 'hello.exe'

Fim da instalação. Minhas próximas postagens utilizarão preferencialmente esta estrutura de instalação para os exemplos de programas.

Downloads: 

Páginas

Subscrever RSS - Blog de Major Anilto