HARBOUR + GTWVG + HMG 3.4.4

General Help regarding HMG, Compilation, Linking, Samples

Moderator: Rathinagiri

Post Reply
MICROVOLUTION
Posts: 146
Joined: Sat May 30, 2015 5:15 am

HARBOUR + GTWVG + HMG 3.4.4

Post by MICROVOLUTION »

Boa noite amiguinhos!
Todos os meus códigos já estão "migrados" de clipper para harbour, usando a IDE/HMG (sem uso de formulários e das facilidades que a IDE nos oferece).
Aos poucos estão implantando os gráficos. E, por falar em programação GUI sou bem fraco.
Então, tenho um MAIN.PRG que chama diversos módulos. Todos estão em modo CONSOLE.

Estou desenvolvendo uma tela em modo GUI para um "mercadinho" e já quero impressioná-lo com um ambiente GRÁFICO (GUI) bem bonitinho.

Então, os códigos que estão em 100% harbour que chamam o módulo em GTWVG são estes:

Code: Select all

 @ 04 ,66 get mCDPRODUTO picture pCDPRODUTO  when empty (mCDPRODUTO)      valid fCDPRODUTO_WVG ()
	                @ 08 ,72 get mQT_VENDA  picture pQT_VENDA   valid fQT_VENDA_WVG ()
	                read
Observem que as linhas acima, todos já estão acostumados, pois é um código 100% clipper migrado para 100% harbour.

Agora, a função abaixo, contém a fCDPRODUTO_WVG()

Code: Select all

static function fCDPRODUTO_WVG ()
     local ARQUIVO := select ()

     LIMPA_MENSAGEM ()
     if lastkey () <> K_UP
          if empty (mCDPRODUTO)
            mostra_listagem_prd_hmg()
               select (ARQUIVO)
               return (.f.)
          endif
          select ('DCI10010') // arquivo de produtos já indexado no início do main
          if .not. EXISTE (str (mCDPRODUTO,13) )
               MsgInfo('C¢digo do Produto n„o cadastrado')
               mostra_listagem_prd_hmg()
               select (ARQUIVO)
               return (.f.)
          endif
          mDSPRODUTO := left (DSPRODUTO,32)
          mVR_UNITAR := VR_PREVEN * (1+(mVR_PERJUR/100))
        AAdd( aPaint, { "Label8", {|| Wvt_DrawLabel( 02, 01, mDSPRODUTO, 00, 00, RGB( 220, 220, 220 )   , RGB( 063, 096, 150 ), "Arial"         , 30, , , , , .f., .f., .f. ) },       { WVT_BLOCK_LABEL, 01, 02, ,  } } )
               mCD_GRADE := DSUNIDADE
          select (ARQUIVO)
     endif
return
As linhas acima estão num mix de CONSOLE usando os gráficos da GTWVG - que é nativa na HMG 3.4.4.

Agora a função abaixo: função MOSTRA_LISTAGEM_PRD_HMG() - foi feita em harbour + HMG (100% gui):

Code: Select all

static function mostra_listagem_prd_hmg()
       define window form_pesquisa;
              at 0,0;
              width 760;
              height 610;
              title 'DCI10010 - Produtos';
              icon 'icone';
              modal;
              nosize

              define grid grid_pesquisa
                     parent form_pesquisa
                     col 0
                     row 0
                     width 755
                     height 580
                     headers {'Código','Nome','Preço R$'}
                     widths {140,460,130}
                     showheaders .F.
                     nolines .T.
                     fontname 'courier new'
                     fontsize 12
                     backcolor {157,255,255}
                     fontcolor BLACK
                     ondblclick mostra_informacao_prd_hmg()
                onenter mostra_informacao_prd_hmg()
              end grid

              on key escape action thiswindow.release

       end window

      popula_grid_prd_hmg()
      
       form_pesquisa.grid_pesquisa.setfocus
       form_pesquisa.grid_pesquisa.value := 1

       form_pesquisa.center
       form_pesquisa.activate
return(nil)
agora vejam mais que está no código acima: Função "popula_grid_prd_hmg()":

Code: Select all

