Dicas sobre LIBs

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

Moderador: Moderadores

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

Dicas sobre LIBs

Mensagem por JoséQuintas »

Não perguntem detalhes, é apenas meu ponto de vista, e não sou conhecedor de nenhuma, continuo achando um pé no saco ficar pesquisando sobre as LIBs, mas pelo menos isso ajuda muito.

O principal problema das LIBs é criar linguagem própria, então você pensa que é uma coisa, mas é outra.
Mas... isso tem uma saída interessante.

hwgui em boa parte é OOP, mas não é totalmente OOP
minigui não tem OOP, é simulada através de arquivos CH, e isso confunde.
As causam modificação nos comandos do harbour, nem adianta falar o contrário.

hwgui não tem muito o que falar, boa parte é OOP, segue boa parte o normal conhecido do harbour, na maior parte do tempo o que se escreve é o que acontece.
minigui era... ou é... depende do ponto de vista.

minigui se divide em no mínimo 3, na verdade acho que tem muito mais, menos famosas, como MarinasGUI por exemplo usando QT
hwgui também se divide, as mais conhecidas são 2.17 e 2.23, mas tem outras versões, menos famosas.

A melhor ? acho que fivewin comercial, é a mais antiga, com mais suporte, e onde todos se ajudam.
Quanto mais usada, mais problemas resolvidos, e segue-se em frente.

Mas nas grátis tem a minigui, a atenção a ela aqui não tem nada a ver com ser melhor ou não, mas porque há diversas formas de uso, e dependendo da escolhida pode atrapalhar ao invés de ajudar.

1) Sintaxe alternativa

exemplo prático pra mostrar a diferença:

Código: Selecionar todos

FUNCTION gui_DialogCreate( xDlg, nRow, nCol, nWidth, nHeight, cTitle, bInit, xOldDlg )

   IF Empty( xDlg )
      xDlg := gui_newctlname( "DLG" )
   ENDIF

   IF Empty( bInit )
      bInit := { || Nil }
   ENDIF
   DEFINE WINDOW ( xDlg ) ;
      AT nCol, nRow ;
      WIDTH nWidth x ;
      HEIGHT nHeight ;
      TITLE cTitle ;
      ; // MODAL ; // bad using WINDOW MAIN OFF
      ON INIT Eval( bInit ) ;
      ON RELEASE iif( Empty( xOldDlg ), Nil, DoMethod( xOldDlg, "SETFOCUS" ) )
      IF ! Empty( xOldDlg )
         ON KEY ALT+F4 ACTION doMethod( xOldDlg, "SETFOCUS" )
      ENDIF
   END WINDOW

   RETURN Nil
note acima que tem ponto e vírgula, uma linha é continuação da outra.
lib_hmge.prg:232: error E0030 Syntax error "syntax error at 'WINDOW'"
Tem erro, mas qual ? ok, esse tá visível, é o X, mas nem sempre é assim.
Ainda não alterei essa criação pro outro formato, o chamado altsyntax.ch

Código: Selecionar todos

FUNCTION gui_TextCreate( xDlg, xControl, nRow, nCol, nWidth, nHeight, ;
            xValue, cPicture, nMaxLength, bValid )

   IF Empty( xControl )
      xControl := gui_newctlname( "TXT" )
   ENDIF
   DEFINE GETBOX ( xControl )
      PARENT ( xDlg )
      ROW nRow
      COL nCol
      HEIGHT nHeight
      WIDTH nWidth
      FONTNAME DEFAULT_FONTNAME
      IF ValType( xValue ) == "N"
         NUMERIC .T.
         INPUTMASK cPicture
      ELSEIF ValType( xValue ) == "D"
         DATE .T.
         DATEFORMAT cPicture
      ELSEIF ValType( xValue ) == "L" // workaround to do not get error
         xValue := " "
      ELSEIF ValType( xValue ) == "C"
         MAXLENGTH nMaxLength
      ENDIF
      VALUE xValue
      //ON LOSTFOCUS Eval( bValid )
      VALID bValid
   END GETBOX
   (bValid)

   RETURN Nil
