Clipper On Line • Ver Tópico - Práticas que facilitam programar Clipper/Harbour

Práticas que facilitam programar Clipper/Harbour

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

Moderador: Moderadores

 

Práticas que facilitam programar Clipper/Harbour

Mensagempor JoséQuintas » 08 Out 2016 14:12

A mudança de hoje, um bom exemplo.
Reparem como ajuda:
- #define
- formatação do fonte
- FOR-EACH
- Reescrever um pouco
Como exemplo, tente alterar uma alíquota de cálculo do imposto, em cada um dos fontes, ou tente entender o que grava no replace.
Mas preste atenção no motivo que faz ficar mais simples alterar.
E depois repare que o primeiro, é um bloco de fonte, enquanto o segundo é um fonte independente, o que facilita mais ainda.

      DO CASE
      CASE nOpcao = 1

         AbreArquivos( "locad00" )
         AbreArquivos( "leao" )
         TELE01 = 0
         SELECT locad00
         UF00   = 1.0641
         UF01   = 1.0641
         AL00   = 7.50
         AL01   = 15.00
         ALL00   = 22.50
         ALL01   = 27.50
         PA00   = 117.49
         PA01   = 293.58
         PPA00   = 528.37
         PPA01   = 723.95
         PARA00 = 1566.61
         PARA01 = 2347.85
         PARA02 = 2347.86
         PARA03 = 3130.51
         PARA04 = 3130.52
         PARA05 = 3911.63
         PARA06 = 3911.64
         PARA07 = 35000.00
         @ 04, 00, 21, 79 BOX Space( 9 )
         @ 04, 24 SAY "+-------------------------------+"
         @ 05, 24 SAY "| UFIR ANTERIOR  >              |"
         @ 06, 24 SAY "+-------------------------------+"
         @ 07, 24 SAY "| UFIR    ATUAL  >              |"
         @ 08, 24 SAY "+-------------------------------+"
         @ 10, 05 SAY "+----+------------+---+------------++----------++----------------------+"
         @ 11, 05 SAY "| DE |            | A |            ||ALIQ      || DEDUZIR              |"
         @ 12, 05 SAY "+----+------------+---+------------++----------++----------------------+"
         @ 13, 05 SAY "+----+------------+---+------------++----------++----------------------+"
         @ 14, 05 SAY "| DE |            | A |            ||ALIQ      || DEDUZIR              |"
         @ 15, 05 SAY "+----+------------+---+------------++----------++----------------------+"
         @ 16, 05 SAY "+----+------------+---+------------++----------++----------------------+"
         @ 17, 05 SAY "| DE |            | A |            ||ALIQ      || DEDUZIR              |"
         @ 18, 05 SAY "+----+------------+---+------------++----------++----------------------+"
         @ 19, 05 SAY "+----+------------+---+------------++----------++----------------------+"
         @ 20, 05 SAY "| DE |            | A |            ||ALIQ      || DEDUZIR              |"
         @ 21, 05 SAY "+----+------------+---+------------++----------++----------------------+"
         @ 05, 43 GET UF00    PICTURE "######.####"
         @ 07, 43 GET UF01    PICTURE "######.####"
         @ 11, 11 GET PARA00  PICTURE "999999999.99"
         @ 11, 28 GET PARA01  PICTURE "999999999.99"
         @ 11, 47 GET AL00    PICTURE "##.##"
         @ 11, 63 GET PA00    PICTURE "999999999.99"
         @ 14, 11 GET PARA02  PICTURE "999999999.99"
         @ 14, 28 GET PARA03  PICTURE "999999999.99"
         @ 14, 47 GET AL01    PICTURE "##.##"
         @ 14, 63 GET PA01    PICTURE "999999999.99"
         @ 17, 11 GET PARA04  PICTURE "999999999.99"
         @ 17, 28 GET PARA05  PICTURE "999999999.99"
         @ 17, 47 GET ALL00   PICTURE "##.##"
         @ 17, 63 GET PPA00   PICTURE "999999999.99"
         @ 20, 11 GET PARA06  PICTURE "999999999.99"
         @ 20, 28 GET PARA07  PICTURE "999999999.99"
         @ 20, 47 GET ALL01   PICTURE "##.##"
         @ 20, 63 GET PPA01   PICTURE "999999999.99"
         READ
         DO WHILE TELE01 < 9999
            @ 04, 00, 21, 79 BOX Space( 9 )
            TELE01 = 9999
            Mensagem( "Qual o código do locador:" )
            @ Row(), Col() + 2 GET TELE01 PICTURE "9999"
            READ
            Mensagem()
            IF TELE01 >= 9999
               EXIT
            ENDIF
            SEEK TELE01
            IF Eof()
               MsgStop( "Locador não cadastrado" )
               LOOP
            ENDIF
            NOME00 = locad00->NOME
            CIC00  = locad00->CIC
            ENDE00 = locad00->ENDERECO
            CIDA00 = locad00->CIDADE
            CEP00  = locad00->CEP
            UF10   = locad00->UF
            VALO00 = 0
            VALI   = 0
            VAIR   = 0
            PE00   = 0
            PAR0   = 0
            RESU00 = 0
            RESU01 = 0
            DO WHILE VALO00 = 0
               Mensagem( "Locador " + StrZero( TELE01, 4 ) + ". Qual valor base:" )
               @ Row(), Col() + 2 GET VALO00 PICTURE "999999.99"
               READ
               Mensagem()
            ENDDO
            IF VALO00 > PARA00 .AND. VALO00 <= PARA01
               PE00 = AL00
               PAR0 = PA00
               RESU01 = VALO00 * PE00 / 100
               RESU00 = RESU01 - PAR0
               RESU01 = RESU00
            ELSEIF VALO00 > PARA02 .AND. VALO00 <= PARA03
               PE00 = AL01
               PAR0 = PA01
               RESU01 = VALO00 * PE00 / 100
               RESU00 = RESU01 - PAR0
               RESU01 = RESU00
            ELSEIF VALO00 > PARA04 .AND. VALO00 <= PARA05
               PE00 = ALL00
               PAR0 = PPA00
               RESU01 = VALO00 * PE00 / 100
               RESU00 = RESU01 - PAR0
               RESU01 = RESU00
            ELSEIF VALO00 > PARA06 .AND. VALO00 <= PARA07
               PE00 = ALL01
               PAR0 = PPA01
               RESU01 = VALO00 * PE00 / 100
               RESU00 = RESU01 - PAR0
               RESU01 = RESU00
            ENDIF
            RESU00 = RESU00 / UF00 * UF01
            SELECT leao
            SEEK TELE01
            IF Found()
               Reclock( 0 )
               REPLACE leao->COD WITH TELE01, leao->NOME WITH NOME00, leao->CIC WITH CIC00, leao->ENDERECO WITH ENDE00, ;
                  leao->CIDADE WITH CIDA00, leao->CEP WITH CEP00, leao->UF WITH UF10, leao->VALOR WITH VALO00
               REPLACE leao->VALIMP WITH RESU00, leao->AIR WITH RESU00 * 5 / 100, leao->PERC WITH PE00, leao->RESU WITH RESU01, ;
                  leao->ORIGINAL WITH RESU01
            ELSE
               RecAppend()
               REPLACE leao->COD WITH TELE01, leao->NOME WITH NOME00, leao->CIC WITH CIC00, leao->ENDERECO WITH ENDE00, ;
                  leao->CIDADE WITH CIDA00, leao->CEP WITH CEP00, leao->UF WITH UF10, leao->VALOR WITH VALO00
               REPLACE leao->VALIMP WITH RESU00, leao->AIR WITH RESU00 * 5 / 100, leao->PERC WITH PE00, leao->RESU WITH RESU01, ;
                  leao->ORIGINAL WITH RESU01
            ENDIF
            RecUnlock()
            SELECT locad00
         ENDDO
         CLOSE DATABASES


