Página 10 de 11

DLGAUTO Dialogs automáticas (não geração de fontes)

Enviado: 26 Ago 2024 13:35
por JoséQuintas
test2.png
Só GTWVG, HWGUI e HMG Extended.
Deu erro na segunda thread da HMG Extended, sei lá porque, é mesmo fonte, talvez sejam as alterações da minigui pra classe fazendo efeito.

Talvez interessante destacar aqui:

É o uso simultâneo, e em multithread.
Acho que nada impede de deixar todas as LIBs no EXE, e executar apenas uma.
Ou fazer isso com o dlgauto: um EXE rodando qualquer LIB, sem precisar recompilar.

Essas coisas podem ser boas, pra quem está pensando em migrar aos poucos.
Já fica sabendo dos limites.
Reforçando: LIBS COM SEUS FONTES ORIGINAIS, NÃO ALTEREI NENHUMA

DLGAUTO Dialogs automáticas (não geração de fontes)

Enviado: 26 Ago 2024 14:02
por JoséQuintas
O segredo do dlgauto ? fonte pra cada LIB ?
Uso muito isto em multithread, e a maioria das LIBs também

Código: Selecionar todos

THREAD STATIC oGUI

FUNCTION GUI()

   RETURN oGUI
A variável é THREAD STATIC, visível somente nesse módulo, e pra cada thread será uma variável diferente.
Já a função GUI() é de acesso global, visível em qualquer thread.
Com isso, cada thread enxerga uma variável diferente.
E o que tem nesssa variável ?

Código: Selecionar todos

      oGUI := HMGEClass():New()
As funções de criação e montagem de dialog de uma lib específica.
Quer trocar de lib, é só trocar o conteúdo da variável.
Se cada thread tem sua própria variável, cada thread pode trabalhar com uma lib diferente.

Não é nada do outro mundo, é coisa comum do harbour.
Um tipo de variável do harbour, usando classe que é coisa do harbour, e multithread que é coisa do harbour.
O resultado é ter dialogs à vontade, de qualquer lib, ao mesmo tempo, desde que a lib não destrua o recurso do harbour.
Se tudo ok, cada lib funciona no seu canto, na sua thread, como EXE separado.
Se as LIBs funcionam em EXEs separados, porque não em multithread ?
Pois é...
Essa parte acima eu sei, mas a outra parte referente às LIBs eu não sei, foge do meu conhecimento.
Só imagino algo feito a nível de C, com algo também STATIC.
Parece que o harbour tem isso pras GTs, e HWGUI também tem.

DLGAUTO Dialogs automáticas (não geração de fontes)

