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

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

Gerador/criação de telas/executor

Mensagem por JoséQuintas »

Só um comentário a mais:

Código: Selecionar todos

#ifndef __XHARBOUR__
  SET PROCEDURE TO tget\tget.prg
  SET PROCEDURE TO tget\tgetint.prg
#endif
esses fontes NÃO entram em Xharbour.
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

Gerador/criação de telas/executor

Mensagem por JoséQuintas »

Agora problema no browse.

Código: Selecionar todos

FUNCTION gui_Browse( xDlg, xControl, nRow, nCol, nWidth, nHeight, oTbrowse, cField, xValue, workarea )

   LOCAL aHeaderList := {}, aWidthList := {}, aFieldList := {}, aItem

   IF Empty( xControl )
      xControl := gui_newctlname( "BROW" )
   ENDIF
   FOR EACH aItem IN oTbrowse
      AAdd( aHeaderList, aItem[1] )
      AAdd( aFieldList, aItem[2] )
      AAdd( aWidthList, Max( Len( aItem[3] ), Len( Transform(FieldGet(FieldNum(aItem[1] ) ), "" ) ) ) * 10 + 10 )
   NEXT

   DEFINE BROWSE ( xControl )
      PARENT ( xDlg )
      ROW nRow
      COL nCol
      WIDTH nWidth - 20
      HEIGHT nHeight - 20
      ONDBLCLICK gui_BrowseDblClick( xDlg, xControl, workarea, cField, @xValue )
      HEADERS aHeaderList
      WIDTHS aWidthList
      WORKAREA ( workarea )
      FIELDS aFieldList
   END BROWSE

   //@ nRow, nCol GRID ( xControl ) ;
   //   OF ( xDlg ) ;
   //   WIDTH nWidth - 20 ;
   //   HEIGHT nHeight - 20 ;
   //   ON DBLCLICK gui_BrowseDblClick( xDlg, xControl, workarea, cField, @xValue ) ;
   //   HEADERS aHeaderList ;
   //   WIDTHS aWidthList ;
   //   ROWSOURCE ( workarea ) ;
   //   COLUMNFIELDS aFieldList

   (xDlg);(cField);(xValue);(workarea)

   RETURN Nil
Troquei o grid por browse e parou.
No CH, GRID é browse, mas na prática o DBLCLICK não tá pegando o valor do mesmo jeito.
Baseado em alguma coisa que vi antes, talvez na HMG3, talvez alguma definição pro DBF acompanhar a navegação.
.
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

Gerador/criação de telas/executor

Mensagem por JoséQuintas »

Solução quebra-galho pro browse HMG Extended, sintaxe alternativa:

Código: Selecionar todos

   DEFINE BROWSE ( xControl )
      PARENT ( xDlg )
      ROW nRow
      COL nCol
      WIDTH nWidth - 20
      HEIGHT nHeight - 20
      ONDBLCLICK gui_BrowseDblClick( xDlg, xControl, workarea, cField, @xValue )
      HEADERS aHeaderList
      WIDTHS aWidthList
      WORKAREA ( workarea )
      FIELDS aFieldList


#xcommand BROWSESYNC => _HMG_BrowseSyncStatus := .T.
      BROWSESYNC


   END BROWSE
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

Gerador/criação de telas/executor

Mensagem por JoséQuintas »

Curiosidade sobre como cheguei na solução acima:

Coloquei as duas sintaxes no fonte PRG:

Código: Selecionar todos

  DEFINE BROWSE ( xControl )
      PARENT ( xDlg )
      ROW nRow
      COL nCol
      WIDTH nWidth - 20
      HEIGHT nHeight - 20
      ONDBLCLICK gui_BrowseDblClick( xDlg, xControl, workarea, cField, @xValue )
      HEADERS aHeaderList
      WIDTHS aWidthList
      WORKAREA ( workarea )
      FIELDS aFieldList
   END BROWSE

   @ nRow, nCol GRID ( xControl ) ;
      OF ( xDlg ) ;
      WIDTH nWidth - 20 ;
      HEIGHT nHeight - 20 ;
      ON DBLCLICK gui_BrowseDblClick( xDlg, xControl, workarea, cField, @xValue ) ;
      HEADERS aHeaderList ;
      WIDTHS aWidthList ;
      ROWSOURCE ( workarea ) ;
      COLUMNFIELDS aFieldList
compilei com -p pra gerar o PPO
PPO parcial

