Página 3 de 11

Gerador/criação de telas/executor

Enviado: 17 Ago 2023 07:46
por Itamar M. Lins Jr.
Olá!
depende de alguém que mexa, não adianta fontes se não souber mexer.
Sempre aparece alguém.
Vai depender da evolução das outras linguagens. As pessoas não são bestas, se a linguagem A for melhor que B para quê mexer em coisas ultrapassadas ?
Veja que o "povo" não quer saber da xIDE que a meu ver é melhor investir tempo nela o pessoal está de olho no "SQLRDD".
Tem mais a RUSHMORE para DBF entre outras coisas...

Saudações,
Itamar M. Lins Jr.

Gerador/criação de telas/executor

Enviado: 17 Ago 2023 12:34
por JoséQuintas
Mais uma vantagem do jeito que estou fazendo.
Para a borda FLAT do label, Kresin sugeriu usar o BOARD, e disse que também atende Linux.
Só alterei a função de label.

Código: Selecionar todos

FUNCTION gui_CreateLabel( xDlg, xControl, nRow, nCol, nWidth, nHeight, xValue, lBorder )

   (xDlg)
   (lBorder)
   @ nCol, nRow BOARD xControl SIZE nWidth, nHeight ON PAINT { | o, h | LabelPaint( o, h, lBorder ) }
   xControl:Title := xValue

   RETURN Nil

FUNCTION LabelPaint( o, h, lBorder )

   IF o:oFont != Nil
      hwg_SelectObject( h, o:oFont:Handle )
   ENDIF
   IF o:TColor != Nil
      hwg_SetTextColor( h, o:TColor )
   ENDIF
   IF ! Empty( lBorder ) .AND. lBorder
      hwg_Rectangle( h, 0, 0, o:nWidth - 1, o:nHeight - 1 )
   ENDIF
   hwg_SetTransparentMode( h, .T. )
   hwg_DrawText( h, o:Title, 2, 2, o:nWidth - 2, o:nHeight - 2 )
   hwg_SetTransparentMode( h, .F. )

   RETURN Nil

Gerador/criação de telas/executor

Enviado: 18 Ago 2023 15:22
por JoséQuintas
Então....
O gerador é como testar um aplicativo sem ter aplicativo.
Quando o gerador funcionar o aplicativo também funciona.

No momento hwgui parou.

- GET de texto com validação dando problema
- BROWSE dando problema, é problema anterior ao GET, talvez até antigo

Se fosse aplicativo, seria abandonar hwgui.
Como é o gerador e é pra testes, é aguardar.
É chato isso, mas é a realidade.

Gerador/criação de telas/executor

Enviado: 18 Ago 2023 17:57
por JoséQuintas
UIA QUE COISA DOIDA BOA DE VER !!!!!!

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()
   ENDIF
   FOR EACH aItem IN oTbrowse
      AAdd( aHeaderList, aItem[1] )
      AAdd( aFieldList, aItem[3] )
      AAdd( aWidthList, Len( Transform(FieldGet(FieldNum(aItem[3])),"")) * 10 )
   NEXT
   @ nRow, nCol BROWSE ( xControl ) ;
      OF ( xDlg ) ;
      WIDTH nWidth ;
      HEIGHT nHeight ;
      HEADERS aHeaderList ;
      WIDTHS aWidthList ;
      WORKAREA ( workarea ) ;
      FIELDS aFieldList

   (cField);(xValue)

   RETURN Nil
Na tela de clientes, o browse de clientes
tela1.png
NO campo UF, browse de uf
tela2.png
No campo de vendedor, browse de vendedor
tela3.png
No campo de portador, o browse de portador
tela4.png
Parece que eu já tinha mostrado isto, mas não.
Antes era HWGUI.
Agora é HMG Extended.

Eu mesmo que criei o troço e estou ficando espantado com os resultados.

Tá tudo fraco, tudo principiante, tudo faltando cores, visuais, etc. e faltando até funcionar direito.
Mas tá sempre parecendo pronto, parecendo cada vez mais pronto.

Nota:
Ainda bem que coloquei pesquisa nessa UF, é o único campo de pesquisa caractere.
Foi nele que hwgui deu problema após alterações.
Uma grande coincidência apenas.

