Estou começando agora. Preciso de ajuda técnica/intelectual

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

JoãoBC
Usuário Nível 1
Usuário Nível 1
Mensagens: 18
Registrado em: 01 Jun 2020 16:47
Localização: Rio de Janeiro, RJ

Estou começando agora. Preciso de ajuda técnica/intelectual

Mensagem por JoãoBC »

Oi, gente, tudo bem ?
Estou começando agora na área de harbour.
Programei em clipper até 1993 e nunca mais escrvi uma só linha, estou enferrujado.
Conheci o harbour por este fórum, segui tudo da postagem "Migrar Clipper para Harbour" mas não obtive sucesso,
estou com alguma dificuldade, creio que conceitual.
Baixei um programa de exemplo, http://www.vagucs.com.br/dwclipper/gsutil03.zip
Ao descompactá-lo, além do .prg aparece um arquivo de biblioteca .lib
Tento compilar, usando as dicas da postagem, mas diz que há erro no arquivo .lib
Outros exemplos baixados, possuem arquivos .h e .hc
Como proceder ?

Erro mostrado:

Código: Selecionar todos

C:\hb32\bin>hbmk2 c:\temp5\Teste.HBP
hbmk2: Processando opções do ambiente: -comp=mingw
C:/hb32/comp/mingw/bin/../lib/gcc/i686-w64-mingw32/7.3.0/../../../../i686-w64-mingw32/bin/ld.exe: cannot find -lgsutil03
collect2.exe: error: ld returned 1 exit status
hbmk2[Teste]: Erro: Executando linkeditor. 1
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Estou começando agora. Preciso de ajuda técnica/intelectual

Mensagem por Vlademiro »

As libs do Clipper não funcionam no Harbour. A compatibilidade é a nível de fonte (prg).
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Estou começando agora. Preciso de ajuda técnica/intelectual

Mensagem por Vlademiro »

Arquivos .h são cabeçalhos da linguagem C. Não fazem parte do dia a dia do programador Harbour mediano. Porque vc não recomeça com exemplos somente em Clipper puro? Aí vc compila o fonte no Harbour para ir se adaptando.
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Estou começando agora. Preciso de ajuda técnica/intelectual

Mensagem por Vlademiro »

Acabei de ver o arquivo q vc citou. É um menu. Mas não vai funcionar porque, como já disse, a lib é para Clipper. Eu não sei q menu é esse, mas eu tenho um menu em Harbour. Vou procurar aqui e posto pra vc estudar.
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Estou começando agora. Preciso de ajuda técnica/intelectual

Mensagem por Vlademiro »

Segue um exemplo 100% Harbour de um menu. No final tem os anexos para download.

Esse exemplo tem algumas coisas que o programador Clipper desconhece, mas dá pra ir usando ele porque é só mudar os valores a partir da linha 16. Te aconselho a ir testando exemplos simples para ir se acostumando.

Para compilar faça hbmk2 menu

Código: Selecionar todos


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

PROCEDURE  Main

    LOCAL oMainMenu  
    LOCAL bMenuBlock := {||NIL}  //{| o | MenuSelect( o ) }
    LOCAL cMenuColor := "N/BG,W+/R,GR+/BG,GR+/R,N+/BG,N/BG"
    LOCAL hElement, hMenu
    LOCAL aItem, oItem, oSubMenu
    LOCAL nOpc

    CLS
    
    hMenu := { => }
    hMenu[ "Main" ] := { ;
       { " &Teste For...Next ", K_ALT_T, "Teste For Next", 11 }, ;
       { " &Save ", K_ALT_S, "Save routine", 12 }, ;
       { MENU_SEPARATOR,           ,                 , 13 }, ;
       { " E&xit ", K_ALT_X, "Exit program", 14 }  ;
       } 

    hMenu[ "Report" ] := { ;
       { " &Main Report ", K_ALT_M, "Report main", 21 }, ;
       { " Account details ", , "Details for account main", 24 }  ;
       } 


    oMainMenu  := HBTopBarMenu():new( 0, 0, MaxCol() )
    oMainMenu:colorSpec := cMenuColor


    FOR EACH hElement IN hMenu
        oSubMenu  := Popup():new()
        oSubMenu:colorSpec := oMainMenu:colorSpec
        FOR EACH aItem IN hElement
            oItem := MenuItem():new( aItem[ 1 ], ;
               bMenuBlock, ;
               aItem[ 2 ], ;
               aItem[ 3 ], ;
               aitem[ 4 ]  )
            oSubMenu:addItem ( oItem )

        NEXT
        oItem := MenuItem():new( hElement:__enumKEY , oSubMenu )
        oMainMenu:AddItem( oItem )
    NEXT

    nOpc := 1
    DO WHILE .T.
        nOpc := MenuModal( oMainMenu, INT( nOpc / 10 ), ;
           MaxRow(), 0, MaxCol(), ;
           oMainMenu:colorSpec )
        ? nOpc
        DO CASE
        CASE nOpc == -1 
        	ExitRoutine()
        CASE nOpc == 14 
        	ExitRoutine()
        	
        OTHERWISE

        ENDCASE
    ENDDO

    RETURN 

PROCEDURE ExitRoutine

    //IF Alert( "Exit program?", { "Yes", "No" } ) == 1
        QUIT
    //ENDIF

    RETURN


menu.prg
(1.76 KiB) Baixado 234 vezes
Se estiver no windows, retire o buffer do terminal, conforme a figura menu.png (anexo). O Harbour não é limitado as coordenadas 25x80, e vai usar toda a área disponível nas propriedades do cmd/termiinal do windows. Você pode colocar outros valores lá para testar.
menu.png
menu.png (9.11 KiB) Exibido 2060 vezes
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Estou começando agora. Preciso de ajuda técnica/intelectual

Mensagem por Vlademiro »

Achei outro que expande o exemplo anterior. Nem sabia que tinha ele aqui. Mas só o exemplo anterior deve bastar se o que vc quer é um menu simples. É melhor usar um exemplo simples que pode ser entendido posteriormente do que um exemplo mais complexo e não poder/saber modificar ele depois.

Código: Selecionar todos


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

PROCEDURE Main
   LOCAL oTopBar := CreateMainMenu()

   CLS

   DO WHILE .T.
      MenuModal( oTopBar , 1, ;
                 MaxRow(), 0, MaxCol(), ;
                 oTopBar:colorSpec )
   ENDDO
RETURN

FUNCTION CreateMainMenu()
   LOCAL oMainMenu  := HBTopBarMenu():new( 0, 0, MaxCol() )
   LOCAL bMenuBlock := {|o| MenuSelect(o) }
   LOCAL cMenuColor := "N/BG,W+/R,GR+/BG,GR+/R,N+/BG,N/BG"
   LOCAL aItems

   oMainMenu:colorSpec := cMenuColor
   aItems := { ;
      { " &Teste For...Next "     , K_ALT_T   , "Teste For Next"  , 11 }, ;
      { " &Save "     , K_ALT_S   , "Save routine"  , 12 }, ;
      { MENU_SEPARATOR,           ,                 , 13 }, ;
      { " E&xit "     , K_ALT_X   , "Exit program"  , 14 }  ;
   }

   CreateSubMenu( oMainMenu, " &File ", bMenuBlock, aItems )

   aItems := { ;
      { " Cop&y   "   , K_CTRL_INS, "Copy routine"  , 21 }, ;
      { " &Paste  "   , K_ALT_P  , "Paste routine" , 22 }, ;
      { MENU_SEPARATOR,           ,                 , 23 }, ;
      { " C&ut    "   , K_ALT_U  , "Cut routine"   , 24 }, ;
      { " &Delete "   , K_DEL     , "Delete routine", 25 }  ;
   }

   CreateSubMenu( oMainMenu, " &Edit ", bMenuBlock, aItems )

   aItems := { ;
      { " &Info   "   , K_F1      , "Help routine"  , 31 }, ;
      { " &About  "   ,           , "About program" , 32 }  ;
   }

   CreateSubMenu( oMainMenu, " &Help ", bMenuBlock, aItems )

RETURN oMainMenu

FUNCTION CreateSubMenu( oMenu, cMenuItem, bBlock, aItems )
   LOCAL aItem, oItem, oSubMenu

   oSubMenu           := PopUp():new()
   oSubMenu:colorSpec := oMenu:colorSpec

   FOR EACH aItem IN aItems
      oItem := MenuItem():new( aItem[1], ;
                               bBlock  , ;
                               aItem[2], ;
                               aItem[3], ;
                               aitem[4]  )
      oSubMenu:addItem ( oItem )
   NEXT

   oItem := MenuItem():new( cMenuItem, oSubMenu )
   oMenu:addItem( oItem )
RETURN

PROCEDURE MenuSelect( oMenuItem )
   @ 1, 0 CLEAR TO MaxRow(), MaxCol()

   DO CASE
      CASE oMenuItem:ID=11
         TesteForNext()
      CASE oMenuItem:ID=14
         ExitRoutine()
   OTHERWISE
      Alert( oMenuItem:message )
   ENDCASE
RETURN

PROCEDURE ExitRoutine
   IF Alert( "Exit program?", { "Yes", "No" } ) == 1
      QUIT
   ENDIF
RETURN

PROCEDURE TesteForNext()
   LOCAL nContFor:=0
   For x=1 To 10
      nContFor+=1
   Next

   For x=1 To 10
      nContFor+=1
   Next

   For x=1 To 10
      nContFor+=1
   Next

   For x=1 To 10
      nContFor+=1
   Next

   For x=1 To 10
      nContFor+=1
   Next

   For x=1 To 10
      nContFor+=1
   Next

   For x=1 To 10
      nContFor+=1
   Next

   For x=1 To 10
      nContFor+=1
   Next

   For x=1 To 10
      nContFor+=1
   Next

   For x=1 To 10
      nContFor+=1
   Next

   For x=1 To 10
      nContFor+=1
   Next

   For x=1 To 10
      nContFor+=1
   Next

   For x=1 To 10
      nContFor+=1
   Next

   For x=1 To 10
      nContFor+=1
   Next

   For x=1 To 10
      nContFor+=1
   Next

   For x=1 To 10
      nContFor+=1
   Next

   For x=1 To 10
      nContFor+=1
   Next

   For x=1 To 10
      nContFor+=1
   Next

   For x=1 To 10
      nContFor+=1
   Next

   For x=1 To 10
      nContFor+=1
   Next

   Alert("Contador For Next: "+str(nContFor,4,0))

RETURN

JoãoBC
Usuário Nível 1
Usuário Nível 1
Mensagens: 18
Registrado em: 01 Jun 2020 16:47
Localização: Rio de Janeiro, RJ

Estou começando agora. Preciso de ajuda técnica/intelectual

Mensagem por JoãoBC »

Pessoal, se alguém souber, publiquem aqui o link para uma apostila, arquivo PDF de comandos e funções do Harbour.
Fiz um programa extremamente simples, para aprender sobre a função inkey():

Código: Selecionar todos

Function main()
Set talk off 
Clear
Value = 10
Tecla = 0
@ 0,0 to 40,79 double
@ 10,10 say "valor"
@ 10,16 get value pict "##.##" range 11.0 , 44.0
Read

&& Como fazer para que o programa só prossiga se pressionarmos 
&& uma letra que seja C (ou c), J (ou j) ou um número entre 0 e 9 ??

Letra = .F.               && Começa com False
DO While .NOT. Letra
  Tecla = inkey()
  IF ((Tecla >= 48  .AND. Tecla =< 57) .OR. Tecla  = 99  .OR.  Tecla =  67  .OR.  Tecla  = 106 .OR.  Tecla =  74)
    Letra = .T.
  Else 
   loop
  EndIF  
enddo
? Tecla
wait
return nil
Deu erro de compilação.
Retirei a primeira linha, e troquei a última por return.
Funcionou perfeitamente no dBase IV e no Visual fox pro 9

No harbour, fui para a pasta principal, digitando:
CD\HB32\BIN
compilei digitando
HBMK2 \temp5\teste.HBP
(os arquivos teste.HBP e inkey.PRG estão na pasta temp5
O erro foi este:

Código: Selecionar todos

C:\hb32\bin>hbmk2 \temp5\teste.hbp
hbmk2: Processando opções do ambiente: -comp=mingw
Harbour 3.2.0dev (r2004201301)
Copyright (c) 1999-2020, https://harbour.github.io/
Compiling '\temp5\inkey.prg'...
\temp5\inkey.prg(17) Error E0030  Syntax error "syntax error at '<'"
\temp5\inkey.prg(19) Error E0014  ELSE does not match IF
\temp5\inkey.prg(21) Error E0010  ENDIF does not match IF
\temp5\inkey.prg(22) Error E0011  ENDDO does not match WHILE
4 errors

No code generated.
hbmk2[teste]: Error: Running Harbour compiler (built-in). 1

C:\hb32\bin>
E o arquivo teste.hbp

Código: Selecionar todos

-oinkey
-prgflag=-b
-inc
-compr=yes
-quiet
-lxhb
-lhbwin
-lhbct
-gui
-m
-w0
-es0
inkey.prg
por último, editei o arquivo .prg, trocando
=<
por
<=
e funcionou. Ou seja, há mais detalhes que preciso aprender.

Também tentei estudar o exemplo do arquivo de menu, mas fiquei enrolado, talvez por ter procedures que não
descobri se são comandos já embutidos na linguagem, já embutidos nos arquivos .H e .CH ou criados pelo programa.
Não sabendo o que eles fazem, me enrolei.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Estou começando agora. Preciso de ajuda técnica/intelectual

Mensagem por alxsts »

[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Estou começando agora. Preciso de ajuda técnica/intelectual

Mensagem por JoséQuintas »

Vlademiro escreveu:Se estiver no windows, retire o buffer do terminal, conforme a figura menu.png (anexo). O Harbour não é limitado as coordenadas 25x80, e vai usar toda a área disponível nas propriedades do cmd/termiinal do windows. Você pode colocar outros valores lá para testar.
Dica errada.
Não se deve fazer o aplicativo preso a configurações do Windows.
Coloque no fonte exatamente o que vai querer usar.
Faça testes, pra ver qual acha mais apropriada.

Se for versão antiga do Windows, que tenha console baseado em DOS, pode ter limitação em usar 25 x 80, 28 x 80, 43 x 80, 50 x 80.
Se for Windows mais atual, pode usar a quantidade que quiser.

No código fonte é indicar o tamanho:

SetMode( 25, 80 )

Aqui ainda tem outra questão: o tamanho da letra
Se usar programa console, novamente vai estar preso à configuração do console.

O mais prático é indicar -gui na compilação, assim fica tudo automático, e não depende de configuração de console.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Estou começando agora. Preciso de ajuda técnica/intelectual

Mensagem por JoséQuintas »

Sobre o erro de compilação:

pra comparação pode usar <= ou >=, mas não pode usar =< ou =>, porque podem ter até outro significado diferente de comparação.
Parece até estranho ter funcionado em outra linguagem de programação, mas talvez alguma linguagem aceite.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Estou começando agora. Preciso de ajuda técnica/intelectual

Mensagem por Vlademiro »

JoséQuintas escreveu: Dica errada.
Não se deve fazer o aplicativo preso a configurações do Windows.
Coloque no fonte exatamente o que vai querer usar.
Obrigado pela correção.

Segue o mesmo fonte comentado e com o SetMode (Essa função é do tempo do Clipper, tinha me esquecido dela)

Código: Selecionar todos


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

PROCEDURE  Main

    LOCAL oMainMenu  
    LOCAL bMenuBlock := {||NIL}  //{| o | MenuSelect( o ) }
    LOCAL cMenuColor := "N/BG,W+/R,GR+/BG,GR+/R,N+/BG,N/BG"
    LOCAL hElement, hMenu
    LOCAL aItem, oItem, oSubMenu
    LOCAL nOpc

	CLS // Limpa a tela 
    SetMode( 25, 80 ) // Tamanho da sua janela. Altere se desejar. Por exemplo: SetMode( 50, 150 )
    
    /*
    Das linhas 21 até a linha 32 você deve alterar para 
    personalizar as opções do menu.
    */
    hMenu := { => } 
    hMenu[ "Main" ] := { ;
       { " &Teste For...Next ", K_ALT_T, "Teste For Next", 11 }, ;
       { " &Save ", K_ALT_S, "Save routine", 12 }, ;
       { MENU_SEPARATOR,           ,                 , 13 }, ;
       { " E&xit ", K_ALT_X, "Exit program", 14 }  ;
       } 

    hMenu[ "Report" ] := { ;
       { " &Main Report ", K_ALT_M, "Report main", 21 }, ;
       { " Account details ", , "Details for account main", 24 }  ;
       } 


	// Aqui o menu é montado (Linhas 38 até 56)
	// Não se preocupe em entender essas linhas, por enquanto
	// Você pode estudar isso depois. 
    oMainMenu  := HBTopBarMenu():new( 0, 0, MaxCol() )
    oMainMenu:colorSpec := cMenuColor


    FOR EACH hElement IN hMenu
        oSubMenu  := Popup():new()
        oSubMenu:colorSpec := oMainMenu:colorSpec
        FOR EACH aItem IN hElement
            oItem := MenuItem():new( aItem[ 1 ], ;
               bMenuBlock, ;
               aItem[ 2 ], ;
               aItem[ 3 ], ;
               aitem[ 4 ]  )
            oSubMenu:addItem ( oItem )

        NEXT
        oItem := MenuItem():new( hElement:__enumKEY , oSubMenu )
        oMainMenu:AddItem( oItem )
    NEXT

	// Aqui é o laço do menu  
    nOpc := 1
    DO WHILE .T.
        nOpc := MenuModal( oMainMenu, INT( nOpc / 10 ), ;
           MaxRow(), 0, MaxCol(), ;
           oMainMenu:colorSpec )
        /*   
         Aqui você deve alterar para pegar o retorno
         e chamar as suas rotinas (linhas 73 até 83)
         Note que o valor de retorno foi definido na criação
         das opções do menu 
         Por exemplo, na linha 30 temos :
         { " &Main Report ", K_ALT_M, "Report main", 21 }
         O valor 21, por exemplo, será analisado a seguir (linha 79)
        */   
        ? nOpc 
        DO CASE
        CASE nOpc == -1 
        	ExitRoutine()
        CASE nOpc == 14 
        	ExitRoutine()
        CASE nOpc == 21 
        	Alert("Substitua pela sua rotina") // Sua rotina aqui 
        OTHERWISE

        ENDCASE
    ENDDO

    RETURN 

PROCEDURE ExitRoutine

    IF Alert( "Exit program?", { "Yes", "No" } ) == 1
        QUIT
    ENDIF

    RETURN

JoãoBC escreveu: No harbour, fui para a pasta principal, digitando:
CD\HB32\BIN
Não faça assim. Coloque o C:\HB32\bin no PATH e execute hbmk2 de dentro da pasta onde seus fontes estão.
JoãoBC escreveu: Também tentei estudar o exemplo do arquivo de menu, mas fiquei enrolado, talvez por ter procedures que não
descobri se são comandos já embutidos na linguagem, já embutidos nos arquivos .H e .CH ou criados pelo programa.
Não sabendo o que eles fazem, me enrolei.
Para quem está vindo agora do Clipper tem algumas coisas novas, mas procure entender o contexto e testar o seu fonte. Altere pequenas porções dele e compile para ver o que mudou.
Se tiver alguma dúvida tente isolar o problema em um pequeno exemplo e manda aqui pra gente. Na maioria dos casos, quando você estiver isolando o problema e criando o pequeno exemplo você vai ver onde está o erro.
Responder