Código: Selecionar todos

   _HMG_SYSDATA[89] := .F. ; _DefineBrowse ( _HMG_SYSDATA[316]

   _HMG_SYSDATA[250][1] := .T. ; _DefineBrowse ( ( xControl )
Não quis nem saber do resto, reparei o _defineBrowse() dos dois

E aí procurei esse [250]

Código: Selecionar todos

#xtranslate _HMG_aBrowseSyncStatus		=> _HMG_SYSDATA\[250]
#xtranslate _HMG_BrowseSyncStatus		=> _HMG_aBrowseSyncStatus\[1]
#xtranslate _HMG_BrowseUpdateStatus		=> _HMG_aBrowseSyncStatus\[2]
Tem um GRID em I_GRID.CH mas não serve

Só hoje achei o outro GRID, em I_HMG_COMPAT.CH:

Código: Selecionar todos

#xcommand @ <row>, <col> GRID <name> ;
...
      _HMG_BrowseSyncStatus := .T. ;;
      @ <row>, <col> BROWSE <name> ;
...
E achei em I_BROWSE.CH

Código: Selecionar todos

#xcommand SET BROWSESYNC <x:ON,OFF> => _HMG_BrowseSyncStatus := ( Upper(<(x)>) == "ON" )
Parece uma zona isso dos CHs de aceitarem várias sintaxes... mas fazer o que? tá mantendo compatibilidade entre versões de minigui, aproveitando fontes anteriores, etc.

HWGUI não tem isso... é.... mas... de vez em quando acontece de ter que mudar os fontes pra ficar compatível com nova versão.

Pois é... em tudo tem vantagem e desvantagem...

Talvez o ideal mesmo seja criar funções intermediárias, igual o DLGAUTO faz.
Não importa a sintaxe, o fonte tá sempre igual, as diferenças estão em LIB_HMGE.PRG, LIB_HWGUI.PRG, LIB_HMG3.PRG, LIB_OOHG.PRG

Agora que encontrei esse SET BROWSESYNC ON, altero lá o LIB_HMGE.PRG e removo meu quebra-galho anterior.
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/
ivanil
Usuário Nível 3
Usuário Nível 3
Mensagens: 166
Registrado em: 11 Set 2004 15:13
Localização: Florianópolis/SC

Gerador/criação de telas/executor

Mensagem por ivanil »

Ola Quintas;


Na verdade, o que ocorre é que você esta desbravando o código sem olhar o manual;
o value do browse devolve o recno() do DBF; então em sua função DBclick, teria que ter um DbGoto();
Por padrão, acredito que fica desligado o sincronismo por conta de desempenho, quando a base cresce na rede, o browse demonstra baixa perfomance, há colegas que passaram a usar o TBrowse, sugiro dar uma olhada nele, um objeto altamente parametrizável, rápido, mas acabou se tornando complexo lembra muito o nosso velho tbrowse do clipper ;

Abaixo um código simulando o problema que enfrentou.

Código: Selecionar todos

#include <hmg.ch>
Function Main(  )
    local aMat:={{"codigo","N",5,0},{"descricao","c",100,0}},i
    DbCreate("test",aMat)
    use test
    for i=1 to 1000
        test->(DbAppend())
        Test->Codigo:=i
        test->descricao:="Testando "+Strzero(i,5)
    Next
    Test->(DbGotop())

    DEFINE WINDOW Main AT 265, 980 WIDTH 572 HEIGHT 371  TITLE "" MAIN on release test->(DbCloseArea())

        DEFINE TOOLBAREX Toolbar_1 BUTTONSIZE  40, 45 FONT 'Candara Light' SIZE   7 FLAT  WRAP  BORDER  CUSTOMIZE  MIXEDBUTTONS
            BUTTON Toolbar_1Button1 CAPTION "close" PICTURE "Hbprint_close" SEPARATOR  AUTOSIZE
            BUTTON Toolbar_1Button2 CAPTION "Go Top" PICTURE "Edit_gotop" ACTION (Test->(DbGotop()),Main.oBrowse1.value:=Test->(Recno())) AUTOSIZE
            BUTTON Toolbar_1Button3 CAPTION "Previous" PICTURE "Edit_previous" ACTION (Test->(DbSkip(-1)),IIF(Test->(Bof()),Test->(DbGotop()),Nil),Main.oBrowse1.value:=Test->(Recno())) AUTOSIZE
            BUTTON Toolbar_1Button4 CAPTION "Next" PICTURE "Edit_next" ACTION (Test->(DbSkip(1)),IIF(Test->(eof()),Test->(DbGobottom()),Nil),Main.oBrowse1.value:=Test->(Recno())) AUTOSIZE
            BUTTON Toolbar_1Button5 CAPTION "Bottom" PICTURE "Edit_gobottom" ACTION (Test->(DbGobottom()),Main.oBrowse1.value:=Test->(Recno())) AUTOSIZE
        END TOOLBAR

        DEFINE BROWSE oBrowse1
            FIELDS { "codigo" , "descricao" }
            HEADERS { "Código" , "Descrição" }
            JUSTIFY { 1 , 0 }
            WIDTHS { 150 , 250 }
            WORKAREA "test"
            VSCROLLBAR .T.
            COL 13
            HEIGHT 179
            ROW 69
            VALUE 0
            WIDTH 529
            OnDblClick (Test->(DbGoto(Main.oBrowse1.value)),Main.oText1.value := Test->Codigo,Main.oText2.value := Test->Descricao)
        END BROWSE
    
        DEFINE LABEL oLabel1
            VALUE "Código:"
            RIGHTALIGN .T.
            VCENTERALIGN .T.
            COL 23
            HEIGHT 20
            ROW 261
            WIDTH 100
        END LABEL

        DEFINE LABEL oLabel2
            VALUE "Descrição:"
            RIGHTALIGN .T.
            VCENTERALIGN .T.
            COL 23
            HEIGHT 20
            ROW 293
            WIDTH 100
        END LABEL

        DEFINE TEXTBOX oText1
            NUMERIC .T.
            READONLY .T.
            COL 134
            HEIGHT 20
            ROW 261
            WIDTH 100
        END TEXTBOX

        DEFINE TEXTBOX oText2
            READONLY .T.
            COL 134
            HEIGHT 20
            MAXLENGTH 100.00
            ROW 293
            WIDTH 404
        END TEXTBOX

    END WINDOW
    Main.Center
    Main.activate()
    REturn .T.

Anexos
2024-01-23_211246.png
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Gerador/criação de telas/executor

Mensagem por JoséQuintas »

ivanil escreveu:Na verdade, o que ocorre é que você esta desbravando o código sem olhar o manual;
o value do browse devolve o recno() do DBF; então em sua função DBclick, teria que ter um DbGoto();
Por padrão, acredito que fica desligado o sincronismo por conta de desempenho, quando a base cresce na rede, o browse demonstra baixa perfomance, há colegas que passaram a usar o TBrowse, sugiro dar uma olhada nele, um objeto altamente parametrizável, rápido, mas acabou se tornando complexo lembra muito o nosso velho tbrowse do clipper ;
Manual: olhava, testava, não funcionava
Exemplos: olhava, qualquer algo mais não funcionava

O próprio @GRID, tem duas versões na HMG Extended, uma usando GRID mesmo, e outra usando BROWSE.
Com certeza isso não tem no manual.

Eventualmente tento encontrar alguma coisa, mas ao contrário do que parece, acaba parecendo mais lixo do que ajuda.

Eu realmente acedito que o DLGAUTO pode ajudar muito mais do que a maioria dos exemplos ou manuais, poderia se tornar a referência aos comandos.
É olhar gui_browse() pra ver como se usa o browse, é olhar gui_label() pra ver como se usa o label, é olhar gui_textbox() pra ver como se usa o textbox.
É executar, pra ver tudo funcionando em conjunto.
É criar DBFs diferentes, pra ver funcionando com DBFs próprios, ou DBFs diferentes.

Recursos a mais?
Acho que todos vão querer o básico funcionando primeiro, antes de fazer algo mais.

Pelo que podemos ver, esse básico ainda está incompleto.

Vou anotar essa opção no próprio browse() do DLGAUTO.
Não serve pra ADO, mas tudo bem, por enquanto é DBF.
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

Gerador/criação de telas/executor

Mensagem por JoséQuintas »

Olhe que incrível o DLGAUTO

Código: Selecionar todos

FUNCTION gui_BrowseDblClick( xDlg, xControl, workarea, cField, xValue )

   IF ! Empty( cField )
      // without SET BROWSESYNC ON
      // &(workarea)->( dbGoto( GetProperty( xDlg, xControl, "VALUE" ) ) )
      xValue := &(workarea)->( FieldGet( FieldNum( cField ) ) )
   ENDIF
   (xControl)
   DoMethod( xDlg, "RELEASE" )

   RETURN Nil
Agora tem essa opção alternativa que mostrou.
É praticamente um manual de como usar o browse.

Nota:
Os parâmetros do click são a DIALOG, o BROWSE, o ALIAS, o nome do campo (FIELD), e o resultado vai ficar em XVALUE.
Aonde vai ser usado o valor.... isso não faz parte do browse, pelo menos nessa rotina genérica.
Mas poderia ser um codeblock adicional passado por parâmetro, o que resolveria muitas outras situações.
Nota2:
Tem function equivalente pra hwgui, hmg3 e oohg
Não dá pra pensar em eliminar essa rotina pra economizar fonte, se não puder fazer a mesma coisa em todas.
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

Gerador/criação de telas/executor

Mensagem por JoséQuintas »

Tô fazendo igual minigui kkkkk

Mais campos no array
Tabela master não precisa, porque vai ser a tabela atual

Código: Selecionar todos

#define CFG_BTABLE    19                    // browse table
#define CFG_BKEYFROM  20                    // browse field from main
#define CFG_BKEYTO    21                    // browse field to
#define CFG_BKEYTO2   22                    // browse field2 to
#define CFG_BVALUE    23                    // browse key value
#define CFG_BEDIT     24                    // can edit browse values
elemento vazio aumentou

Código: Selecionar todos

#define CFG_EMPTY { "", "C", 1, 0, .F., "", "", .T., "", "", "", Nil, 0, TYPE_EDIT, Nil, Nil, Nil, Nil, Nil, Nil, Nil, Nil, Nil, Nil }
índice na lista

Código: Selecionar todos

   /* table, key */
   aKeyList := { ;
      { "DBCLIENT",    "IDCLIENT" }, ;
      { "DBPRODUCT",   "IDPRODUCT" }, ;
      { "DBUNIT",      "IDUNIT" }, ;
      { "DBSELLER",    "IDSELLER" }, ;
      { "DBBANK",      "IDBANK" }, ;
      { "DBGROUP",     "IDGROUP" }, ;
      { "DBSTOCK",     "IDSTOCK" }, ;
      { "DBFINANC",    "IDFINANC" }, ;
      { "DBSTATE",     "IDSTATE" }, ;
      { "DBTICKET",    "IDTICKET" }, ;
      { "DBTICKETPRO", "Str( TPTICKET,10 ) + Str( IDTICKETPRO, 10 )" } }
configuração do browse

Código: Selecionar todos

   /* Related browse */
   aBrowseList := { ;
      { "DBTICKET", "IDTICKET", "DBTICKETPROD", "TPTICKET", "IDTICKEDPROD" } }
por enquanto apenas um filtro, pro browse não ser considerado campo de arquivo

Código: Selecionar todos

   FOR EACH aItem IN ::aEditList
      IF aItem[ CFG_CTLTYPE ] != Nil .AND. aItem[ CFG_CTLTYPE ] != TYPE_BROWSE
         aItem[ CFG_VALUE ]    := &( ::cFileDbf )->( FieldGet( FieldNum( aItem[ CFG_FNAME ] ) ) )
      ENDIF
      AAdd( ::aControlList, AClone( aItem ) )
   NEXT
É apenas a preparação pra adicionar browse.
Ainda nem sei se vai dar certo, e vai ficar limitado a campos numéricos.
A princípio, não limitado a um único browse por tabela, pode ser editado ou não.
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

Gerador/criação de telas/executor

Mensagem por JoséQuintas »

browse3.png
Yes.
Começou a dar sinal de vida.
Era ALIAS
Agora ajustar posição, porque tá errada, está cobrindo os outros campos.

É o "pedidos", mostrando os produtos do pedido (DBTICKET mostrando DBTICKETPRO).
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

Gerador/criação de telas/executor

Mensagem por JoséQuintas »

browse.png
Primeiros testes quase lá.
Deveriam aparecer ticketpro 1 e 2, produto 1 e 2.

Ainda não atualiza navegação.
Mostra igual no ticket 2, mas deveria mostrar ticketpro 3 e 4, produtos 3 e 4.

Este último ok, ainda falta colocar atualização do SET SCOPE.
Mas o anterior deveria estar funcionando.
Talvez ALIAS e o browse fazendo SKIP na área errada.
ticketpro.png
Acima ticketpro completo (os produtos), visto pelo próprio dlgauto
Cada ticket tem dois produtos, mas um é diferente do outro.
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

Gerador/criação de telas/executor

Mensagem por JoséQuintas »

hmge.png
Em HMG Extended funcionou direito, apenas a altura ficou pequena.

Interessante que precisei alterar a rotina de browse de TODAS pra incluir o ALIAS.
Não deu problema antes porque.... sei lá... era browse em alias diferente também.
Será bug em hwgui ? sei lá... cedo pra conclusões.

Muito interessante isso.
Coloquei um browse e já está rodando em todas as LIBs !!!, apesar das falhas
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

Gerador/criação de telas/executor

Mensagem por JoséQuintas »

hwgui.png
Uia, certinho agora na hwgui.

Diferença entre HWGUI e HMG Extended: defini o mesmo tamanho em pixels nas duas pra altura do browse.
Numa cabe 1 na outra cabem 2.
A idéia eram caber 10, mas tudo bem, de volta aos cálculos.... rs
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

Gerador/criação de telas/executor

Mensagem por JoséQuintas »

hwgui.png
hmge.png
hmg3.png
oohg.png
HWGUI, HMG Extended, HMG3 e OOHG, todas funcionando.

Em HWGUI e HMG Extended precisei acertar sobre ALIAS, nas outras não.

Qual é melhor ?

Todas estão fazendo o que deveriam fazer.
Todas partem do mesmo fonte principal e mesmo estilo de programação.
Com OOP, sem OOP, não faz diferença.

Eu começo meus testes sempre com hwgui, só pode ser porque simpatizei mais com ela.
Por várias vezes só resolvi hwgui depois de confirmar o que acontecia com HMG Extended, e vice-versa.
HMG3 e OOHG apenas vão acompanhando, geralmente com mesma solução.

Não dá pra definir se tem alguma melhor.
O que dá pra dizer é que tenho recebido ajuda de hwgui e hmg extended, isso é importante.
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

Gerador/criação de telas/executor

Mensagem por JoséQuintas »

Produtos dos tickets.
No ticket 1 tem produtos 1 e 2, no ticket 2 tem produtos 3 e 4
prod.png

tela no primeiro, ticket 1
pro1.png

tela no segundo, ticket 2
pro2.png

Ainda falta cálculos pra ver se o browse cabe na tela atual, e até mesmo para o caso de ter mais de um browse relacionado.
Também vai ser interessante no browse trazer a descrição dos produtos.
Devagarzinho tá andando, mas sempre pra telas ilimitadas.
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

Gerador/criação de telas/executor

Mensagem por JoséQuintas »

Foi a idéia que me veio à cabeça, por enquanto HWGUI.
Passar ao browse uma lista de teclas e rotinas a serem acionadas.
A default é a que já existia para o ENTER.

Código: Selecionar todos

FUNCTION gui_Browse( xDlg, xControl, nRow, nCol, nWidth, nHeight, oTbrowse, cField, xValue, workarea, aBlockList )

   LOCAL aItem

   IF ValType( aBlockList ) != "A"
      aBlockList := { { VK_RETURN, { || gui_BrowseEnter( cField, @xValue, xDlg ) } } }
   ENDIF

   @ nCol, nRow BROWSE xControl DATABASE SIZE nWidth, nHeight STYLE WS_BORDER + WS_VSCROLL + WS_HSCROLL
   // may be not current alias
   xControl:Alias := workarea

   FOR EACH aItem IN oTBrowse
      ADD COLUMN { || Transform( &(workarea)->( FieldGet( FieldNum( aItem[2] ) ) ), aItem[3] ) } TO xControl ;
         HEADER aItem[1] ;
         LENGTH Max( Len( aItem[1] ), Len( Transform( &(workarea)->( FieldGet( FieldNum( aItem[2] ) ) ), aItem[3] ) ) ) ;
         JUSTIFY LINE DT_LEFT
   NEXT

   xControl:bOther := { |xControl, msg, wParam, lParam| gui_BrowseKeyDown( xControl, msg, wParam, lParam, cField, @xValue, aBlockList, xDlg ) }

   (xDlg); (workarea)

   RETURN Nil

STATIC FUNCTION gui_BrowseEnter( cField, xValue, xDlg )

   IF ! Empty( cField )
      xValue := FieldGet( FieldNum( cField ) )
   ENDIF
   hwg_EndDialog()
   (xDlg)

   RETURN Nil

STATIC FUNCTION gui_BrowseKeyDown( xControl, msg, wParam, lParam, cField, xValue, aBlockList, xDlg )

   LOCAL nKey, nPos

   IF msg == WM_KEYDOWN
      nKey := hwg_PtrToUlong( wParam )
      nPos := hb_AScan( aBlockList, { | e | nKey == e[ 1 ] } )
      IF nPos != 0
         Eval( aBlockList[ nPos ][ 2 ], cField, @xValue, xDlg )
      ENDIF
      // IF nKey = VK_RETURN
      //   IF ! Empty( cField )
      //      xValue := FieldGet( FieldNum( cField, xValue ) )
      //   ENDIF
      //   hwg_EndDialog()
      //ENDIF
   ENDIF
   (xControl)
   (lParam)

   RETURN .T.
No browse interno, vai precisar de INSERT pra incluir, DELETE pra excluir e ENTER pra alterar, caso seja um browse com conteúdo que vai poder ser alterado.

BlockList não ficou legal, dá a impressão de que é pra bloquear, e não codeblock.
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