Enviado: 27 Ago 2024 14:06
por JoséQuintas
Programar em GUI é um verdadeiro inferno !!!!
undefined reference to `HB_FUN_COLOR'
Detalhes ?
Não tem.

DLGAUTO Dialogs automáticas (não geração de fontes)

Enviado: 28 Ago 2024 12:24
por JoséQuintas
Achei essa meleca....
Juntou com outra meleca do programador, a falta de ponto e vírgula

Aqui, normal:

Código: Selecionar todos

#ifndef WIN_RGB
   #define WIN_RGB( r, g, b ) ( r + ( g * 256 ) + ( b * 256 * 256 ) )
#endif
Mesmo assim, alterei por precaução

Código: Selecionar todos

#ifndef WIN_RGB
   #define WIN_RGB( r, g, b ) r + ( g * 256 ) + ( b * 256 * 256 )
#endif
Aqui também normal

Código: Selecionar todos

#define COLOR_LIGHTGRAY     WIN_RGB( 250, 250, 250 )
Aqui em fivewin, teoricamente normal

Código: Selecionar todos

      DEFINE DIALOG xDlg FROM nRow, nCol TO nRow + nHeight, nCol + nWidth ;
         PIXEL OF xParent /* FONT oFont */ TITLE cTitle + " (" + GUI():LibName() + ")" ICON "ICOWINDOW" ;
         COLOR COLOR_LIGHTGRAY
Tinha esquecido o ponto e vírgula, mas teoricamente normal.

só teoricamente....

é uma péssima compatibilidade com Clipper, e muito usada em LIBs GUI, e seguida por alguns usuários....

Código: Selecionar todos

COLOR     (12345)
Isso pode ser considerado função.
Faz parte do harbour, pra compatibilidade com Clipper.

Mesmo assim, se eu tivesse colocado o ponto e vírgula, cairia na sintaxe da DIALOG, que usa COLOR de outra forma. e chegaria na compilação do harbour de forma diferente.

Pois é.... fazer o que...

Descobri olhando o PPO pra ver que fonte estava sendo compilado.

Nota: pra economia de fonte e pra ser mais seguro, melhor usar função verdadeira ao invés do #define WIN_RGB(), mas isso faz parte do harbour 3.2 e fiz igual,. senão haveria a possibilidade de mais conflitos. Se não me engano no 3.4 isso está diferente, e algumas LIBs tem função própria pra isso.

DLGAUTO Dialogs automáticas (não geração de fontes)

Enviado: 05 Set 2024 13:26
por JoséQuintas
E pra quem não entendeu o teste mixado, e quiser fazer igual:

É meu aplicativo funcionando normalmente.
É meu aplicativo também com dlgauto.
É meu aplicativo também com QUALQUER LIB GUI, uma ou mais.

Por enquanto verificando max_allowed_packed dos MySQLs.... o limite pode ser 4MB e isso é pouco pra salvar o novo EXE no MySQL.
Depois disso, tá liberado à vontade, pra testar em clientes.
Tá na hora de um teste mais amplo, porque só eu testando é pouco.

Principalmente porque o redimensionamento automático da GTWVG não vai existir nas LIBs (talvez)

DLGAUTO Dialogs automáticas (não geração de fontes)

Enviado: 11 Set 2024 16:22
por JoséQuintas
dlgauto2.png
dlgauto.png

Código: Selecionar todos

   WITH OBJECT cnSQL
      FOR EACH cTable IN :TableList()
         AAdd( aAllSetup, { cTable, {}, Nil } )
         aFieldList := :FieldList( cTable )
         :Execute( "SELECT * FROM " + cTable + " LIMIT 1" )
         FOR EACH cField IN aFieldList
            aStru := :FStru( cField )
            aItem := EmptyFrmClassItem()
            aItem[ CFG_CTLTYPE ]  := TYPE_TEXT
            aItem[ CFG_FNAME ]    := aStru[ 1 ]
            aItem[ CFG_FTYPE ]    := aStru[ 2 ]
            aItem[ CFG_FLEN ]     := aStru[ 3 ]
            aItem[ CFG_FDEC ]     := aStru[ 4 ]
            aItem[ CFG_VALUE ]    := :Value( aStru[ 1 ] )
            aItem[ CFG_CAPTION ]  := aStru[ 1 ]
            aItem[ CFG_FPICTURE ] := PictureFromValue( aItem )
            AAdd( Atail( aAllSetup )[ 2 ], aItem )
         NEXT
         cnSQL:CloseRecordset()
      NEXT
   ENDWITH
Mesma história de sempre....
Tabelas, estruturas, dialogs automáticas..
Como GUI não gosta de DBF, modificando pra ADO + MySQL.

DLGAUTO Dialogs automáticas (não geração de fontes)

Enviado: 15 Set 2024 09:07
por JoséQuintas
browse.png
Primeiro browse ADO.
Começando por HWGUI, onde geralmente o resultado corresponde ao fonte.
Por enquanto só essa largura de coluna pra resolver.
Aí estiquei a coluna, depois do browse pronto.
Porque a coluna preenchida veio menor do que a vazia ?
Sei lá... GUI tem muitos mistérios...

DLGAUTO Dialogs automáticas (não geração de fontes)

Enviado: 18 Nov 2024 11:47
por JoséQuintas
Ao mesmo tempo que DLGAUTO ajuda a detectar problemas mais rápido, tem horas que fica complicado.
Dá pra usar a variação de libs pra ajudar, ou algo mais, mas fica complicado, conforme o problema.
click.png
Problema atual: HWGUI O CLIQUE NO BUTTON NÃO FUNCIONA, nem save e nem cancel.

Quais as referências:

TODA dialog tem isso
Em toda dialog funciona.
A função do clique é sempre a mesma, em todas as dialogs, chama o evento SAVE_CLICK() ou CANCEL_CLICK()
Toda dialog tem o get fantasma.

O que tem de diferente nessa dialog ?
Só tem um GET.

Sei lá...

DLGAUTO Dialogs automáticas (não geração de fontes)

Enviado: 19 Nov 2024 11:13
por JoséQuintas
Encontrei.
A action no lostfocus da HWGUI (não testei em outras libs)

Meus testes são bem parciais e vagarosos.
Fui testar um problema que foi mencionado na HWGUI e calhou de eu testar uma situação com isso.
A situação existe faz tempo, apenas só percebi agora, num determinado teste.

O que coloquei no dlgauto:
Teclando ENTER vai de campo em campo.
O ENTER no último campo de um tabpage move pro primeiro da outra tabpage.
O ENTER no último campo da última tabpage move pro primeiro campo da primeira tabpage.
Pra isso acontecer usei o LOSTFOCUS e o SETFOCUS.
Isso afeta clique em button e até o VALID.

No caso de uma tabela com um único campo, isso ficou em evidência.

É pra isso que serve o dlgauto, fornecer situações diferentes pra testar.
O comportamento das LIBs não é o mesmo pra todas as situações, ou, numa situação fica em evidência.

Quanto mais testes melhor... mas precisaria pessoas diferentes fazendo testes de formas diferentes.

Não se trata de testar dlgauto, e sim de testar as libs.
O dlgauto funciona, as libs é que não.

DLGAUTO Dialogs automáticas (não geração de fontes)

Enviado: 20 Nov 2024 13:24
por JoséQuintas
Lado bom e lado ruim:

Código: Selecionar todos

   IF ::lWithTab

      GUI():TabPageEnd( ::xDlg, xTab )
      IF Len( aPageList ) > 1
         GUI():TabNavigate( ::xDlg, xTab, aPageList )
      ENDIF
      GUI():TabEnd( ::xDlg, xTab, nPageCount )

   ENDIF
Se só tem 1 tabpage, não tem porque colocar navegação entre tabs, o if faz isso.
O lado ruim é que essa falha de lostfocus vai ficar mais encondida, somente em determinados campos, enquanto que sem isso fica totalmente visível em tabela com campo único.

DLGAUTO Dialogs automáticas (não geração de fontes)

Enviado: 12 Fev 2025 17:11
por JoséQuintas
dlgautohmge.png
dlgauto compilado com HMGE 25.02
Parece que funciona.
Abri cadastro de clientes
Cliquei em editar
Fui no browse de pedidos (tickets)
Cliquei no pedido, abriu pedido
Fui no browse de produtos do pedido
Cliquei no produto, abriu produto

DLGAUTO Dialogs automáticas (não geração de fontes)

Enviado: 12 Fev 2025 17:16
por JoséQuintas
dlgautohwgui.png
Não lembro mais se funcionava, mas com HWGUI não aprofundou nível.
click no browse fecha dialog.
Revisar quando der na telha.

DLGAUTO Dialogs automáticas (não geração de fontes)

Enviado: 12 Fev 2025 17:20
por JoséQuintas
dlgautofivewin.png
fivewin ok.

DLGAUTO Dialogs automáticas (não geração de fontes)

Enviado: 13 Fev 2025 21:14
por JoséQuintas
Novo teste de mistura.
Sei lá porque, não deu o resultado que eu esperava, mas depois tento ver porque.

É coisa simples......sei lá....

Tem um fonte de cada lib.
isso não mistura nada.
Vai compilar um fonte, com uma lib gui, e gerar um arquivo de lib
Vai fazer isso 4 vezes, pra 4 libs.
Não dá pra compilar junto, num mesmo projeto, porque as libs minigui tem CH com mesmo nome, se compilar junto dá muito erro.

Código: Selecionar todos

call \tools\util\c.bat /cmd \github\dlgauto\source\lib_hwgui.prg hwgui.hbc -hblib
call \tools\util\c.bat /cmd \github\dlgauto\source\lib_hmg3.prg hmg3.hbc -hblib
call \tools\util\c.bat /cmd \github\dlgauto\source\lib_hmge.prg hmge.hbc -hblib
call \tools\util\c.bat /cmd \github\dlgauto\source\lib_oohg.prg oohg.hbc -hblib
Ok, nada demais, gerei 4 libs.
por exemplo, um fonte hwgui, compilado com hwgui, que gerou a lib_hwgui.a, que contém o fonte compilado.
qualquer um que use hwgui faz isso.

Não fiquei a fim de criar 4 hbps pra isso, nem de ficar digitando, então foi por bat.

Criei um módulo principal, GTWVG lógico.

Código: Selecionar todos

THREAD STATIC oGUI

FUNCTION GUI()

   RETURN oGUI

PROCEDURE Main

   LOCAL nOpc := 1

   SetMode(33,100)
   CLS
   DO WHILE .T.
      @ 1, 0 PROMPT "(H)HWGUI"
      @ 2, 0 PROMPT "(3)HMG3"
      @ 3, 0 PROMPT "(E)HMGE"
      @ 4, 0 PROMPT "(O)OOHG"
      MENU TO nOpc

      DO CASE
      CASE LastKey() == 27; EXIT
      CASE nOpc == 1; hb_ThreadStart( { || Test2( "DLGAUTOHWGUI" ) } )
      CASE nOpc == 2; hb_ThreadStart( { || Test2( "DLGAUTOHMG3" ) } )
      CASE nOpc == 3; hb_ThreadStart( { || Test2( "DLGAUTOHMGE" ) } )
      CASE nOpc == 4; hb_ThreadStart( { || Test2( "DLGAUTOOOHG" ) } )
      ENDCASE
   ENDDO

   RETURN

FUNCTION Test2( xFrmName )

   hb_gtReload("WVG")
   DO CASE
   //CASE xFrmName == "DLGAUTOFIVEWIN" ; oGui := FIVEWINClass():New()
   CASE xFrmName == "DLGAUTOHWGUI" ;   oGUI := HWGUIClass():New()
   //CASE xFrmName == "DLGAUTOHMGE" ;    oGUI := HMGECLASS():New()
   CASE xFrmName == "DLGAUTOHMG3" ;    oGUI := HMG3Class():New()
   CASE xFrmName == "DLGAUTOOOHG" ;    oGUI := OOHGClass():New()
   ENDCASE
   Do( "DLGAUTO" )

   //PostQuitMessage(0)

   RETURN Nil

FUNCTION HB_GTSYS

   REQUEST HB_GT_WVG_DEFAULT

   RETURN Nil
Ok ? o módulo principal chama DLGAUTO.
Mas conforme a opção escolhida, cria uma classe diferente.
O módulo principal força GTWVG como default.
Nada demais também.

Aí vém o projeto master, esse talvez complique um pouco, talvez não.

Código: Selecionar todos

testmix.prg
-DDLGAUTO_AS_LIB
-Id:\github\dlgauto\source

d:\github\dlgauto\source\frm*.prg
d:\github\dlgauto\source\test.prg
d:\github\dlgauto\source\test_loadsetup.prg
d:\github\dlgauto\source\test_setup.prg

hbct.hbc
-mt

-L.
-llib_hwgui
#-llib_hmge
-llib_oohg
-llib_hmg3
gtwvg.hbc
hwgui.hbc
#hmge.hbc
oohg.hbc
hmg3.hbc
ele compila normalmente o test.prg, e alguns fontes do dlgauto.
indica os arquivos de lib que foram gerados.
indica também as libs.

um projeto normal, com fontes e libs, o diferente é só misturar libs.
habilito/desabilito dependendo se funciona ou não.
tudo.png
Uia.
Desabilitei o automático, de pegar DBFs da pasta, pra incluir no meu aplicativo real, por isso não aparecem os outros.
Vou precisar alterar pra este projeto.

Abriu GTWVG
Abriu DLGAUTO usando HWGUI
Abriu DLGAUTO usando OOHG
Mas deu erro em HMG3, porque tem função repetida, e HMG3 tentou usar a função da OOHG.
4 LIBs no mesmo EXE, apesar de uma não funcionar.

HMG Extended não funcionou, não sei se a versão 25.02 teve alguma mudança, ou se não era pra funcionar mesmo, por isso bloqueada.
Já testei antes HMGE e HWGUI juntas e funcionavam.

DLGAUTO Dialogs automáticas (não geração de fontes)

Enviado: 13 Fev 2025 21:41
por JoséQuintas
É até difícil dizer o que é mais interessante nisso tudo.

Se é misturar LIBs....
Ou se é o dlgauto.

Lembram? dlgauto, cria tudo automático.
Os fontes do dlgauto estão rodando, mas de forma diferente em cada thread.

É incrível né ?
Nem tanto.
Multithread é igual vários EXEs
Consigo gerar dlgauto em várias LIBs em EXEs separados
Logo... em multithread é como ter um EXE em cada LIB.
Pensando assim, é o dia a dia normal.
O problema é a lib não ter sido preparada pra isso, é como um EXE invadir o outro, ou não ter nome único pra suas funções, o que causa pegar função errada.

É uma amostra que o mundo harbour pode ser unido.
Não tem porque ficar dividindo em grupos isolados, é tudo harbour.