E vamos prosseguindo.

Gerador/criação de telas/executor

Enviado: 18 Ago 2023 18:02
por JoséQuintas
Pra isso funcionar, tem a validação que aciona o browse:

Código: Selecionar todos

/*
frm_Validate - Validate each field
*/

#include "frm_class.ch"

FUNCTION frm_Validate( aItem, Self )

   LOCAL nSelect, lFound := .T., xValue, nPos

   nPos := hb_AScan( ::aControlList, { | e | e[ CFG_CTLTYPE ] == TYPE_BUTTON .AND. ;
      e[ CFG_CAPTION ] == "Cancel" } )
   IF nPos != 0
      IF gui_IsCurrentFocus( ::oDlg, ::aControlList[ nPos, CFG_FCONTROL ] )
         RETURN .T.
      ENDIF
   ENDIF

   xValue := gui_GetTextValue( ::oDlg, aItem[ CFG_FCONTROL ] )
   IF aItem[ CFG_ISKEY ]
      SEEK xValue
      IF ::cSelected == "INSERT"
         IF ! Eof()
            gui_MsgGeneric( "Código já cadastrado" )
            gui_SetFocus( ::oDlg, aItem[ CFG_FCONTROL ] ) // minigui need this
            RETURN .F.
         ENDIF
      ELSE
         IF Eof()
            gui_MsgGeneric( "Código não cadastrado" )
            gui_SetFocus( ::oDlg, aItem[ CFG_FCONTROL ] ) // minigui need this
            RETURN .F.
         ENDIF
      ENDIF
   ENDIF
   IF ! Empty( aItem[ CFG_VTABLE ] )
      nSelect := Select()
      SELECT ( Select( aItem[ CFG_VTABLE ] ) )
      SEEK xValue
      lFound := ! Eof()
      xValue := FieldGet( FieldNum( aItem[ CFG_VSHOW ] ) )
      SELECT ( nSelect )
      IF ! lFound
         frm_Browse( Self, ::oDlg, @aItem[ CFG_FCONTROL ], aItem[ CFG_VTABLE ] )
         gui_SetFocus( ::oDlg, aItem[ CFG_FCONTROL ] ) // minigui need this
      ENDIF
      gui_SetLabelValue( ::oDlg, aItem[ CFG_VCONTROL ], xValue )
   ENDIF

   RETURN lFound
E a rotina de browse

Código: Selecionar todos

/*
frm_browse - browse
*/

#include "frm_class.ch"

FUNCTION frm_Browse( Self, xDlg, xControl, cTable )

   LOCAL oTBrowse := {}, aItem, xValue, cField, nSelect, nPos

   nSelect := Select()
   SELECT ( cTable )

   nPos := hb_Ascan( ::aAllSetup, { | e | e[1] == cTable } )
   FOR EACH aItem IN ::aAllSetup[ nPos, 2 ]
      AAdd( oTBrowse, { ;
         aItem[ CFG_CAPTION ], ;
         { || Transform( FieldGet( FieldNum( aItem[ CFG_FNAME ] ) ), aItem[ CFG_FPICTURE ] ) }, ;
          aItem[ CFG_FNAME ] } ) // hwgui codeblock, minigui field name
      IF aItem[ CFG_ISKEY ]
         cField := aItem[ CFG_FNAME ]
      ENDIF
   NEXT

   DialogBrowse( oTBrowse, cTable, cField, @xValue )

   IF ! Empty( xValue ) .AND. ! Empty( xControl )
      //hwg_MsgInfo( "variable is " + Transform( xValue, "" ) )
      gui_SetTextValue( xDlg, xControl, xValue )
   ENDIF

   SELECT ( nSelect )
   (xDlg)

   RETURN Nil

