Criação de telas

Projeto HwGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Criação de telas

Mensagem 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
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Criação de telas

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Criação de telas

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Criação de telas

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Fernando queiroz
Usuário Nível 4
Usuário Nível 4
Mensagens: 779
Registrado em: 13 Nov 2014 00:41
Localização: Porto Alegre/RS

Criação de telas

Mensagem 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
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Criação de telas

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Fernando queiroz
Usuário Nível 4
Usuário Nível 4
Mensagens: 779
Registrado em: 13 Nov 2014 00:41
Localização: Porto Alegre/RS

Criação de telas

Mensagem 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
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
Fernando queiroz
Usuário Nível 4
Usuário Nível 4
Mensagens: 779
Registrado em: 13 Nov 2014 00:41
Localização: Porto Alegre/RS

Criação de telas

Mensagem 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
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Criação de telas

Mensagem 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.
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

Criação de telas

Mensagem 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
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

Criação de telas

Mensagem 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
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

Criação de telas

Mensagem 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 } } )
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
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Criação de telas

Mensagem por sygecom »

Showwwwwww
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Criação de telas

Mensagem 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.
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

Criação de telas

Mensagem 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.
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