Página 1 de 3

Criação de telas

Enviado: 11 Mar 2023 20:24
por sygecom
Pessoal,
Alguém tem alguma ideia de classe para cadastro que gere tela em Hwgui a partir de um DBF/Aaray/sgbd.

A ideia é poder facilitar a criação de telas de cadastros, passando apenas array por exemplo.

Pelo que entendi o Protheus da Totvs faz isso limitando até 4 colunas de componentes por aba.

Se alguém tiver alguma ideia pra colaborar nesse início agradeço

Criação de telas

Enviado: 12 Mar 2023 07:53
por Itamar M. Lins Jr.
Olá!
Protheus da Totvs
Faz mas fica horrível.(minha opinião)
O segredo é usar fonte COSOLAS, COURIER, COURIER NEW... Ele usa uma dessas.
E a font é fixa no protheus.
Tem IDE de terceiros no protheus que podemos baixar... não lembro mais a url.

Saudações,
Itamar M. Lins Jr.

Criação de telas

Enviado: 12 Mar 2023 07:59
por Itamar M. Lins Jr.
Olá!
dê um fonte exemplo e te dou o gerador com fontes baseado nele.
Qualquer fonte usando LINHA x COLUNAS com font (Courier, Courier New)
@ x,y say .... size larg,comp ...
@ x,y get .... size larg,comp ...
PROTHEUS usa uma COPIA ANTIGA da FiveWin quase a mesma coisa da Hwgui.
Vão dizer que não, que é isso, é aquilo... Mas é FIVEWIN... Tenho até minhas dúvidas se não é uma cópia do Harbour com Fivewin.
O projeto aceita a mesma coisa do Harbour arquivo .HRB só que com outra extensão.
Vai ver foram olhando e fazendo diferente para dizer que não foi uma cópia.
Não importa o tamanho da tela(resolução 30000X20000). A FONTE será sempre a MESMA. Quer dizer vai ficando cada vez menor se a resolução foi muito grande.
Geralmente 1024 mais que isso a font já fica muito pequena dependendo do propósito.
Mas é um programa muito bem feito e monstruoso de tamanho com milhões de possibilidades para implantar em qualquer comércio.
Por conta de podermos programar e interferir adicionar mais módulos...etc... muito bom mesmo.

Saudações,
Itamar M. Lins Jr.

Criação de telas

Enviado: 12 Mar 2023 16:39
por Itamar M. Lins Jr.
Olá!
No caso de existir um valid no ULTIMO GET, colocar mais um get com size 0,0 DISABLE ou não.
Eu faço assim: "@ x,y get oPhatom VAR cPhantom size 0,0" ai não mostra nada pois não tem tamanho.

Esse é um problema difícil de resolver pq para executar um VALID é preciso teclar ENTER precisa pular de um get para outro, como não tem mais get fica impossibilitado de usar um VALID. A pessoa pode teclar ESC tudo é foco no windows.

Saudações,
Itamar M. Lins Jr.

Criação de telas

Enviado: 12 Mar 2023 20:54
por Fernando queiroz
TELA01.jpg
tela02.jpg
tela03.jpg
gosto de telas simples e intuitivas, antes eu USAVA dois cliques no mouse para editar, mas vi que a curva de aprendizado de novos funcionários
levava mais tempo pois tinha de colocar alguém para ensinar
ai coloquei o BOTÃO [EDITAR]

o Botao EXCLUIR ja vai direto para confirmação, se tiver privilégios para isso , senão fica DISABLE

Criação de telas

Enviado: 13 Mar 2023 07:48
por Itamar M. Lins Jr.
Olá!
E se for apenas uma consulta?
Qual é o problema de consultar com edit ligado ? Agora é JANELA cabe muita coisa, ANTES 80x24, agora temos muito mais espaço e ainda o TAB se for o caso.

Eu uso BROWSE para tudo e a tela de edição ao lado, MINHA BARRA de SKIP é no próprio BROWSE.
Navegando no BROWSE os registros(no get) vão mudando.
Só tenho dois botões de navegação PRIMEIRO e ULTIMO, A pessoa usa a BARRA DO BROWSE SUBIR e DESCER.
Coisa antiga do tempo do DOS-XT que venho trazendo.

Saudações,
Itamar M. Lins Jr.

Criação de telas

Enviado: 13 Mar 2023 09:09
por Fernando queiroz
TELA01.jpg
depois de algumas dicas de SQL do Quintas , mudei todas as consultas letra a letra para pegar qualquer campo de consulta ai liberei o HEADER do browse, agora uso para pegar todos os registro , inicio somente com 50 para ficar mais rápido e se precisar clico no header e trago tudo, caso contrario vou pesquisando letra a letra e trazendo somente 50 registros, ficou rápido
e uso a barra de rolagem para subir ou descer o browse, sem botões de navegação no browse