FUNCTION DialogBrowse( oTBrowse, cTable, cField, xValue )

   LOCAL oThisForm, aItem

   oThisForm := frm_Class():New()
   oThisForm:cOptions := ""
   gui_CreateDialog( @oThisForm:oDlg, 0, 0, oThisForm:nDlgWidth, oThisForm:nDlgHeight, cTable, { || Nil }, ;
      { || aItem[ CFG_FCONTROL ]:SetFocus() } )
   frm_Buttons( oThisForm, .F. )
   AAdd( oThisForm:aControlList, CFG_EMPTY )
   aItem := Atail( oThisForm:aControlList )
   aItem[ CFG_CTLTYPE ] := TYPE_BROWSE

   gui_Browse( oThisForm:oDlg, @aItem[ CFG_FCONTROL ], 70, 5, ;
      oThisForm:nDlgWidth - 10, oThisForm:nDlgHeight - 80, ;
      oTbrowse, cField, @xValue, cTable )

   gui_ActivateDialog( oThisForm:oDlg )

   RETURN Nil
Os fontes nem sabem qual é a LIB em uso.
Tá muito doido isso, e tá funcionando !!!

Só separei as LIBs desse jeito porque o fonte estava ficando mais complicado do que já é, com fonte de tudo que é LIB.
O resultado é esse que estão vendo: um "aplicativo" que funciona com qualquer LIB.
Apenas estou fazendo conforme vou precisando, o último adicionado foi o browse, primeiro hwgui e agora HMG.

Gerador/criação de telas/executor

Enviado: 18 Ago 2023 18:17
por JoséQuintas
oohg.png
Uia OOHG serviu o mesmo fonte de HMG Extended.
Ainda não resolvi o problema dos ícones na OOHG, não aceitou o mesmo de HMG.

Gerador/criação de telas/executor

Enviado: 18 Ago 2023 18:54
por JoséQuintas
button.png
TEXTALIGNV BOTTOM levou pra baixo
TEXTALIGNH CENTER não centralizou

Perguntei lá em OOHG.

Gerador/criação de telas/executor

Enviado: 18 Ago 2023 19:00
por JoséQuintas
oohg.png
Como pude deixar passar:

IMAGEALIGN TOP

Nem precisa do outro do texto.
Pra que será que serve dizer que o texto é embaixo, se obrigatoriamente precisa dizer que o ícone é encima?
Sei lá... pelo menos tá resolvido.

Gerador/criação de telas/executor

Enviado: 20 Ago 2023 03:21
por JoséQuintas
tab.png
Agora também cria TAB em HMG Extended.
Falta criar com muitos campos pra verificar necessidades da navegação.

Só pra curiosidade:

Código: Selecionar todos

FUNCTION gui_CreateTab( xDlg, xControl, nRow, nCol, nWidth, nHeight )

   @ nCol, nRow TAB xControl ;
      ITEMS {} ;
      OF    xDlg ;
      ID    101 ;
      SIZE  nWidth, nHeight ;
      STYLE WS_CHILD + WS_VISIBLE

   RETURN Nil

FUNCTION gui_TabEnd()

   RETURN Nil

Código: Selecionar todos

FUNCTION gui_CreateTab( xDlg, xControl, nRow, nCol, nWidth, nHeight )

   IF Empty( xControl )
      xControl := gui_newctlname( "TAB" )
   ENDIF
   DEFINE TAB ( xControl ) ;
      PARENT ( xDlg ) ;
      AT nRow, nCol;
      WIDTH nWidth ;
      HEIGHT nHeight

   RETURN Nil

FUNCTION gui_TabEnd()

   END TAB

   RETURN Nil
Em HMG Extended obrigatório colocar as coisas entre criação e end, em hwgui não precisa.
Então... uma função vazia em hwgui só pra atender a chamada de função.

Em OOHG nada feito, aceitou o fonte HMGE mas nada de TAB.

Gerador/criação de telas/executor

Enviado: 20 Ago 2023 23:41
por JoséQuintas
gtwvg.png
Uia, mais outra LIB GUI

Código: Selecionar todos

FUNCTION gui_CreateButton( xDlg, xControl, nRow, nCol, nWidth, nHeight, cCaption, cResName, bAction )

   ( xDlg );(xControl);(nRow);(nCol);(nWidth);(nHeight);(cCaption);(cResName);(bAction)
   xControl := wvgPushButton():New()
   WITH OBJECT xControl
      :PointerFocus := .F.
      :Style += BS_TOP
      :Create( xDlg,,{nCol,nRow},{nHeight,nWidth})
      :SetCaption( {, WVG_IMAGE_ICONRESOURCE, cResName } )
      :SetCaption( cCaption )
   ENDWITH

   RETURN Nil
GTWVG.
Usando mesmas coordenadas de PIXEL das outras LIBs.
Aprendendo essa também.

Gerador/criação de telas/executor

Enviado: 21 Ago 2023 01:15
por JoséQuintas
text.png

Código: Selecionar todos

FUNCTION gui_CreateLabel( xDlg, xControl, nRow, nCol, nWidth, nHeight, xValue, lBorder )

   (xDlg);(xControl);(nRow);(nCol);(nWidth);(nHeight);(xValue);(lBorder)
   xControl := wvgStatic():New()
   WITH OBJECT xControl
      :Type := WVGSTATIC_TYPE_TEXT
      :Options := WVGSTATIC_TEXT_LEFT
      :Style += iif( lBorder, WS_BORDER, 0 )
      :SetColorFG( "W/B" )
      :SetColorBG( "W/B" )
      :Caption := xValue
      :SetFont( "Arial" )
      :Create(xDlg,,{nCol,nRow},{nWidth,nHeight})
   ENDWITH

   RETURN Nil
Agora com label, coordenadas GUI em pixels de sempre
Pra borda, só passar o STYLE WS_BORDER, mas aqui funciona direito.
Pra cores, pode ser RGB, mas pra teste vai tabela Clipper mesmo

Gerador/criação de telas/executor

Enviado: 21 Ago 2023 01:50
por JoséQuintas
wvg.png

Código: Selecionar todos

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

   (xDlg);(xControl);(nRow);(nCol);(nWidth);(nHeight);(xValue);(cPicture);(nMaxLength);(bValid)
   xControl := wvgSle():New()
   WITH OBJECT xControl
      :Create( xDlg,,{nCol,nRow},{nWidth,nHeight})
      :SetData( Transform( xValue, "" ) )
   ENDWITH

   RETURN Nil
Agora com textbox, coordenadas pixel, etc.

Essa é mais outra parte que nunca usei da GTWVG.
NADA de @ SAY/@ GET
NADA de save screen/restore screen
NADA de linha/coluna

Uma nova... velha... LIB GUI.

Gerador/criação de telas/executor

Enviado: 21 Ago 2023 10:42
por JoséQuintas
dlgauto.png
De um modo geral, o que é de cada lib está no arquivo lib_xxxx.prg
Nos demais fontes, ainda pode ter alguma coisa de LIB, porque sempre tem alguma exceção.

Dá pra compilar com:

- HWGUI
- HMG Extended
- OOHG
- GTWVG

Um playground legal.
Só criar lib_xxxx pra outras LIBs, ou pra testes alternativos.

Porque tanta lib?
Se dá pra testar com todas, porque não ?
É como testar o aplicativo com cada lib, sem mexer no aplicativo.

Gerador/criação de telas/executor

Enviado: 24 Ago 2023 01:52
por JoséQuintas
Alteração de hoje:

Código: Selecionar todos

FUNCTION gui_IsCurrentFocus( xDlg, xControl )

      RETURN _GetFocusedControl( xDlg ) == xControl
Pra poder abortar a validação no caso de clicar em cancel, em HMGE.
Ainda sem solução pra OOHG.

Gerador/criação de telas/executor

Enviado: 25 Ago 2023 09:28
por JoséQuintas
Mudança de hoje:

Por enquanto nenhuma.
Apenas HWGUI deixou de funcionar a atualização de label.
Se fosse aplicativo, seria um grande problema.
É consultar o financeiro e mostrar cliente errado, consultar estoque e mostrar produto errado, essas coisas que acabariam com o uso do aplicativo.

Como esperado, a mudança da hwgui está sendo meio radical, e tudo pode acontecer.
hwgui2.png
Sem :refresh() o texto não atualiza.
Com :refresh(), sai tudo rebatido.

Situação de hoje NO GERADOR:

GTWVG - sem chance, não sei mexer
OOHG - aguardando resposta de suporte, e pendências minhas
HWGUI - pendências na hwgui, na biblioteca
HMG Extended - funcionando, pendências minhas
Gerador - tá funcionando, pendência incluir código específico sem ser incremental