#define TABELA_DE       1
#define TABELA_ATE      2
#define TABELA_ALIQUOTA 3
#define TABELA_DEDUCAO  4

STATIC PROCEDURE PLOCLEAO2Digita

   LOCAL nLocador, nUfirAnterior := 1.0641, nUfirAtual := 1.0641
   LOCAL nValor, UF10, CEP00, NOME00, CIC00, ENDE00, CIDA00, GetList := {}
   LOCAL aTabela, nImposto, nImpostoUfir, nPercentual, oElement

   aTabela  :=  { ;
      { 1566.61,  2347.85,  7.5, 117.49 }, ;
      { 2347.86,  3130.51, 15.0, 293.58 }, ;
      { 3130.52,  3911.63, 22.5, 528.37 }, ;
      { 3911.64, 35000.00, 27.5, 723.95 } }

   IF ! AbreArquivos( "locad00", "leao" )
      RETURN
   ENDIF
   SELECT locad00
   Cls()
   @ 04, 24 SAY "+-------------------------------+"
   @ 05, 24 SAY "| UFIR ANTERIOR  >              |"
   @ 06, 24 SAY "+-------------------------------+"
   @ 07, 24 SAY "| UFIR    ATUAL  >              |"
   @ 08, 24 SAY "+-------------------------------+"
   @ 10, 05 SAY "+----+------------+---+------------++----------++----------------------+"
   @ 11, 05 SAY "| DE |            | A |            ||ALIQ      || DEDUZIR              |"
   @ 12, 05 SAY "+----+------------+---+------------++----------++----------------------+"
   @ 13, 05 SAY "+----+------------+---+------------++----------++----------------------+"
   @ 14, 05 SAY "| DE |            | A |            ||ALIQ      || DEDUZIR              |"
   @ 15, 05 SAY "+----+------------+---+------------++----------++----------------------+"
   @ 16, 05 SAY "+----+------------+---+------------++----------++----------------------+"
   @ 17, 05 SAY "| DE |            | A |            ||ALIQ      || DEDUZIR              |"
   @ 18, 05 SAY "+----+------------+---+------------++----------++----------------------+"
   @ 19, 05 SAY "+----+------------+---+------------++----------++----------------------+"
   @ 20, 05 SAY "| DE |            | A |            ||ALIQ      || DEDUZIR              |"
   @ 21, 05 SAY "+----+------------+---+------------++----------++----------------------+"
   @ 05, 43 GET nUfirAnterior    PICTURE "######.####"
   @ 07, 43 GET nUfirAtual    PICTURE "######.####"
   @ 08, 0  SAY ""
   FOR EACH oElement IN aTabela
      @ Row() + 3, 11 GET oElement[ TABELA_DE ]       PICTURE "999999999.99"
      @ Row(),     28 GET oElement[ TABELA_ATE ]      PICTURE "999999999.99"
      @ Row(),     47 GET oElement[ TABELA_ALIQUOTA ] PICTURE "##.##"
      @ Row(),     63 GET oElement[ TABELA_DEDUCAO ]  PICTURE "999999999.99"
   NEXT
   READ
   DO WHILE .T.
      Cls()
      nLocador := 0
      Mensagem( "Qual o código do locador:" )
      @ Row(), Col() + 2 GET nLocador PICTURE "9999"
      READ
      Mensagem()
      IF nLocador >= 9999 .OR. LastKey() == K_ESC
         EXIT
      ENDIF
      SEEK nLocador
      IF Eof()
         MsgStop( "Locador não cadastrado" )
         LOOP
      ENDIF
      NOME00 := locad00->NOME
      CIC00  := locad00->CIC
      ENDE00 := locad00->ENDERECO
      CIDA00 := locad00->CIDADE
      CEP00  := locad00->CEP
      UF10   := locad00->UF
      nValor := 0
      Mensagem( "Locador " + StrZero( nLocador, 4 ) + ". Qual valor base:" )
      @ Row(), Col() + 2 GET nValor PICTURE "999999.99" VALID nValor > 0
      READ
      Mensagem()
      IF nValor == 0 .OR. LastKey() == K_ESC
         LOOP
      ENDIF
      nImposto    := 0
      nPercentual := 0
      FOR EACH oElement IN aTabela
         IF nValor > oElement[ TABELA_DE ] .AND. nValor <= oElement[ TABELA_ATE ]
            nPercentual := oElement[ TABELA_ALIQUOTA ]
            nImposto    := nValor * nPercentual / 100 - oElement[ TABELA_DEDUCAO ]
            IF nImposto < 0
               nImposto := 0
            ENDIF
            EXIT
         ENDIF
      NEXT
      nImpostoUfir := nImposto / nUfirAnterior * nUfirAtual
      SELECT leao
      SEEK nLocador
      IF Eof()
         RecAppend()
      ENDIF
      Reclock( 0 )
      REPLACE ;
         leao->COD      WITH nLocador, ;
         leao->NOME     WITH NOME00, ;
         leao->CIC      WITH CIC00, ;
         leao->ENDERECO WITH ENDE00, ;
         leao->CIDADE   WITH CIDA00, ;
         leao->CEP      WITH CEP00, ;
         leao->UF       WITH UF10, ;
         leao->VALOR    WITH nValor, ;
         leao->VALIMP   WITH nImpostoUfir, ;
         leao->AIR      WITH nImpostoUfir * 5 / 100, ;
         leao->PERC     WITH nPercentual, ;
         leao->RESU     WITH nImposto, ;
         leao->ORIGINAL WITH nImposto
      RecUnlock()
      SELECT locad00
   ENDDO
   CLOSE DATABASES

   RETURN
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: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Práticas que facilitam programar Clipper/Harbour

