Clipper On Line • Ver Tópico - "Começando" com GUI

"Começando" com GUI

Projeto Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

 

"Começando" com GUI

Mensagempor JoséQuintas » 15 Mai 2017 15:29

Já nem sei mais aonde postar.... rs
Só sei que pode ser interessante pra muitos.

GTWVT é interessante, porque faz parte do core do Harbour, funciona em Windows ou Linux.
GTWVG é uma GTWVT com adição de API Windows, é a que uso com multithread.

Com GTWVG e multithread tenho janelas à vontade, redimensionamento automático, não importa se o monitor é de 14 polegadas, 40 polegadas, 4k, múltiplos monitores, etc.

Agora quero partir pro visual melhorado.
Mas chega uma hora que cansa testar exemplos que não funcionam, exemplos inúteis, ou falta de exemplos.

Continuo achando que a GTWVG poderia ser melhor que todas as outras juntas, mas sem conhecimento de linguagem C, e sem ajuda, não tem muito mais o que fazer.
Agora resta usar as LIBs que tem.
Dependendo do recurso, considero as LIBs FRACAS comparadas à GTWVG, mas tudo bem, talvez juntas dê pra fazer alguma coisa melhorada.
"Talvez", porque com certeza vai faltar o padrão do Harbour 3.4.

A coisa é relativamente simples:
Você tem uma janela, essa janela tem lá linha inicial, coluna inicial, linha final, coluna final.
Fazendo os cálculos se obtém o tamanho da janela, e dá pra usar pra algumas coisas.
No Harbour 3.4 isso é normal, mas não no Harbour 3.2, porque certas rotinas de API são incompatíveis com os tipos numéricos do Harbour.

Tá na hora de usar HARBOUR como o HARBOUR é !!! e não como as LIBs pensam que é !!! (parece trecho do filme Matrix... rs)

Provavelmente vai ter o mesmo problema nas LIBs....

Não quero aprender linguagem C.
Ver PRG ruim já é mais que suficiente.
Aprender C... aprender conversão pra Harbour... aprender API Windows... Parece que aprender outra linguagem de programação seria muito menos trabalhoso do que usar Harbour desse jeito...

Mas vamos ao que interessa:
Quero entrar no visual Windows.
Acredito que vou fazer diferente de todos, mas que interessará a muitos: o programa principal continuará sendo GTWVG, e vai servir de base pra configurar as janelas da(s) LIB(s) GUI (se não obrigar(em) a usar C).
Com certeza a allgui deve ajudar nessa "empreitada".

Se possível, precisaria de dois exemplos não tão básicos pra começar:

- Um browse com opção de ir digitando e filtrando (ou pelo menos a idéia de como isso pode ser feito), e ao teclar ENTER selecionar um conteúdo a ser especificado (código por exemplo)
- O equivalente a say/gets com validação

Tanto faz a LIB usada nos fontes, acho que preferencialmente HWGUI ou HMG Extended.
Só imagino que a parte que possa complicar será no browse deixar a janela modal com relação à janela GTWVG, e retornar esse valor pra janela GTWVG.

Apesar da HWGUI ter poucos exemplos, a tstbrw.prg serviu pra isto.
Já na HMG Extended, não consegui identificar nenhum exemplo.

Como é salada, e vai interessar só pra quem usa console... acho que aqui pode ser interessante.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

"Começando" com GUI

Mensagempor JoséQuintas » 15 Mai 2017 15:33

primeiro fonte, simples, não definido no fonte, mas vai usar GTWVG, o SET KEY chama o browse.
Até aqui, qualquer console/LIB é igual, qualquer aplicativo tem isto.

#include "inkey.ch"

FUNCTION Main()

   LOCAL nValor := 0, nValor1 := 0, nValor2 := 0, nQtCalc := 0, cTexto := Space(30)

   SetKey( K_F9, { || Pesquisa( @cTexto ) } )
   SetMode( 15, 80 )
   CLS
   @ 1, 0 SAY "Texto..:" GET cTexto   PICTURE "@!"
   @ 3, 0 SAY "Valor 1:" GET nValor1 PICTURE "999,999,999.99"
   @ 5, 0 SAY "Valor 2:" GET nValor2 PICTURE "999,999,999.99"
   @ 7, 0 SAY "Outro..:" GET nValor  PICTURE "999,999,999.99"
   @ 9, 0 SAY "Mais um:" GET nQtCalc PICTURE "999,999,999.99"
   READ

   RETURN NIL
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