partindo da experiencia de uso eles preferem pesquisar letra a letra que encontra mais rápido de que ficar navegando usando botoes, e em alguns casos muito esporádicos eles usam o cadastro todo para olhar os dados

Criação de telas

Enviado: 13 Mar 2023 09:57
por Fernando queiroz
Quem vai ficar usando barra/botão para navegar em 10 mil registros ?...
Por sinal a barra de pesquisa nem get tem, a pessoa tecla no head e pressiona as teclas, números, letras.
foi exatamente o que eliminei , o uso do header para escolher o que pesquisar, agora pesquisa em todos os campos e o header eu liberei para trazer todos os registros quando clicado.

posso pesquisar por nome, parte de nome, cpf, telefone sem precisar escolhar qual sera o campo de pesquisa, ha e tambem nao tem get

Criação de telas

Enviado: 19 Mar 2023 10:36
por JoséQuintas
O fonte testado, agora com mais campos:

Código: Selecionar todos

PROCEDURE Main

LOCAL aCamposList, cNome, cTipo, nLen, nRow, aCampo

aCamposList := { ;
   { "codigo", "N", 6 }, ;
   { "nome", "C", 30 }, ;
   { "endereco", "C", 30 }, ;
   { "cidade", "C", 20 }, ;
   { "bairro", "C", 20 }, ;
   { "uf", "C", 2 } }

SET ALTERNATE TO test.txt
SET ALTERNATE ON
? [PROCEDURE Main]
FOR EACH aCampo IN aCamposList
   cNome := aCampo[1]
   cTipo := aCampo[2]
   nLen  := aCampo[3]
   ? [LOCAL ] + iif( cTipo == "N", [n], [c] ) + cNome + [ := ] + iif( cTipo == "N", [0], [Space(] + Ltrim( Str( nLen ) ) + [)] )
NEXT
   ? [SetMode(25,80)]
nRow := 1
FOR EACH aCampo IN aCamposList
   cNome := aCampo[1]
   cTipo := aCampo[2]
   nLen  := aCampo[3]
   (nLen) // nao usado
   ? [@ ] + Ltrim( Str( nRow ) ) + [, 0 SAY "] + cNome + [" GET ] + iif( cTipo == "N",[n], [c] ) + cNome
   nRow += 1
NEXT
? [READ]
SET ALTERNATE OFF
SET ALTERNATE TO

RETURN
O resultado gerado:
PROCEDURE Main
LOCAL ncodigo := 0
LOCAL cnome := Space(30)
LOCAL cendereco := Space(30)
LOCAL ccidade := Space(20)
LOCAL cbairro := Space(20)
LOCAL cuf := Space(2)
SetMode(25,80)
@ 1, 0 SAY "codigo" GET ncodigo
@ 2, 0 SAY "nome" GET cnome
@ 3, 0 SAY "endereco" GET cendereco
@ 4, 0 SAY "cidade" GET ccidade
@ 5, 0 SAY "bairro" GET cbairro
@ 6, 0 SAY "uf" GET cuf
READ
gerar fonte é difícil ?
não
só precisa de um modelo, e encontrar a fórmula de cálculo das posições.

Pra quem não notou, a lista é equivalente a dbStruct() que pega a estrutura de um DBF.
Tá aí uma geração automática pra DBF, básica.

só trocar isto:

Código: Selecionar todos

aCamposList := { ;
   { "codigo", "N", 6 }, ;
   { "nome", "C", 30 }, ;
   { "endereco", "C", 30 }, ;
   { "cidade", "C", 20 }, ;
   { "bairro", "C", 20 }, ;
   { "uf", "C", 2 } }
por isto:

Código: Selecionar todos

aCamposList := dbStruct()
Lógico, falta campo Date(), Memo(), etc.
É só um modelo básico.

Criação de telas

Enviado: 14 Jun 2023 11:55
por JoséQuintas
Agora mais visível do que se trata

Código: Selecionar todos

#include "hbclass.ch"
#include "directry.ch"

#define STYLE_BACK               WIN_RGB( 13, 16, 51 )
#define STYLE_FORE               WIN_RGB( 255, 255, 255 )
//#define STYLE_BTN_NORMAL         HStyle():New( { STYLE_BACK }, 1 )
//#define STYLE_BTN_CLICK          HStyle():New( { STYLE_BACK }, 1,, 3, 0 )
//#define STYLE_BTN_OVER           HStyle():New( { 16759929, 16771062 }, 1,, 2, 12164479 )
//#define STYLE_BTN_ALL            { STYLE_BTN_NORMAL, STYLE_BTN_CLICK, STYLE_BTN_OVER }

PROCEDURE PTEShwguiCadastro( cModule, cTitle, ... )

   LOCAL aFileList, aFile

   (cModule)
   (cTitle)
   SET EXCLUSIVE OFF

   aFileList := Directory( "*.dbf" )
   IF Len( aFileList ) == 0
      hwg_MsgInfo( "No files for test" )
   ELSE
      FOR EACH aFile IN aFileList
         Execute( hb_FNameName( aFile[ F_NAME ] ) )
         IF aFile:__EnumIndex > 10
            EXIT
         ENDIF
      NEXT
   ENDIF

   RETURN