Mensagempor JoséQuintas » 26 Out 2016 10:11

Quando vi o erro, lembrei de postar aqui, só não lembro se já postei:

Compiling 'pnot0100.prg'...
200
pnot0100.prg:203: warning W0001 Ambiguous reference 'ACCLIENTELIST'

pnot0100.prg:263: warning W0001 Ambiguous reference 'ACCLIENTELIST'
700
pnot0100.prg:761: warning W0003 Variable 'ACCLIENTELST' declared but not used in function '198:IMPR
IME'

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


Olhando os três erros: dois se referem a acClienteLIST e um a acClienteLST.

É óbvio: errei na digitação, declarei local um nome, e usei outro.
Nenhum problema, usando compilação -w3 -es2 o próprio Harbour mostrou meu erro.

Sabendo disso da compilação -w3 -es2, altero tranquilamente esse fonte, que não mexo há anos.
É disso que se trata a compilação -w3 -es2: criar/alterar fontes a plena carga, sem medo de ser feliz.
A gente ganha cada vez mais tranquilidade em mexer nos fontes.

Não é questão apenas do fonte, é sobre nós mesmos.
Não são apenas os fontes que vão ficar mais fáceis de mexer, é você que vai mexer mais fácil nos fontes.

Não entendeu?
Isso é igual ter um carro velho que vive quebrando, e você andar só por perto com medo de quebrar.
Você põe motor novo.
É andar 1km no primeiro dia, 2km no segundo, 4km no terceiro... e quando perceber, pode estar dando a volta no mundo (talvez tentando até atravessar a água com ele... rs)

É disso que se trata.
A mudança é nos fontes, mas causa mudanças no programador.
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: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Práticas que facilitam programar Clipper/Harbour

Mensagempor JoséQuintas » 17 Dez 2018 11:19

Hoje pensei numa forma mais interessante de explicar isso tudo.

Uma coisa simples: imagine juntar TODOS os fontes num único PRG, e TUDO numa linha só.
um modelo simples:
use arquivo; do while ! eof(); skip; enddo; close databases; return


Vai ser muito rápido pra compilar... mas pra mexer nesse fonte.... não vai dar.

Porque separamos em vários fontes?
Pra ficar mais fácil pra gente mexer

Porque colocamos um comando em cada linha, ao invés de tudo na mesma linha separado por ponto e vírgula?
Pra ficar mais fácil pra gente mexer

Conclusão simples: O fonte é pra NÓS humanos, pra facilitar pra NÓS humanos, fazemos pensando em NÓS humanos.

Com o tempo, vamos fazendo as rotinas pensando no melhor para o computador, para velocidade, etc., e esquecemos que o fonte é para NÓS humanos.

Tudo que inventam pra programação é pensando em facilitar pra NÓS humanos.
Outra conclusão simples: se o que inventam é pra facilitar pra nós.... então vamos usar o que inventaram, porque é pra nos ajudar...