Esse acima é usando o altsyntax.ch
Parece a mesma coisa.... mas não é.
Nesse formato CADA LINHA é compilada de forma independente, se der erro na linha, é ela que precisa ser corrigida.
Acho muito melhor, vai ser apresentado o erro da linha exata que contém o erro, não é igual ao anterior, que precisa revisar várias linhas sem saber no que mexer.
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

Dicas sobre LIBs

Mensagem por JoséQuintas »

2) Variáveis

Ao usar DECLARE WINDOW teste, ou DEFINE WINDOW teste, antigamente era criada a variável pública teste.
É meio que perder o controle sobre o fonte, e poder gerar conflitos.
No dlgauto trato tudo como array, mas poderia ser qualquer variável, isso deixa mais sob controle, mesmo sendo só nome.
É só usar o nome/variável entre parêntesis.

Código: Selecionar todos

CREATE WINDOW ( xDlg )
Tudo bem que o conteúdo é uma string, mas a variável está sob controle.
Se quiser no fonte usar array, classe, seja o que for, o que vale é o conteúdo.

Código: Selecionar todos

SetProperty( xDlg, xControl, "VALUE", 10 )
GetProperty( xDlg, xControl, "VALUE" )
DoMethod( xDlg, xControl, "REFRESH" )
Não é classe, mas tem efeito parecido.
Supondo que guarde os nomes dos getbox num array aGetboxList:

Código: Selecionar todos

FOR EACH xControl IN aGetboxList
   SetProperty( xDlg, xControl, "BACKCOLOR", RGB(50,50,50) )
NEXT
Como eu disse, não é classe, mas facilita.
Vai de cada um criar a forma de trabalhar com isso.

São coisas que não existiam antigamente, e agora existem.

Tem lá o form.control.maximize.
Isso não é oop, por isso não adianta tentar &( "form.control.maximize" ) que não vai funcionar.
Já do outro jeito, talvez, porque se for de uma forma que o harbour aceita, vai aceitar.

Código: Selecionar todos

&( [DoMethod( xDlg, xControl, "BACKCOLOR", RGB(50,50,50) )] )
Vai ter o mesmo problema de variáveis que o harbour pode ter.
Então, talvez igual fazemos com SQL ou banco de dados externo:

Código: Selecionar todos

&( [DoMethod( "] + xDlg + [", "] + xControl + [", "BACKCOLOR", RGB( 50, 50, 50 ) )] )
Isso permite até armazenar comandos no banco de dados pra executar depois.
É interessante, é uma coisa tão básica ter a string com o nome, e de repente isso se torna flexível e poderoso.
Guardar em array, json, hash, banco de dados, classe, etc.
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

Dicas sobre LIBs

Mensagem por JoséQuintas »

É só esse básico mesmo.
Acho que faz muita diferença conforme o aplicativo cresce.

Novamente:
Apenas mostrando um uso que achei melhor.
Não significa que esteja indicando a LIB.

Esse formato é aceito em HMG 3, HMG Extended e OOHG, as 3 miniguis.
OOP é aceita em hwgui e em OOHG.

Em oop é xControl:Enabled := .T., xControl:Enable(), xControl:SetFocus(), etc.
Os dois pontos indicam que é classe real harbour.

Se fosse indicar alguma lib... difícil... estou só no começo, e o começo é complicado em todas.

o DLGAUTO ?

É só meu ambiente de testes, e exige que a lib seja flexível, é isso que um aplicativo vai precisar.
Só facilita porque fez uma coisa uma vez, não precisa fazer de novo.
E os testes ficam salvos, das outras vezes foram todos pro lixo, talvez até tenha sido bom, porque acabei encontrando essas formas "novas" de usar, e estou repassando aqui.
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/
Responder