"Começando" com GUI

Mensagempor JoséQuintas » 15 Mai 2017 15:44

Segundo fonte.... Um browse, mas em hwgui.
peguei o sample\tstbrw.prg como base pro teste.

#include "windows.ch"
#include "guilib.ch"

PROCEDURE Pesquisa( cText )

   LOCAL oModDlg, oBrw1
   LOCAL aSample1 := { { .T., "Alex", 17 }, { .T., "Victor", 42 }, { .T., "John", 31 } }

   INIT DIALOG oModDlg TITLE "About"          ;
      AT 190, 10  SIZE 400, 240

   @ 20, 30 BROWSE oBrw1 ARRAY SIZE 180, 110 ;
        STYLE WS_BORDER + WS_VSCROLL + WS_HSCROLL

   @ 80, 180 OWNERBUTTON ON CLICK { || hwg_EndDialog() } ;
       SIZE 180, 35 FLAT                                  ;
       TEXT "Close" COLOR hwg_ColorC2N( "0000FF" )

   hwg_CREATEARLIST( oBrw1, aSample1 )

   oBrw1:bKeyDown := { | o, key | BrwKey( o, key, @cText ) }

   ACTIVATE DIALOG oModDlg

   RETURN NIL

STATIC FUNCTION BrwKey( oBrw, key, cText )

   IF key == 13
      cText := oBrw:aArray[ oBrw:nCurrent, 2 ]
      hwg_EndDialog()
   ENDIF

   RETURN .T.


Compilação, mas por preguiça vou colocar como faço na allgui.... rs

hbmk2 test test2 gtwvg.hbc hwgui.hbc


E o resultado, que até o papel de parede ficou olhando... rs

hwgui.png


Um aplicativo texto, que já usa um browse GUI.
Teclou F9, abre o browse, e teclando ENTER, já preenche o GET, do jeito que faço com GTWVG, exceto pela janela em separado.
No ENTER fecha o browse, é que chamei novamente o browse pra deixar preenchido pra cópia da tela.

Pergunto:
Algum exemplo disponível pra poder um browse parecido com HMG Extended?
Queria fazer agora com HMG Extended, mas cansa procurar exemplo e testar exemplo com erro.
Se possível com a opção de digitar iniciais e já ir filtrando, que esse da hwgui vai permitir porque segue o padrão do tbrowse.

Só lembrando:

Dá pra misturar tudo, HWGUI, HMG Extended, etc.
Nem sei em que divisão poderia postar isto, já que mistura tudo.
Mas é Harbour: o Harbour não limita uso de LIB, a LIB é que pode limitar.
A única certeza é que isto só é interessante pra quem não usa LIB nenhuma, assim como eu ainda não uso.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

"Começando" com GUI

Mensagempor JoséQuintas » 15 Mai 2017 16:14

Só pra lembrar:

Tenho uma única rotina de browse para esse tipo de browse no aplicativo inteiro.
Basta alterar uma única rotina, e centenas de browses vão ficar gráficos.

É sobre isso que eu escrevo sempre sobre revisar, organizar e simplificar os fontes, antes de complicar.
Dá trabalho mudar pra LIB gráfica? depende dos fontes.
Dá trabalho trocar de Clipper pra Harbour? depende dos fontes.

Fonte organizado e padronizado é a resposta pra tudo.
Depois, só inventar cores, gráficos, etc. e melhorar mais ainda.

Falta testar a parte de arquivos, apesar que nesse caso não vai ser diferente do que normalmente a gente já usa, e deve funcionar sem problemas.

Acredito que isto vai despertar interesse.
Seria interessante ter exemplos em LIBs diferentes, antes que usem este em hwgui só porque foi o primeiro que apareceu.

Já que as LIBs não se juntam, vamos juntá-las. Quem sabe a gente não causa uma revolução nisso tudo, mostrando coisas que não tinham pensado antes.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

"Começando" com GUI

Mensagempor MSDN » 15 Mai 2017 16:56

Quintas,

No exemplo que está em C:\MiniGUI\SAMPLES\Applications\Super , tem a pesquisa que você quer, na tela de Produtos, opção Incluir, nos campos Categoria, Sub-Categoria e Impostos, pressionando ENTER aparece outra janela com um Browse e pesquisa letra-a-letra.