Aí entram:
- #include
- compilar usando -w3 -es2
- FOR EACH
- classes
- etc.

IF nkey == 5 .OR. nkey == 23 .OR. nkey == -9

Vocês lembram o que faz cada tecla? tem que pensar um pouquinho pra lembrar...

#include "inkey.ch"
IF nKey == K_UP .OR. nKey == K_CTRL_W .OR. nkey == K_F10

Agora tá mais instantâneo identificar...

Qual a diferença?
O primeiro trecho foi feito pensando só no computador/compilador
O segundo trecho foi feito pensando no programador, que é quem olha o fonte, foi usada a "invenção" #include, criada pra deixar o fonte "mais humano".

Então... aquilo que comento de deixar o fonte fácil de mexer....
Dá pra explicar deste jeito: o fonte é algo usado por você mesmo, não tem que ficar fácil para o computador/compilador, tem que ficar fácil pra você.
E procure aprender sobre as novidades.... geralmente elas são criadas pra deixar um fonte "mais humano".
A gente sempre comenta que elas são criadas pra facilitar.... nem percebe que é pra deixar o fonte mais humano.

O FOR/EACH.....
Vamos começar pelo lado humano.... pegar a prova de cada aluno da sala pra corrigir...

FOR EACH Aluno IN Sala
Corrige( Aluno:Prova )
NEXT

e antigamente?

FOR nCont = 1 TO Len( Alunos )
Corrige( Alunos[ nCont ] )
NEXT

Podemos dizer que ficou mais fácil com FOR/EACH, ou dizer que ficou mais "humano", mais próximo da linguagem humana.

Já comentei isso em outro post... pra gente nova pode ser mais fácil aprender, porque não tem o vício dos mais velhos.
Tá em linguagem mais humana, porque não aprendeu FOR/EACH? Talvez porque está pensando no lado do computador, e não no lado humano.
Agora que tá mais fácil, na sua língua, não aprende?.... rs

Isso lembra um ensinamento antigo: a primeira coisa antes de começar a programar é.... desligar o computador.

Talvez seja até um pouco disso: esquecer o lado da máquina, e pensar no lado humano, principalmente pra aprender coisas novas.

Isso vale pra novos comandos de programação, sair de DBF pra SQL, LIBs gráficas, organizar fontes, etc, etc...
É tentar fazer o cérebro não ficar preso a alguma coisa do passado, senão o cérebro não consegue ir em frente.
É reaprender a pensar, como humano, e não como uma máquina.
Aliás... é exatamente isso... tem programador que virou máquina... só faz a mesma coisa do mesmo jeito... acaba fechado a aprender coisa nova, sem nem perceber.
E essa "coisa nova", pode nem ser tão nova... como deixar o fonte mais humano... mais fácil de alterar.
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: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Práticas que facilitam programar Clipper/Harbour

Mensagempor JoséQuintas » 17 Dez 2018 11:59

Ainda nesse assunto... o #include "inkey.ch"

Você vai ensinar um programador novo...
Então você diz pra ele.... teste no programa se apertaram seta pra cima, seta pra baixo, page up, page down....

O que esse programador "novo" vai fazer?

CASE nTecla == K_UP
CASE nTecla == K_DOWN
CASE nTecla == K_PGUP
CASE nTecla == K_PGDN

é um fonte totalmente humano.
Bem diferente de:

CASE nTecla == 5
CASE nTecla == 24
CASE nTecla == 18
CASE nTecla == 3

Aí está outro exemplo do fonte ficar mais "humano", e muitos estão acostumados a fazer igual computador, do segundo jeito.

Nunca tinha pensado nessas coisas por esse lado "mais humano".

Agora tá até parecendo piada:
programador não querer usar #include que deixa o fonte "mais humano".

Melhorar o fonte agora passa a ter outro significado:
Não se trata de você melhorar o fonte para o computador.... e sim, de fazer o computador entender o seu fonte.

Classe para relatórios.....

Se você fosse ensinar um programador... você ensinaria um relatório... pra ele fazer todos iguais aquele, mas cada um com uma parte diferente.
Pois é... na classe de relatório você está ensinando ao computador como se imprime um relatório, pra depois só mostrar a parte diferente.
Está aí de novo... a programação imitando o modo humano.

É incrível.
Dá pra considerar que tudo que melhora programação, na prática é apenas imitação do modo humano.

Classes...
Dá até pra pensar assim: é algo tão comum pra nós humanos, porque demoraram tanto pra permitir isso na programação?... rs

#include é complicado... de outro mundo....
FOR EACH é complicado... de outro mundo....
Classes é complicado... de outro mundo....
Só se você não for do planeta Terra... kkkkk... então... mude seu modo de pensar, porque é você mesmo se complicando à toa...
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: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Práticas que facilitam programar Clipper/Harbour

Mensagempor JoséQuintas » 17 Dez 2018 14:06

Não tinha pensado por esse lado pra outra coisa:

O que melhorar num aplicativo:

Mensagens informando o que fazer, mensagens de alerta, mensagens sobre quais teclas pode apertar (ou imagens), clicar com mouse, imagens em botões, tela bem organizada pra ver as informações de forma rápida, informações em forma de gráfico, etc. etc. etc.
sistema mais... amigo do usuário... GUI... Interface gráfica para o usuário....

Tudo isso pode ser resumido em.... deixar o aplicativo mais humano.

Pega seu aplicativo Clipper antigo.... não aceita mouse, não tem botões gráficos, não dá pra apertar com o dedo...
O usuário quer os avanços tecnológicos.... sim, mas não por ser um avanço... ele apenas quer um aplicativo mais humano, e já sabe que é possível.
Se o aplicativo é do "jeito humano", fica mais fácil de mexer, só isso.

A tecla touch é outro exemplo....
Apontar com o dedo é uma coisa tão velha.... qualquer criança aponta com o dedo há muito tempo....
tela touch pode ser moderna, mas só está imitando o que é normal do ser humano.

A gente pensando que o usuário queria as coisas mais modernas....
E o usuário só querendo o que é normal para o ser humano.... que a tecnologia vai permitindo/imitando...

Pois é.... Temos que esquecer a programação de antigamente... não por ser ultrapassada.... mas porque é "menos humana".
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: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Práticas que facilitam programar Clipper/Harbour

Mensagempor JoséQuintas » 30 Dez 2018 18:41

Geralmente num aplicativo fazemos os tbrowse, uma lista pro usuário consultar.
Em todo aplicativo, vai ser sempre o mesmo visual, senão vira uma bagunça.
Então... é normal criar uma única rotina genérica para o aplicativo inteiro.
Deste jeito, todos os "browses" ficam com a mesma aparência.

tbrowse.png


Pesquisei AddColumn, que faz parte do TBrowse, pra acrescentar colunas, em TODOS os fontes de TODOS os aplicativos.

Encontrou 6.188 linhas contendo o AddColumn.
De todas essas linhas:

5 linhas, são TODOS os meus aplicativos.
6183 linhas, são do(s) aplicativo(s) FlagShip.

Lógico... alterar 6183 linhas vai longe......

Mas sem pressa.
Mais importante do que sair alterando 6.183 linhas, é ter certeza que vai ser alterado pra algo melhor, senão, vai ser ficar alterando mais de 6.000 linhas o tempo todo, o que é inviável.
Então é alterar um, testar bastante, e só depois sair para o segundo.
No segundo idem... e depois ir pro terceiro.
Com certeza, quando chegar no último, vai ter um browse infalível.
Pode até depois colocar botões gráficos no browse.... (não no Flagship).

O mesmo conceito vale pra ambiente GUI.

Nota:
Nesse conjunto do Flagship tem fontes fora de uso.
Infelizmente ainda não sei quais são.
Mais um motivo pra fazer um de cada vez, começando por um simples, e indo direto para os principais em uso.

flagship0.png


Desde que comecei a mexer, o EXE vém reduzindo de tamanho.
É importante reduzir o tamanho do EXE? não

O importante é eliminar rotinas repetidas, a redução de tamanho é só uma consequência.

Coisa básica: quanto menos fonte, menos lugar pra dar problema.

Com rotinas repetidas... complicou.
Alterar pra GUI... complicou.

Esses mesmos fontes
Alterar pra GUI 6.183 linhas? ... vai ser f.... uma pode ficar diferente da outra.
Muito melhor alterar pra uma rotina padrão de browse, e depois passar pra GUI uma única rotina padrão.

Por isso comento que às vezes é melhor dar uma geral no fonte, antes de sair modificando, pra não se complicar.

Ainda comparando Flagship e o restante dos meus aplicativos.
É difícil converter os fontes pra LIB gráfica, ou pra GTWVG ou GTWVW, ou outra?
Depende.... seu fonte é desse tipo com 6.183 linhas pra fazer a mesma coisa, ou 5 linhas?

Nem precisa ir tão longe....
Qual fonte vai ser mais fácil dar manutenção?
Vai ficar o resto da vida fazendo manutenção em 6183 linhas... ou vai reduzir isso pra 5 linhas, e acabar com manutenção.

Pra quem ainda não entendeu sobre fonte fácil, é isso.
Quando mais fácil o fonte, menos manutenção, e mais tempo sobra.

Aos poucos essas 6.183 linhas vão sumir.....

Olhem isto:

   ocolu1 := TBColumnNew( "N Remessa"       , {|x| RQR3->num_nfr   })
   ocolu2 := TBColumnNew( "Valor Re"        , {|x| RQR3->vlr_rem   })
   ocolu3 := TBColumnNew( "nf Fat "         , {|x| RQR3->num_nff   })
   ocolu4 := TBColumnNew( "Valor Fat"       , {|x| RQR3->vlr_fat   })
   ocolu5 := TBColumnNew( "Obra"            , {|x| RQR3->cod_pi   })

   obrowser:addColumn( ocolu5 )
   obrowser:addColumn( ocolu1 )
   obrowser:addColumn( ocolu2 )
   obrowser:addColumn( ocolu3 )
   obrowser:addColumn( ocolu4 )


Pra que deixar fora de ordem? não era mais fácil ter alterado a ordem encima? era só alterar um único digito em cada linha.
Se olhar pelo fonte, a ordem do browse é uma, mas na prática é outra.
Só pra complicar.... rs
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: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Práticas que facilitam programar Clipper/Harbour

Mensagempor JoséQuintas » 30 Dez 2018 18:45

Com uma pequena alteração.

   oTBrowse := { ;
      { "Obra"            , {|| RQR3->cod_pi   } }, ;
      { "N Remessa"       , {|| RQR3->num_nfr   } }, ;
      { "Valor Re"        , {|| RQR3->vlr_rem   } }, ;
      { "nf Fat "         , {|| RQR3->num_nff   } }, ;
      { "Valor Fat"       , {|| RQR3->vlr_fat   } } }
   ToBrowse( oTBrowse, oBrowser )
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: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Práticas que facilitam programar Clipper/Harbour

Mensagempor JoséQuintas » 01 Jan 2019 00:54

O Flagship Linux encerrado em 2018.
Parte de alterações do que mostrei e mais compilação -w3 -es2.

linux.png


Reduziu em 1 dia de 17.831 pra 17.408, mais de 400.000 bytes.
Pra apenas criação de tbrowse, até que foi muito.
E nem alterei todos, ainda faltam muitos.
E nem padronizei a rotina de tbrowse ainda....
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: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Práticas que facilitam programar Clipper/Harbour

Mensagempor JoséQuintas » 01 Jan 2019 10:41

linux.png


linux2.png


Continua encolhendo.
Mas ainda não dá pra comparar com Harbour.

Flagship Linux: 17.270
Harbour Linux: 6.172
Harbour Windows: 5.071, compactado 1.541

Por enquanto esse está bom assim, pronto (ou quase) pra qualquer escolha.
Agora é fazer o mesmo com outros aplicativos, porque a escolha depende de trocar todos os aplicativos juntos.

Este foi o aplicativo "cobaia" pra confirmar alterações.
IDX pra Flagship e CDX pra Harbour. Ainda faltando mais ajustes, mas pronto não serve pra nada sem os outros aplicativos, então agora é partir para os outros, porque falta confirmar a existência de fontes - sem fontes, sem troca pra Harbour.

Pra quem ainda não converteu de Clipper para Harbour..... É só usar um esquema assim.
Estou trabalhando com Flagship, não posso usar Harbour, mas estou deixando fontes prontos.
Quem ainda está usando Clipper... pode deixar fontes prontos sem sair do Clipper, até poder trocar de vez.
No caso do Clipper vai ser até mais fácil e rápido, porque é tudo compatível, dá até pra usar os dois ao mesmo tempo.

Acabou sendo uma forma de facilitar meu trabalho, porque posso testar normalmente usando Harbour/Windows, antes de compilar com Flagship/Linux.
Não deixa de ser uma prática pra facilitar programar, o que é relacionado com o post.
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: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Práticas que facilitam programar Clipper/Harbour

Mensagempor JoséQuintas » 14 Jan 2019 01:35

flagship.png


Reduziu mais ainda.... rs

20.069 o tamanho inicial
20.936 quando acrescentei rotinas minhas
16.749 o tamanho atual

Reduziu quase 4MB só de começar a eliminar rotinas repetidas, cerca de 20% do total.
Tá funcionando melhor que antes, e com um pouco mais de recursos.
Mudanças básicas - vou fazendo sem entrar em detalhes, pra não perder muito tempo.
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: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Práticas que facilitam programar Clipper/Harbour

Mensagempor JoséQuintas » 25 Jan 2019 12:11

Esse aplicativo Linux é uma fonte de coisas que não se devem fazer.... rs
Poder incluir de qualquer lugar do aplicativo.... tudo bem... mas rotinas diferentes?

incluia.png


incluib.png


Aí é uma pesquisa superficial, porque só aparecem as linhas com o texto rigorosamente igual ao que pedi pra pesquisar.
11 rotinas diferentes pra cadastrar fornecedor, e 9 rotinas diferentes pra cadastrar clientes.
Se o cadastro do cliente estiver com problema... qual será a rotina com problema?
Ou se mudarem as regras de CNPJ, Inscrição Estadual, etc... alterar várias rotinas?
Complicado....

Ainda não mexi nisso, mas o EXE continua reduzindo.

bhp.png


Menos fontes, menos problemas.
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: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Práticas que facilitam programar Clipper/Harbour

Mensagempor JoséQuintas » 26 Jan 2019 18:12

Como eu disse, esse aplicativo em Flagship é uma fonte de coisas estranhas pra pesquisar.
Nem vou tentar entender, vou me limitar a apenas organizar o fonte primeiro.

Vejam como vai ser interessante.

Anotei aí pra mostrar que os blocos tem pontos comuns, e vai dar pra intercalar o bloco de baixo no de cima.
Por enquanto a comparação é perigosa, porque as "coisas" estão longe uma da outra.
Pra alteração, é importante manter tudo do segundo bloco depois do primeiro, porque é o que acontece na execução.

Então, este é o original

blocoduplic.png
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: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Práticas que facilitam programar Clipper/Harbour

Mensagempor JoséQuintas » 26 Jan 2019 18:15

Primeira alteração: trouxe o que estava embaixo pra cima.
Agora posso dividir o fonte na metade, e ver metade de cada vez.

blocoduplic2.png
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: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Práticas que facilitam programar Clipper/Harbour

Mensagempor JoséQuintas » 26 Jan 2019 18:18

O que está no IF é parecido com o que está no ELSE, então mostrar uma parte já vai valer pra outra.

duplic3.png


O que dá pra ver aí, é que o primeiro bloco apenas pula séries P e Q, enquanto no segundo faz tratamento.
Então vamos organizar mais. Deixamos as análises pra P e Q, e o resto fica dentro do ELSE.
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: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Práticas que facilitam programar Clipper/Harbour

Mensagempor JoséQuintas » 26 Jan 2019 18:22

Agora tá bem organizado, a diferença está agrupada.
Sei lá... pesquisa, grava... pra depois gravar outra coisa no final.... rs
Anexos
duplic4.png
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: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Anterior Próximo



Retornar para Contribuições, Dicas e Tutoriais

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 17 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