FUNCTION Execute( cFile )

   LOCAL oDlg

   oDlg := MyTestClass():New()
   oDlg:cFileDBF := cFile
   oDlg:cTitle   := "test of " + cFile
   oDlg:cOptions := ""
   //AAdd( oDlg:aOptionList, { "Mail", { || Nil } } )
   //AAdd( oDlg:aOptionList, { "CtlList",  { || oDlg:ShowCtl() } } )
   oDlg:Execute()

   RETURN Nil

CREATE CLASS MyTestClass INHERIT hwgui_frmCadClass

   METHOD ShowCtlList()

   ENDCLASS

METHOD ShowCtlList() CLASS MyTestClass

   LOCAL oControl, cTxt := "", cTxtTmp := ""

   FOR EACH oControl IN ::oDlg:aControlList
      IF Len( cTxtTmp ) > 500
         cTxt += cTxtTmp + hb_Eol()
         cTxtTmp := ""
      ENDIF
      cTxtTmp += oControl[2]:winClass + Ltrim( Str( oControl[2]:id ) ) + " "
   NEXT
   cTxt += cTxtTmp
   hwg_MsgInfo( cTxt )

   RETURN Nil
tela1.png
Liberando mais opções

Código: Selecionar todos

FUNCTION Execute( cFile )

   LOCAL oDlg

   oDlg := MyTestClass():New()
   oDlg:cFileDBF := cFile
   oDlg:cTitle   := "test of " + cFile
   oDlg:cOptions := "IEDP"
   AAdd( oDlg:aOptionList, { "Mail", { || Nil } } )
   AAdd( oDlg:aOptionList, { "CtlList",  { || oDlg:ShowCtl() } } )
   oDlg:Execute()

   RETURN Nil
tela2.png
outro dbf
tela3.png

Criação de telas

Enviado: 21 Jun 2023 11:52
por JoséQuintas
Os fontes estão na hwgui oficial, pasta test\mixed
Estou usando a hwgui oficial, mas compilada com parâmetros opcionais

Código: Selecionar todos

PRGFLAGS=-m -n -w3 -es2 -ge1 -DMT_EXPERIMENTAL -DHB_NO_GTGUI=YES -DHB_NO_HWGUIDEBUG=YES
Usando harbour 3.2 oficial com minhas modificações básicas, como por exemplo, remover a adição de CH da GTWVG.HBC pra não dar conflito.
As modificações estão lá no oficial como pull request
Resumindo: tudo público, nada particular escondido nas versões que uso.

Na dúvida, aqui fontes e compilado.
Ele vai criar telas pra todos os DBFs que existirem na pasta.
Aqui tem um DBF a mais do que na hwgui, com mais de 30 campos, pra acionar TAB.
test.zip
(1.44 MiB) Baixado 502 vezes

Criação de telas

Enviado: 22 Jun 2023 21:38
por JoséQuintas
test.png
Agora com o caption encima do get.

Não olhei como configurar tamanho de fonte, e não sei se vou olhar.
Tá tudo por conta do default da hwgui.

É tudo encima do array.
Se alterar o array, vai ter os campos que quiser, tipo que quiser, tamanho que quiser, e o texto que quiser.

Só não entendi porque ficou torto se são do mesmo tamanho
A posição não tem nada a ver com tipo de letra.

Código: Selecionar todos

      dbCreate( "test", { ;
         { "IDSTOCK", "N", 6, 0 }, ;
         { "NAME", "C", 50, 0 }, ;
         { "VALUE", "N", 10, 2 }, ;
         { "QTD", "N", 6, 0 }, ;
         { "BARCODE", "N", 10, 0 }, ;
         { "OTHER", "C", 50, 0 } } )

Criação de telas

Enviado: 28 Jun 2023 13:15
por sygecom
Showwwwwww

Criação de telas

Enviado: 30 Jun 2023 21:10
por JoséQuintas
Nem percebi outra utilidade disso:
Só pra dar idéia

Código: Selecionar todos

PRIVATE lista de variáveis

LOCAL oTela := DlgAutoMain():New()

oTela:EditList := { ... }
oTela:EditCreate()
oTela:EditOn()
E lá temos toda digitação pronta, pra usar em outro módulo, sem ter nada a ver com o funcionamento automático.

Criação de telas

Enviado: 05 Jul 2023 10:12
por JoséQuintas
teste.png
Pra teste, coloquei 3 opções simultâneas.

Modelo 1: say seguido de get, um campo por linha
Modelo 2: say seguido de get, o que couber na linha
Modelo 3: say acima do get, o que couber na linha

Dependendo da quantidade de campos, fica tudo uma bost.
O primeiro até fica bonito, mas o segundo fica uma zona.