Abraços
MSDN
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 741
Data de registro: 28 Nov 2003 14:55
Cidade/Estado: CWB
Curtiu: 178 vezes
Mens.Curtidas: 123 vezes

"Começando" com GUI

Mensagempor JoséQuintas » 15 Mai 2017 17:23

Valeu.
Como pude esquecer de olhar o aplicativo completo.... rs
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

"Começando" com GUI

Mensagempor MSDN » 15 Mai 2017 18:47

Como você é um programador INOXIDÁVEL , com certeza vai sair coisa melhor !
MSDN
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 741
Data de registro: 28 Nov 2003 14:55
Cidade/Estado: CWB
Curtiu: 178 vezes
Mens.Curtidas: 123 vezes

"Começando" com GUI

Mensagempor JoséQuintas » 15 Mai 2017 19:38

Quando se trata das LIBs GUI... sou principiante.

São só testes baseados em fontes existentes.
São apenas ajustes de código fonte Harbour, e nada adicional.
Repare bem que vai confirmar: apenas estou usando o conhecimento do Harbour, e não o conhecimento das LIBs.
Lógico... conforme o fonte/resultado for empolgando, aí dá pra se aprofundar cada vez mais.
Por enquanto estou fazendo apenas os testes superficiais, sem entrar fundo em nenhuma.

Agora vamos lá... está incompleto o da HMGE, justamente porque não sei o que poderia usar.
Uma importante é: SET WINDOW MAIN OFF, que não obriga Main() em HMGE.

O módulo principal foi alterado, mas só por causa de usar DBF. Continua do jeito console tradicional.

#include "inkey.ch"

FUNCTION Main()

   LOCAL nValor := 0, nValor1 := 0, nValor2 := 0, nQtCalc := 0, cTexto := Space(30), GetList := {}

   AbreArquivos()
   SetKey( K_F9, { || Pesquisa( @cTexto ) } )
   SetMode( 15, 80 )
   CLS
   @ 1, 0 SAY "Texto..:" GET cTexto   PICTURE "@!"
   @ 3, 0 SAY "Valor 1:" GET nValor1 PICTURE "999,999,999.99"
   @ 5, 0 SAY "Valor 2:" GET nValor2 PICTURE "999,999,999.99"
   @ 7, 0 SAY "Outro..:" GET nValor  PICTURE "999,999,999.99"
   @ 9, 0 SAY "Mais um:" GET nQtCalc PICTURE "999,999,999.99"
   READ
   CLOSE DATABASES

   RETURN NIL

STATIC FUNCTION AbreArquivos()

   IF ! File( "test.dbf" )
      dbCreate( "test.dbf", { ;
         { "CODIGO", "C", 5, 0 }, ;
         { "NOME", "C", 30, 0 } } )
   ENDIF
   USE test
   IF ! File( "test.ntx" )
      INDEX ON test->NOME TO test
   ENDIF
   SET INDEX TO test

   RETURN NIL


O fonte HMGE. Apenas usei um pronto, não sei dizer o que pode ser eliminado, ou se poderia ser usado o DBF diretamente.
Também não sei como detectar o ENTER, e obter o elemento atual do array. É mais pra mostrar que a mistura é possível.


#include 'hmg.ch'
#include 'super.ch'

FUNCTION Pesquisa( cText )

   SET WINDOW MAIN OFF
   GOTO TOP

   DEFINE WINDOW form_Pesquisa ;
      AT 000,000;
      WIDTH 800;
      HEIGHT 605;
      TITLE 'Pesquisa';
      MODAL ;
      NOSIZE ;
      ON INIT pesquisar()

      DEFINE splitbox
      DEFINE GRID grid_pesquisa
         PARENT form_pesquisa
         COL 000
         ROW 105
         WIDTH 795
         HEIGHT 430
         HEADERS { 'Código', 'Nome' }
         WIDTHS { 100, 650 }
         FONTNAME 'verdana'
         FONTSIZE 010
         FONTBOLD .T.
         BACKCOLOR COLOR_YELLOW_1
         FONTCOLOR COLOR_BLACK_1
         ONDBLCLICK Seleciona( @cText )
      END GRID
      END SPLITBOX

      DEFINE LABEL rodape_001
         PARENT form_pesquisa
         COL 005
         ROW 545
         VALUE 'Digite sua pesquisa'
         AUTOSIZE .T.
         FONTNAME 'verdana'
         FONTSIZE 010
         FONTBOLD .T.
         FONTCOLOR COLOR_GRAY_1
         TRANSPARENT .T.
      END LABEL
      @ 540,160 TEXTBOX tbox_pesquisa;
         OF form_pesquisa ;
         HEIGHT 027;
         WIDTH 300;
         VALUE '';
         MAXLENGTH 040;
         FONT 'verdana' SIZE 010;
         BACKCOLOR _FUNDO_GET;
         FONTCOLOR _LETRA_GET_1;
         UPPERCASE ;
         ON CHANGE pesquisar()

         ON KEY ESCAPE ACTION thiswindow.release

      END WINDOW

      form_pesquisa.center
      form_pesquisa.activate

      RETURN NIL