static function popula_grid_prd_wvg()

       // local ARQUIVO := select ()
       delete item all from grid_pesquisa of form_pesquisa
       dbselectarea('DCI10010')
       DCI10010->(dbgotop())

       while .not. eof()
              add item {alltrim(str(DCI10010->CDPRODUTO)),alltrim(DCI10010->DSPRODUTO),trans(DCI10010->VR_UNITAR,'@E 999,999.99')} to grid_pesquisa of form_pesquisa
             DCI10010->(dbskip())
       end
return(nil)
Função MOSTRA_INFORMACAO_PRD_HMG()

Code: Select all

static function mostra_informacao_prd_hmg()
       local x_codigo := valor_coluna('grid_pesquisa','form_pesquisa',1)
       local x_nome   := valor_coluna('grid_pesquisa','form_pesquisa',2)
      _codigo   := val(x_codigo)
      _nome     := alltrim(x_nome)
      mNMPRODUTO:=_nome
      
       form_pesquisa.release // tanto faz esta linha quanto a abaixo o resultado não fica como o esperado.
       // form_pesquisa.minimize
eturn(nil)

Code: Select all

FUNÇÃO VALOR_COLUNA():
function valor_coluna(xObj,xForm,nCol)
        local nPos := GetProperty(xForm,xObj,'Value')
        local aRet := GetProperty(xForm,xObj,'Item',nPos)
return aRet[nCol]
Até aqui tudo funciona corretamente.
Bom, conclusão da brincadeira:
- a compilação foi feita usando a interface IDE/HMG 3.4.4 com apenas a inclusão da GTWVG na lista de libs;
- no início do main só contém #include "hmg.ch"
- não contém #require "gtwvg"
- tudo funciona perfeitamente, exceto que:

1) no momento de ESC do formulário 100% HMG o controle retorna para o GET 100% harbour perfeitamente (nem sempre. às vezes trava a tela feita em GTWVG que chamou a tela FORM HMG). PONTO POSITIVO;
2) quando do DUPLO CLIQUE ou do ENTER para escolher o produto, o FORMULÁRIO 100% HMG fecha mas parece que trava a TELA anterior que contém o GET e o relógio fica travado. Nada mais funciona, a não ser fechar o sistema com o clique no X da janela.

Tirando isso, podem observar que há misturas gráficas e perfeitas entre as LIBs GTWVG e HMG-3, mas, que não retorna o controle para o GET, no caso, do produto.

Se, o Roberto Lopez, Dr. Soto e demais, tiverem uma ideia, vamo que vamo!
vlw!

Ah! já ia me esquecendo:
vejam as 3 telas, por favor!
tela PDV 01 - antes.png
tela PDV 01 - antes.png (12.06 KiB) Viewed 4113 times
tela PDV 02 - durante.png
tela PDV 02 - durante.png (39.35 KiB) Viewed 4113 times
tela PDV 03 - após.png
tela PDV 03 - após.png (15.71 KiB) Viewed 4113 times
O Dr. Soto, me respondeu num outro fórum, mas, não compreendi, bem, a causa do travamento do sistema:
Mensagempor Claudio Soto » 02 Mar 2018 17:41

Existe:
Set Window Main off
Es original de hmg oficial y por defecto en hmg.3.4.4 es off
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com


uma coisa q estou observando, é que parece que não há conexão entre as variáveis das libs ao retornar:
exemplo:
- a primeira tela (harbour + gráficos da gtwvg main) chama a PESQUISA (form window modal da HMG) no momento do ENTER; até aí tudo bem:
- então, a PESQUISA é realizada.
- quando se pressiona ENTER ou DUPLO CLIQUE do mouse, o valor deveria ser retornado, parece que é apagado no momento do THISWINDOW.RELEASE

Aí fiz um outro teste:
- usei a minha antiga função CRIABROWSE em 100% harbour pra ser chamada, neste caso do exemplo acima a PESQUISA;
- quando a PESQUISA é satisfeita e a gente pressionar enter (não tem o mouse neste caso), existe as seguintes linhas que retornam do TBROWSEDB para a variável que acionou a PESQUISA:

Code: Select all

                       case valtype (VALOR) = 'N'
                              if set (_SET_CONFIRM)
                                   keyboard strtran (str (VALOR),' ','0') + chr (K_ENTER)
                              else
                                   keyboard strtran (str (VALOR),' ','0')
                              endif
As linhas de código acima, fazem com que o KEYBOARD retorne para a variável anterior (a que chamou a pesquisa) seja preenchida.
- Isso deu certo, só que a tela fica embolada, pois estamos usando as funções gráficas da GTWVG.

Então, fiz um pequeno acréscimo no código da função CRIABROWSE e a renomeei para CRIABROWSE_WVG.
Bem no início (após as declarações LOCAL), acrescentei os códigos abaixo, para que a tela seja aberta como CRT() em MODAL:

Code: Select all

   LOCAL oCrt, nSel
   LOCAL aPnt   := WvtSetPaint( {} )
   LOCAL aPaint := {}   
   oCrt := WvgCrt():New( , , { 0, 0 }, { MaxRow(), MaxCol() }, , .T. )

   oCrt:lModal      := .T.
   oCrt:resizable   := .F.
   oCrt:closable    := .F.
   oCrt:title       := "SiCCA v3.6.04 - CONSULTA ARQUIVO - " + NOME_ARQUIVO
   // oCrt:icon        := hb_DirBase() + "vr_1.ico"

   oCrt:Create()
   oCrt:show()

   AAdd( aPaint, { "Box_V", {|| Wvt_DrawBoxRaised( 2, 2, MaxRow()-4, MaxCol()-3 ) }, NIL, { WVT_BLOCK_BOX, 2, 2, MaxRow()-4, MaxCol()-3 } } )
   WvtSetPaint( aPaint )

   SetColor( "N/W" )
   CLS
depois pra encerrar a tela e voltar à anterior, acrescentei:
oCrt:Destroy()
WvtSetPaint( aPnt )
Aí, pude constatar que só com este acréscimo de linhas, os valores do KEYBOARD não são repassados para a tela anterior.
- Parece que o que acontece no oCRT, fica nele, e, após o oCRT:DESTROY() tudo o que aconteceu lá dentro é como se as variáveis não tivesse existido, e, aí os valores não repassam.

- Ao fazer a tentativa na HMG, a impressão é a mesma.
Parece que ao finalizar o THISWINDOW.RELEASE, tudo o que estava lá é pertido, e, por isso o GET que chamou a PESQUISA (seja em GTWVG ou HMG) não devolve os valores.

- Talvez existe uma solução simples pra isso, mas, não faço a mínima ideia.
MICROVOLUTION
Posts: 146
Joined: Sat May 30, 2015 5:15 am

Re: HARBOUR + GTWVG + HMG 3.4.4

Post by MICROVOLUTION »

Alguém até sugeriu a solução :
A solução para o seu problema já estava feita, como fui eu quem fez essa tela e essa rotina
sim... claro e obrigado.
o detalhe, não está no setproperty...
parece q ao fechar o form, as libs não se comunicam.
então, o GET (que é 100% harbour) não recebe da FORM_HMG que acabou de fechar o valor que a função repassa.

Ou teremos que tentar outra solução, ou, fazer tudo em GTWVG, ou tudo 100% harbour, ou tudo HMG 100% GUI...

Pelo que entendi do exemplo do Quintas usando HARBOUR (CONSOLE) + pesquisa em (HWGUI ou HMG-E) o valor foi retornado.
Vamos tentando aqui achar o erro...
vlw!
MICROVOLUTION
Posts: 146
Joined: Sat May 30, 2015 5:15 am

Re: HARBOUR + GTWVG + HMG 3.4.4

Post by MICROVOLUTION »

Ah! tem mais:
como eu disse, fiz um teste aqui usando o tradicional TBROWSEDB.

Percebo então 2 situações (USANDO APENAS HAROUR 3.2 + GTWVG):

- 1 ) se usar o TBROWSE em 100% console, apesar da tela ficar muito estranha pois os gráficos ficam embolados junto com a tela que chamou - no caso a main que usa os DRAWs da GTWVG, mas, assim que pressionamos ENTER essa tela (toda mistura) encerra e o GET recebe o código que a gente realmente precisa;
- 2 ) se eu acrescenter o WVGCRT pra separar as telas - só isso, já faz com que ao pressionar o ENTER o objeto TBROWSEDB não retorna para o GET com os valores.

O que concluo:
- a ) se fizer uma tela principal em gráficos da GTWVG que chama a pesquisa feita em HMG, ao fechar o form não temo como repassar para o GET pelo SETPROPERTY, pois a função SETPROPERTY pelo que eu saiba é exclusiva da HMG e na GTWVG não há formulários declarados;
- b ) se eu fizer a tela em GTWVG e chamar um simples TBROWSEDB comum, funciona e repassa de volta as informações para o GET. Mas, a tela fica embolada, por misturar gráficos da GTWVG com CONSOLE. E, pelo que sabemos, os gráficos tem prioridade após desenhados;
- c ) se fizer a alteração na pesquisa usando o objeto WVGCRT() a tela não mais embola, mas, ao der o ENTER a informação não volta para o GET.

Como compilo de dentro da IDE/HMG 3.4.4 que tem na contrib\gtwvg, não sei realmente o que fazer.

O que sei, e, que tento sempre dizer, que o sistema está funcionando do jeito que está, mas, aos poucos preciso ir acrescentando os gráficos e isso já temos feito.

Agora a tela, pra funcionar no meu caso, eu preciso de estar com tudo 100% em HMG, pois o SETPROPERTY() não transfere para GTWVG.

vou continuar aqui "googlequizando" pra ver se encontro e, outros que estiverem essa mesma dúvida/curiosidade possam ser beneficiados, para o bem comum de nossa linguagem que já deu um passo ao sair do 16b vindo para 32b e 64b.

Abraços!
MICROVOLUTION
Posts: 146
Joined: Sat May 30, 2015 5:15 am

Re: HARBOUR + GTWVG + HMG 3.4.4

Post by MICROVOLUTION »

Outro detalhe que descobri...
e que me "abriu" um leque dizendo que:
- GUI x GUI se comunicam;
- CONSOLE x CONSOLE se comunicam;
- CONSOLE x GUI não se comunicam;
- GUI x CONSOLE não se comunicam;
mas,
- HARBOUR x HARBOUR se comunicam.

Então, vou pensar numa forma em que a variável seja preenchida... vou testar...
...

agora no DEMOWVG (vouch) tem dentro de si um exemplo do _TBROWSE.PRG, mas, achei muito complexo e nele não tem nenhum ENTER ou CLIQUE DUPLO para pegar o valor e devolver para o DEMOWVG.
Tentei adaptar mas achei muito complexo o entendimento.
Vou continuar aqui tentando possibilidades e "jogar pedra em avião", quem sabe rsrsrsrsrs... só pra descontrair...
User avatar
bpd2000
Posts: 1207
Joined: Sat Sep 10, 2011 4:07 am
Location: India

Re: HARBOUR + GTWVG + HMG 3.4.4

Post by bpd2000 »

I think best place to get help for GTWVG is
https://groups.google.com/forum/#!forum/harbour-users

This forum will help you for Harbour+HMG i.e. GUI of Harbour
Last edited by bpd2000 on Mon Mar 05, 2018 3:56 am, edited 1 time in total.
BPD
Convert Dream into Reality through HMG
MICROVOLUTION
Posts: 146
Joined: Sat May 30, 2015 5:15 am

Re: HARBOUR + GTWVG + HMG 3.4.4

Post by MICROVOLUTION »

bpd2000 wrote: Sun Mar 04, 2018 5:00 am This forum will help you for Harbout+HMG i.e. GUI of Harbour
sim concordo contigo, e, desculpa-me.
Mas, talvez o título esteja mau colocado.
Poderia ser assim: FORM HMG não retorna valores para GET.
O problema que estou passando - pelo que já devo ter entendido, é que ao fechar o FORM da HMG o controle não volta para o GET que é 100% harbour. Não importa se está gráfico com a GTWVG.
Ok?
Mas, para você entender é necessário ver todas as minhas postagens inclusive os códigos-fontes, que entenderá bem o que está acontecendo.
Bom, se alguém mais tiver alguma sugestão...
abraços!
Post Reply