Clipper On Line • Ver Tópico - Estou começando agora. Preciso de ajuda técnica/intelectual

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

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

Moderador: Moderadores

 

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

Mensagempor JoãoBC » 22 Jun 2020 19:10

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:\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
JoãoBC
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 14
Data de registro: 01 Jun 2020 16:47
Cidade/Estado: Rio de Janeiro, RJ
Curtiu: 5 vezes
Mens.Curtidas: 0 vez

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

Mensagempor Vlademiro » 22 Jun 2020 19:48

As libs do Clipper não funcionam no Harbour. A compatibilidade é a nível de fonte (prg).
Avatar de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

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

Mensagempor Vlademiro » 22 Jun 2020 19:53

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 de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

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

Mensagempor Vlademiro » 22 Jun 2020 19:58

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 de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

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

Mensagempor Vlademiro » 23 Jun 2020 04:41

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


#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 57 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) Visualizado 1335 vezes
Avatar de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

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

Mensagempor Vlademiro » 23 Jun 2020 05:51

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.


#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

Avatar de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

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

Mensagempor JoãoBC » 24 Jun 2020 23:28

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():
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:\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
-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.
JoãoBC
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 14
Data de registro: 01 Jun 2020 16:47
Cidade/Estado: Rio de Janeiro, RJ
Curtiu: 5 vezes
Mens.Curtidas: 0 vez

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

Mensagempor alxsts » 25 Jun 2020 01:16

[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2945
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

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

Mensagempor JoséQuintas » 25 Jun 2020 11:08

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18150
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

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

Mensagempor JoséQuintas » 25 Jun 2020 11:11

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18150
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

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

Mensagempor Vlademiro » 25 Jun 2020 19:19

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)


#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.
Avatar de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes




Retornar para Harbour

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 4 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro