Página 2 de 3

Criação de telas

Enviado: 06 Jul 2023 18:52
por JoséQuintas
Uma coisa que falta aí:

Na edição:
Como mudar automaticamente o foco pra segunda tab quando terminar a primeira ?
Ou... como mudar automaticamente o foco pro button SAVE ?
Ou.... como mudar qualquer foco pra qualquer lugar, já que sem isso, GUI fica sem sentido, e fica pior que console ?

Criação de telas

Enviado: 06 Jul 2023 19:19
por Itamar M. Lins Jr.
Ola!
INIT DIALOG oDlg CLIPPER

Esse CLIPPER ativa pular dos get's com ENTER.
O FOCO já expliquei em outro lugar deve ter esquecido

Código: Selecionar todos

oBotaoX:Handle = hwg_GetFocus() //Tem focus
oBj:SetFocus() //coloca focus

oObj := oDlg:findcontrol(,hwg_Getfocus())

cObjNome := upper(oObj:OBJNAME)

IF cObjNome == "OBRW"
Saudações,
Itamar M. Lins Jr.

Criação de telas

Enviado: 06 Jul 2023 19:27
por JoséQuintas
Se isso já tem, então com certeza não é isso.
Não me referi de um campo pra outro, e sim de tab pra outra.

Código: Selecionar todos

   INIT DIALOG ::oDlg CLIPPER NOEXIT TITLE ::cTitle ;
      AT 0, 0 SIZE ::nDlgWidth, ::nDlgHeight ;
      BACKCOLOR STYLE_BACK ;
      ON EXIT hwg_EndDialog() ;
      ON INIT { || ::EditUpdate() }
Ou simplesmente trocar de tab, e não se vê nenhum get ativo
Ou o foco no button, e não conseguir voltar de jeito nenhum nos gets
E por aí vai.

Normalmente num programa windows seria o TABSTOP, mas não encontrei isso na hwgui e nem mesmo na minigui, só mesmo wvg kkkk
tabstop.png

Criação de telas

Enviado: 06 Jul 2023 21:05
por Itamar M. Lins Jr.
Olá!

Código: Selecionar todos

IF oDlg:oTab:GetActivePage() = 3 //estou na tab 3
Deve ter setActivePage...

Saudações,
Itamar M. Lins Jr.

Criação de telas

Enviado: 06 Jul 2023 21:13
por Itamar M. Lins Jr.
Olá!

Código: Selecionar todos

     oTab:ChangePage(1)
     oTab:ShowPage(1)
Saudações,
Itamar M. Lins Jr.

Criação de telas

Enviado: 06 Jul 2023 21:53
por JoséQuintas
já tinha visto isso pelo fonte. A questão agora é AONDE colocar pra fazer a mudança funcionar.
Deveria ser tudo automático, mas não é.

Criação de telas

Enviado: 06 Jul 2023 22:47
por Itamar M. Lins Jr.
Olá!

Código: Selecionar todos

   oEdit:bLostFocus := { || oTab:ChangePage( nPageNext ), oTab:ShowPage(nPageNext), oEditNext:SetFocus(), .T. }
Saudações,
Itamar M. Lins Jr.

Criação de telas

Enviado: 07 Jul 2023 17:17
por JoséQuintas

Criação de telas

Enviado: 15 Jul 2023 07:22
por JoséQuintas
Estou alterando pra criação de aplicativo ao invés de somente telas avulsas.

Criei o menu básico...

Código: Selecionar todos

#include "hbgtinfo.ch"
#include "hwgui.ch"
#include "directry.ch"

FUNCTION DlgAutoMenu()

   LOCAL oDlg, aDBFList, aItem

   aDBFList := Directory( "*.dbf" )

   INIT DIALOG oDlg NOEXIT TITLE "Example" ;
     AT 200,0 SIZE 400,150

   MENU OF oDlg
      MENU TITLE "Exit"
         MENUITEM "&Exit" ACTION oDlg:Close()
      ENDMENU
      MENU TITLE "Data"
         FOR EACH aItem IN aDBFList
            MENUITEM hb_FNameName( aItem[ F_NAME ] ) ACTION DlgAutoDat( hb_FNameName( aItem[ F_NAME ] ) )
         NEXT
      ENDMENU
   ENDMENU

   ACTIVATE DIALOG oDlg CENTER

RETURN Nil
Além do menu sumir ao acionar opção, ao sair da dialog de cadastro passou a dar este erro
Error BASE/1004 No exported method: EVAL
Called from (b)EVAL(0)
Called from HWG_ENDDIALOG(573)
Called from (b)HDIALOG(73)
Called from HDIALOG:CLOSE(0)
Called from (b)DLGAUTOMAIN(22)
Called from THISDLG:EXIT(0)
Dá erro na função hwg_EndDialog()

Alguma idéia?


Comparado com antes, só acrescentei esse menu inicial.
Talvez o ponto a verificar seja: porque a dialog de menu desaparece?

Criação de telas

Enviado: 15 Jul 2023 17:55
por JoséQuintas
Resolvido.

Dei uma instância de GTWVG pro cadastro, e usei multithread no menu.

Criação de telas

Enviado: 17 Jul 2023 13:29
por JoséQuintas
Só pra dar uma idéia do que vém por aí........
A nova configuração, sem setup ainda.

Código: Selecionar todos

      USE ( cFile )
      aStru := dbStruct()
      FOR EACH aField IN aStru
         AAdd( aAllSetup, { cFile, aField[ DBS_NAME ], aField[ DBS_TYPE ], ;
            aField[ DBS_LEN ], aField[ DBS_DEC ], aField[ DBS_NAME ], ;
            "", "", "", "" } )
         DO CASE
         CASE ! cFile == "ACCOUNT"
         CASE aField[ DBS_NAME ] == "IDPRODUCT"
            ATail( aAllSetup )[ 7 ] := "PRODUCT"
            ATail( aAllSetup )[ 8 ] := "IDPRODUCT"
            ATail( aAllSetup )[ 9 ]  := "NAME"
         CASE aField[ DBS_NAME ] == "IDPEOPLE"
            ATail( aAllSetup )[ 7 ] := "PEOPLE"
            ATail( aAllSetup )[ 8 ] := "IDPEOPLE"
            ATail( aAllSetup )[ 9 ]  := "NAME"
         ENDCASE
      NEXT
      USE
Na tela de account, vai pesquisar o produto e trazer descrição, e pesquisar o cliente e trazer descrição.....

Em andamento, ainda estou aprendendo.
Ainda é minha primeira tela, multiplicada por milhares, mas é minha primeira tela ainda.

Pois é... mais de um ano pra fazer uma simples tela....
Por isso uso essa coisa de criar várias telas... nem é pra usar... é só pra tirar essa sensação de não ter saído da primeira tela.
Ao invés da sensação de.... não criei nem a primeira, e ainda faltam 999...
Fica a sensação de.... só falta mais um negocinho... e o aplicativo tá quase pronto...

É só por isso mesmo.

De resto:

- uma criação de dialog
- uma criação de get
- uma criação de say
- uma criação de tab
- uma criação de page
- uma criação de panel
- somar linha/coluna, e quebrar página igual qualquer relatório

É coisa que todo mundo sabe fazer, e faz o tempo todo.

Talvez o destaque seja o uso de codeblock. Se não construir direito, ele não faz o que a gente pensa.

Criação de telas

Enviado: 17 Jul 2023 14:54
por JoséQuintas
Primeiro passo: reservar espaço pra mostrar descrição.

Não precisa inteligência artificial pra isso, se vai ter descrição, e essa descrição vai ficar junto com o código.... é incluir isso no cálculo de posição.
O detalhe é: dependendo do layout, o cálculo vai ser diferente
E precisa uma precaução: Vai que isso fica maior que a largura da tela, não pode ficar pulando linha infinitamente.

Código: Selecionar todos

         IF ::nEditStyle == 1 .OR. ::nEditStyle == 2
            nLen := Len( aItem[ CFG_CAPTION ] ) + aItem[ CFG_LEN ] + 3 + iif( Empty( aItem[ CFG_VTABLE ] ), 0, Len( aItem[ CFG_VVALUE ] ) + 3 )
         ELSE
            nLen := Max( aItem[ CFG_LEN ] + iif( Empty( aItem[ CFG_VTABLE ] ), 0, Len( aItem[ CFG_VVALUE ] ) + 3 ), Len( aItem[ CFG_CAPTION ] ) )
         ENDIF
         IF ::nEditStyle == 1 .OR. ( nCol != 10 .AND. nCol + 30 + ( nLen * 12 ) > ::nDlgWidth - 40 ) .OR. nRow > ::nPageLimit
espaco.png
No teste prático deu certo, espaço foi reservado, pra descrição do produto e descrição da pessoa.

Agora começa... colocar aí um LABEL e rotina de atualização.

Criação de telas

Enviado: 17 Jul 2023 15:09
por JoséQuintas

Código: Selecionar todos

         IF ! Empty( aItem[ CFG_VTABLE ] )
            @ nCol2 + ( ( aItem[ CFG_LEN ] + 3 ) * 12 ), nRow2 SAY aItem[ CFG_VOBJ ] CAPTION aItem[ CFG_VVALUE ] OF ;
               iif( ::lWithTab, oTab, ::oDlg ) SIZE Len( aItem[ CFG_VVALUE ] ) * 12, 20 COLOR STYLE_FORE TRANSPARENT
         ENDIF
Pronto, agora só falta atualizar conforme navega.
Depois vejo como atualizar na digitação.

Criação de telas

Enviado: 17 Jul 2023 16:02
por JoséQuintas
update.png
Funcionou ?

NÃO. Dá erro aonde a gente menos espera.

O primeiro registro funciona, os demais não.

Código: Selecionar todos

METHOD EditUpdate() CLASS DlgAutoEdit

   LOCAL aItem, nSelect

   FOR EACH aItem IN ::aControlList
      IF aItem[ CFG_CTLTYPE ] == TYPE_EDIT
         IF ! Empty( aItem[ CFG_NAME ] )
            aItem[ CFG_OBJ ]:Value := FieldGet( FieldNum( aItem[ CFG_NAME ] ) )
            aItem[ CFG_OBJ ]:Refresh()
         ENDIF
         IF ! Empty( aItem[ CFG_VTABLE ] )
            nSelect := Select()
            SELECT ( Select( aItem[ CFG_VTABLE ] ) )
            SEEK aItem[ CFG_OBJ ]:Value
            aItem[ CFG_VOBJ ]:SetText( &( aItem[ CFG_VTABLE ] )->( FieldGet( FieldNum( aItem[ CFG_VSHOW ] ) ) ) )
            aItem[ CFG_VOBJ ]:Refresh()
            SELECT ( nSelect )
         ENDIF
      ENDIF
   NEXT

   RETURN Nil
Pega o valor do HEDIT, pesquisa, pega a descrição, coloca no HSTATIC.
Está certo.... o primeiro fez certo.
Está errado ? os demais não atualizou.

preenchi people com P1, e produto com U1, pra diferenciar o conteúdo.
TODAS as tabelas tem códigos 1 a 9

Sei lá....

Criação de telas

Enviado: 17 Jul 2023 16:20
por JoséQuintas

Código: Selecionar todos

FUNCTION DlgAutoDBF()

   LOCAL nCont

   IF ! File( "people.dbf" )
      dbCreate( "people", { ;
         { "IDPEOPLE", "N", 6, 0 }, ;
         { "NAME",     "C", 30, 0 } } )
      USE people
      FOR nCont = 1 TO 9
         APPEND BLANK
         REPLACE IDPEOPLE WITH 1, NAME WITH Replicate( "P" + Str( nCont, 1 ), 10 )
      NEXT
      INDEX ON field->idPeople TAG primary
      INDEX ON field->Name     TAG name
      USE
   ENDIF
   IF ! File( "product.dbf" )
      dbCreate( "product", { ;
         { "IDPRODUCT", "N", 6, 0 }, ;
         { "NAME", "C", 30, 0 } } )
      USE product
      FOR nCont = 1 TO 9
         APPEND BLANK
         REPLACE IDPRODUCT WITH 1, NAME WITH Replicate( "U" + Str( nCont, 1 ), 10 )
      NEXT
      INDEX ON field->idProduct TAG primary
      INDEX ON field->Name      TAG name
      USE
   ENDIF
   IF ! File( "account.dbf" )
      dbCreate( "account", { ;
         { "IDACCOUNT", "N", 6, 0 }, ;
         { "IDPEOPLE",  "N", 6, 0 }, ;
         { "IDPRODUCT", "N", 6, 0 }, ;
         { "VALUE",     "N", 14, 2 } } )
      USE account
      FOR nCont = 1 TO 9
         APPEND BLANK
         REPLACE IDACCOUNT WITH nCont, IDPEOPLE WITH nCont, IDPRODUCT WITH nCont, VALUE WITH nCont * 1000
      NEXT
      INDEX ON field->IdAccount TAG primary
      USE
   ENDIF

   RETURN Nil
Lógico, se a gente grava tudo com número 1, não vai achar nunca kkkkk