STATIC FUNCTION Seleciona( ... )

   RETURN NIL

STATIC FUNCTION pesquisar()

   LOCAL cPesq        := alltrim( form_pesquisa.tbox_pesquisa.value )
   LOCAL lGridFreeze  := .T.
   LOCAL nTamNomePesq := len( cPesq )

   SEEK cPesq

   IF lGridFreeze
      form_pesquisa.grid_pesquisa.disableupdate
   ENDIF

   DELETE ITEM ALL FROM grid_pesquisa OF form_pesquisa

   DO WHILE ! Eof()
      IF substr( field->nome, 1, nTamNomePesq ) == cPesq
         ADD ITEM { temp->Codigo, alltrim( temp->Nome ) } TO grid_pesquisa OF form_pesquisa
      ELSEIF substr( field->nome, 1, nTamNomePesq ) > cPesq
         EXIT
      ENDIF
      SKIP
   ENDDO

   IF lGridFreeze
      form_pesquisa.grid_pesquisa.enableupdate
   ENDIF

   RETURN NIL

FUNCTION atualizar()

   DELETE ITEM ALL FROM grid_pesquisa OF form_pesquisa

   GOTO TOP

   DO WHILE ! Eof()
      ADD ITEM { temp->Codigo, alltrim( temp->Nome ) } TO grid_pesquisa OF form_pesquisa
      SKIP
   ENDDO

   RETURN NIL


Devido às cores, uma alteração prévia que eu tinha feito no superchief, eliminando variáveis e deixando em CH.

#define COLOR_WHITE_1    { 255, 255, 255 }
#define COLOR_BLACK_1    { 000, 000, 000 }
#define COLOR_BLUE_1     { 108, 108, 255 }
#define COLOR_BLUE_2     { 000, 000, 255 }
#define COLOR_BLUE_3     { 032, 091, 164 }
#define COLOR_BLUE_4     { 023, 063, 115 }
#define COLOR_BLUE_5     { 071, 089, 135 }
#define COLOR_BLUE_6     { 000, 073, 148 }
#define COLOR_ORANGE_1   { 255, 163, 070 }
#define COLOR_GREEN_1    { 000, 094, 047 }
#define COLOR_GREEN_2    { 000, 089, 045 }
#define COLOR_GRAY_1     { 128, 128, 128 }
#define COLOR_GRAY_2     { 192, 192, 192 }
#define COLOR_GRAY_3     { 229, 229, 229 }
#define COLOR_GRAY_4     { 226, 226, 226 }
#define COLOR_GRAY_5     { 245, 245, 245 }
#define COLOR_RED_1      { 255, 000, 000 }
#define COLOR_RED_2      { 160, 000, 000 }
#define COLOR_RED_3      { 190, 000, 000 }
#define COLOR_YELLOW_1   { 255, 255, 225 }
#define COLOR_YELLOW_2   { 255, 255, 121 }
#define COLOR_BROWN_1    { 143, 103, 080 }
#define COLOR_CYAN_1     { 215, 255, 255 }
#define _FUNDO_GET       COLOR_ORANGE_1
#define _LETRA_GET_1     COLOR_YELLOW_1


Compilação, parecida com a anterior, só altera a LIB.

hbmk2 *.prg gtwvg.hbc hmge.hbc


E resultado com F9, aparecendo o browse GUI.
Coindidiu até de um papel de parede de olho no resultado.... rs

telahmge.png


Acho que isso abre muitas possibilidades pra conversão de um aplicativo.
Permite a migração parcial, sempre deixando em uso no cliente.
Bom pra já testar na prática cada alteração.

Quanto à compilação, é o de sempre: indicar LIBs, indicar pastas de LIB, pastas de include, etc.
É que criei os HBCs de cada GUI, com essa informação.
Algo como usar os antigos LNK do Clipper, só altera a sintaxe de se fazer isso.
Algumas das LIBs até já tem isso pronto.

É pensar em modo Clipper/Harbour, e tentar fazer que a LIB trabalhe do jeito que você quer.
Deve ter jeito melhor, mas antes de entrar fundo já dá pra "sentir" como será o trabalho pra fazer, e o resultado.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

"Começando" com GUI

Mensagempor Toledo » 16 Mai 2017 07:35

JoséQuintas escreveu:- Um browse com opção de ir digitando e filtrando (ou pelo menos a idéia de como isso pode ser feito), e ao teclar ENTER selecionar um conteúdo a ser especificado (código por exemplo)


Veja um outro exemplo em MiniGui Extended:

http://www.pctoledo.com.br/forum/filebase.php?d=1&id=203&c_old=0&what=c&page=1

Abraços
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3038
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 263 vezes
Mens.Curtidas: 258 vezes

"Começando" com GUI

Mensagempor JoséQuintas » 17 Mai 2017 09:51

Os dois exemplos anteriores em um único.
Criei esta rotina, além das já existentes.

FUNCTION Pesquisa( cText )

   STATIC nCont := 1

   DO CASE
   CASE nCont == 1 ; PesquisaHWgui( @cText )
   CASE nCont == 2 ; PesquisaHmge( @cText )
   ENDCASE
   nCont := iif( nCont == 1, 2, 1 )

   RETURN NIL


É só pra exemplo.
A cada F9 pode aparecer a pesquisa ou em HMGE ou em HWGUI.

São as mesmas rotinas anteriores, e as mesmas telas anteriores, mas tudo no mesmo aplicativo/EXE, rodando ao mesmo tempo.
Necessita modificar levemente HWGUI e HMGE, deixando errorsys.prg única e renomeando algumas funções de LIB.
Acrescentei o EXE, porque não dá pra usar as LIBs normais neste.

Resumindo o projeto:
Aplicativo básico GTWVG, que faz uso de browse em HMGE e browse em HWGUI.
Não faz uso de multithread.

Aqui compilo usando:
hbmk2 *.prg hwgui.hbc hmge.hbc

Nota: Curioso que se acrescentar gtwvg.hbc dá conflito entre as LIBs.
Anexos
test.zip
(787.83 KiB) Baixado 188 vezes
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

"Começando" com GUI

Mensagempor JoséQuintas » 17 Mai 2017 11:09

Pra quem estiver interessado nessas misturas:

Pra forçar entrar a GTWVG no aplicativo, independente se vai usar recursos dela ou não:

PROCEDURE HB_GTSYS
   REQUEST HB_GT_WVG_DEFAULT
   RETURN


Pra não ter conflito com as demais, se não usar nada específico da GTWVG,, só indicar a LIB -lgtwvg ao invés de gtwvg.hbc
O ideal é criar pastas diferentes pros fontes em cada GUI pra não ter conflito dos CH.
A partir daí, pode usar as LIBs normalmente.

Numa explicação simples: GTWVG transforma seu aplicativo numa janela Windows.
Janelas são o que o Windows usa e o que as LIBs usam.

O principal detalhe sobre janelas Windows é que Main() comanda o encerramento do aplicativo.
Pode ser visível ou não.
Quando o aplicativo fica "zumbi", que precisa encerrar no gerenciador de tarefas, é porque Main() ainda está rodando.
Pode existir uma Main() em GTWVG, outra em HWGUI outra em minigui, e justamente isso pode gerar problemas.
A minigui deixa desativar a necessidade de Main(), isso resolve muito bem.
A HWGUI permite criar janelas de diálogos que não dependem de Main(), isso também ajuda.
Talvez exista algum parâmetro em HWGUI pra não obrigar Main() ou talvez possam criar isso, se for necessário, caso isso limite alguma coisa.

Deste jeito, qualquer um que tenha aplicativo console pode começar a se aventurar no mundo GUI de imediato.
E se for alguém que está sendo pressionado pra fazer uma versão Windows, já vai poder mostrar alguma janela GUI e aliviar a pressão, e voltar a trabalhar tranquilo.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

"Começando" com GUI

Mensagempor JoséQuintas » 17 Mai 2017 11:50

Esqueci: Valeu pelos exemplos.
Tem também outro de hwgui usando DBF, que o Itamar postou no tópico hwgui.
É um exemplo simples, mas bom, porque comparando com o anterior, o funcionamento é igual ao tbrowse do Clipper, que todos estão acostumados (ou a maioria).

FUNCTION J_A( ... )

   LOCAL oDlg, oBrw

   INIT DIALOG oDlg CLIPPER NOEXIT AT 0, 0 SIZE 300,200

   @ 10, 10 BROWSE oBrw DATABASE OF oDlg SIZE 200,150 APPEND

   ADD COLUMN FieldBlock( "CODIGO" ) TO oBrw EDITABLE Header "CODIGO" LENGTH 4
   ADD COLUMN FieldBlock( "NOME" )   TO oBrw EDITABLE HEADER "NOME"   LENGTH 30

   oDlg:Activate(.T.)

   RETURN NIL


Esse vai ser meu ponto de partida, porque tbrowse é o que já uso, então à primeira vista se encaixa com meus fontes.

O desafio vai ser interessante, porque com multimonitor e 4k, começa em definir tamanho de janela e de fonte pra funcionar em qualquer lugar.
Vai ser mais interessante ainda se "trocar figurinha" entre gtwvg e hwgui.
Como a gtwvg redimensiona automático, seria só aproveitar os mesmos parâmetros na hwgui pra tamanho de janela e tamanho de fonte.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

"Começando" com GUI

Mensagempor JoséQuintas » 19 Mai 2017 03:37

As rotinas de browse pra HMG indicadas vão ser boas pra MySQL.
Pra DBF achei mais interessante este exemplo, que dá pra comparar um pouco com tbrowse, bem pouco... rs

https://github.com/PaulinhoBiaCao/AllGui/blob/master/hmge/SAMPLES/BASIC/BROWSE_SEARCH/demo.prg
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

"Começando" com GUI

Mensagempor JoséQuintas » 19 Mai 2017 04:39

Agora entendi porque preferem fazer por arrray.
Nem parece que o browse de DBF foi feito pra Harbour....
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

"Começando" com GUI

Mensagempor JoséQuintas » 19 Mai 2017 13:52

Esqueçam tudo que eu disse sobre misturar LIBs.
Aqui após chamar o browse da HMG Extended.
Simplesmente a codepage mudou.

teste1.png


teste2.png


Mas se não tem comando alterando a codepage.

#include 'hmg.ch'
#include "i_winuser.ch"

MEMVAR cMe, cBrowseName, cWindowName, cSearchString, cWorkArea

FUNCTION HmgeBrowse( ... )

   LOCAL nCont, aHeaders := {}, aFields := {}, aWidths := {}
   STATIC nWindow := 0
   PRIVATE cMe, cBrowseName, cWindowName, cSearchString := "", cWorkArea := Alias()

   nWindow += 1
   cMe := "Pesquisa" + StrZero( nWindow, 4 )

   SET WINDOW MAIN OFF
   SET BROWSESYNC  ON

   FOR nCont = 1 TO FCount()
      AAdd( aHeaders, FieldName( nCont ) )
      AAdd( aFields,  FieldName( nCont ) )
      AAdd( aWidths,  FieldLen( nCont ) * 10 )
   NEXT

   DEFINE WINDOW &cMe ;
      AT     0, 0 ;
      WIDTH  800 ;
      HEIGHT 605 ;
      TITLE  "Pesquisa em " + Alias() ;
      MODAL  ;
      NOSIZE ;
      ON INIT cWindowName := This.Name

      ON KEY ESCAPE ACTION thiswindow.release

      DEFINE STATUSBAR
         STATUSITEM "ENTER Seleciona"
         KEYBOARD
      END STATUSBAR

      END WINDOW

   @ 5, 5 BROWSE grid_pesquisa ;
      OF       &cMe ;
      WIDTH    795 ;
      HEIGHT   430 ;
      HEADERS  aHeaders ;
      WIDTHS   aWidths ;
      WORKAREA &cWorkArea ;
      FIELDS   aFields ;
      ; // JUSTIFY  { BROWSE_JTFY_LEFT, BROWSE_JTFY_RIGHT, BROWSE_JTFY_LEFT, BROWSE_JTFY_LEFT } ;
      ON GOTFOCUS cBrowseName := This.Name

   CREATE EVENT PROCNAME BrowseKeys()

   DoMethod( cMe, "center" )
   DoMethod( cMe, "activate" )

   RETURN NIL

FUNCTION BrowseKeys( hWnd, nMsg, wParam, lParam )

   LOCAL nKey, cKey, cWindowName := cMe

   HB_SYMBOL_UNUSED( hWnd )
   HB_SYMBOL_UNUSED( wParam )

   IF nMsg != WM_NOTIFY
      RETURN NIL
   ENDIF

   IF ! _IsControlDefined( cBrowseName, cWindowName ) .OR. GetHwndFrom( lParam ) != GetProperty( cWindowName, cBrowseName, "Handle" )
      RETURN NIL
   ENDIF

   IF ! GetNotifyCode( lParam ) == LVN_KEYDOWN
      RETURN NIL
   ENDIF

   nKey := GetGridvKey( lParam )

   DO CASE
   CASE nKey == VK_UP
      _BrowseUp( cBrowseName, cWindowName )
      RETURN ClearSearch()

   CASE nKey == VK_DOWN
      _BrowseDown( cBrowseName, cWindowName )
      RETURN ClearSearch()

   CASE nKey == VK_HOME
      _BrowseHome( cBrowseName, cWindowName )
      RETURN ClearSearch()

   CASE nKey == VK_END
      _BrowseEnd( cBrowseName, cWindowName )
      RETURN ClearSearch()

   CASE nKey == VK_PRIOR
      _BrowsePrior( cBrowseName, cWindowName )
      RETURN ClearSearch()

   CASE nKey == VK_NEXT
      _BrowseNext( cBrowseName, cWindowName )
      RETURN ClearSearch()

   OTHERWISE
      cKey := Chr( nKey )
      IF IsAlpha( cKey ) .OR. IsDigit( cKey ) .OR. nKey == VK_BACK
         RETURN IncrementalSearch( cKey, nKey )
      ENDIF

   ENDCASE

   RETURN NIL

STATIC FUNCTION ClearSearch()

   cSearchString := ""
   SetProperty( cWindowName, "StatusBar", "Item", 1, "" )

   RETURN 1

STATIC FUNCTION IncrementalSearch( cKey, nKey )

   LOCAL nOldRec

   IF nKey == VK_BACK
      cSearchString := iif( Len( cSearchString ) > 1, Left( cSearchString, Len( cSearchString ) - 1 ), "" )
   ELSE
      cSearchString += cKey
   ENDIF

   nOldRec := RecNo()
   IF dbSeek( Upper( cSearchString ), .T. )
      SetProperty( cWindowName, cBrowseName, "Value", RecNo() )
   ELSE
      cSearchString := iif( Len( cSearchString ) > 1, Left( cSearchString, Len( cSearchString ) - 1 ), "" )
      SetProperty( cWindowName, cBrowseName, "Value", nOldRec )
   ENDIF

   SetProperty( cWindowName, "StatusBar", "Item", 1, "Quicksearch: " + iif( Empty( cSearchString ), "", cSearchString ) )
   DoMethod( cWindowName, cBrowseName, 'Setfocus' )

   RETURN 1


Significa que a configuração do Harbour não vale nada pra LIB.
Além de problemas com tela, pode trazer problemas de índices corrompidos, bases de dados danificadas, problemas com API Windows, e outras coisas mais.
E nem adianta tirar dúvida no fórum do Harbour sobre isso, porque não tem a ver com o Harbour.....

Isso torna o mix perigoso.
Não sei dizer sobre Main() em HMG.

Estou me referindo a misturar LIBs, e não a LIB sozinha.

Nota:
A HMGE deve usar sua própria codepage pras chamadas à API do Windows funcionarem. Tudo bem, foi projetada pra funcionar sozinha, e com Harbour/xHarbour.

Talvez baste um save/restore da codepage, não sei dizer.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Próximo



Retornar para Harbour

Quem está online

Usuários vendo este fórum: Google Adsense [Bot] e 6 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro