Página 1 de 5

HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN

Enviado: 01 Fev 2021 09:29
por microvolution
Bom dia a Todos(as)!
Migramos um grande sistema para harbour usando a HMG modo console.
Para LIB gráfica (temporária) usamos a GTWVG que vem inclusa na HMG 3.4 e 3.5 dentro da pasta \CONTRIBS\
Então, o sistema está rodando certinho...
Agora, estamos querendo aos poucos fazer as trocas das telas e implantando-as no cliente final, pois será um trabalho manual e árduo.
Então, começamos pelo começo:
TROCAR AS TELAS:
- DE SPLASH;
- DE LOGIN;
- TELA PRINCIPAL.

Bom, agora a pergunta que não quer calar:
Como faço para ACIONAR/CHAMAR telas em modo CONSOLE (@ SAY, GET, READ) que ainda não foram substituídas com o FORM WINDOW (@ LABEL, TEXTBOX, BUTTONS, etc), de dentro do FORM WINDOW (MAIN MENU) sem a necessidade de usar qualquer outra LIB GRÁFICA?
ou seja, sem necessidade de usar GTWVG, GTWVW, etc?

HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN

Enviado: 01 Fev 2021 10:26
por JoséQuintas
microvolution escreveu:ou seja, sem necessidade de usar GTWVG, GTWVW, etc?
Impossível.

HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN

Enviado: 01 Fev 2021 11:42
por marcosgambeta
Tente compilar este exemplo e veja se é o que deseja fazer:

Código: Selecionar todos

#include "minigui.ch"
#include "hbgtinfo.ch"

REQUEST hb_gt_gui_default
REQUEST hb_gt_wvt

PROCEDURE Main()

   DEFINE WINDOW MainWindow ;
      AT 100, 100 ;
      WIDTH 640 ;
      HEIGHT 480 ;
      TITLE "Teste" ;
      MAIN

      DEFINE MAIN MENU
         POPUP "Menu"
            ITEM "Janela 1" ACTION telaconsole1()
            ITEM "Janela 2" ACTION telaconsole2()
         END POPUP
      END MENU

   END WINDOW

   ACTIVATE WINDOW MainWindow

RETURN

STATIC FUNCTION telaconsole1()

   LOCAL cCampo1 := space(30)

   hb_gtReload("WVT")

   CLS

   hb_gtInfo( HB_GTI_WINTITLE, "Janela console 1" )
   hb_gtInfo( HB_GTI_ALTENTER, .T. )
   hb_gtInfo( HB_GTI_CLOSABLE, .F. )

   @ 10,10 SAY "CAMPO1:" GET cCampo1

   READ
   
   ? cCampo1

   WAIT

   hb_gtReload("GUI")

RETURN NIL

STATIC FUNCTION telaconsole2()

   LOCAL cCampo1 := space(30)
   LOCAL cCampo2 := space(50)

   hb_gtReload("WVT")

   CLS

   hb_gtInfo( HB_GTI_WINTITLE, "Janela console 2" )
   hb_gtInfo( HB_GTI_ALTENTER, .T. )
   hb_gtInfo( HB_GTI_CLOSABLE, .F. )

   @ 8,10 SAY "CAMPO1:" GET cCampo1
   @ 10,10 SAY "CAMPO2:" GET cCampo2

   READ

   ? cCampo1
   ? cCampo2

   WAIT

   hb_gtReload("GUI")

RETURN NIL
Se for isto, pode servir de ponto de partida.

HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN

Enviado: 01 Fev 2021 13:51
por marcosgambeta
Para evitar que o usuário abra mais de uma janela de console, pode-se usar uma flag (entre outros recursos):

Código: Selecionar todos

#include "minigui.ch"
#include "hbgtinfo.ch"

REQUEST hb_gt_gui_default
REQUEST hb_gt_wvt

STATIC lFlag := .F.

PROCEDURE Main()

   DEFINE WINDOW MainWindow ;
      AT 100, 100 ;
      WIDTH 640 ;
      HEIGHT 480 ;
      TITLE "Teste" ;
      MAIN

      DEFINE MAIN MENU
         POPUP "Menu"
            ITEM "Janela 1" ACTION telaconsole1()
            ITEM "Janela 2" ACTION telaconsole2()
         END POPUP
      END MENU

   END WINDOW

   ACTIVATE WINDOW MainWindow

RETURN

STATIC FUNCTION telaconsole1()

   LOCAL cCampo1 := space(30)

   IF lFlag
      RETURN NIl
   ENDIF

   lFlag := .T.

   hb_gtReload("WVT")

   CLS

   hb_gtInfo( HB_GTI_WINTITLE, "Janela console 1" )
   hb_gtInfo( HB_GTI_ALTENTER, .T. )
   hb_gtInfo( HB_GTI_CLOSABLE, .F. )

   @ 10,10 SAY "CAMPO1:" GET cCampo1

   READ

   ? cCampo1

   WAIT

   hb_gtReload("GUI")

   lFlag := .F.

RETURN NIL

STATIC FUNCTION telaconsole2()

   LOCAL cCampo1 := space(30)
   LOCAL cCampo2 := space(50)

   IF lFlag
      RETURN NIl
   ENDIF

   lFlag := .T.

   hb_gtReload("WVT")

   CLS

   hb_gtInfo( HB_GTI_WINTITLE, "Janela console 2" )
   hb_gtInfo( HB_GTI_ALTENTER, .T. )
   hb_gtInfo( HB_GTI_CLOSABLE, .F. )

   @ 8,10 SAY "CAMPO1:" GET cCampo1
   @ 10,10 SAY "CAMPO2:" GET cCampo2

   READ

   ? cCampo1
   ? cCampo2

   WAIT

   hb_gtReload("GUI")

   lFlag := .F.

RETURN NIL

HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN

Enviado: 01 Fev 2021 16:08
por JoséQuintas
Tá aí uma solução interessante.
Ao trocar pra "janela GUI", a janela GTWVG é liberada, porque nada mais prende a janela.

Funciona também com hb_gtLoad( "WVG" ) nos dois lugares.
Isso porque a "nova" janela WVG não foi aberta, e não existe.

HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN

Enviado: 01 Fev 2021 16:20
por asimoes
Se quiser mostrar a tela maximizada:

Hb_GtInfo( HB_GTI_MAXIMIZED, .T. )

HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN

Enviado: 01 Fev 2021 16:29
por JoséQuintas
Fiz um teste adicional, mas executa uma janela por vez.

Código: Selecionar todos

            ITEM "As duas"  ACTION { || TelaConsole1(), TelaConsole2() }
Mas fiz outra coisa: chamar a opção 1 e depois chamar a opção 2

Fica a execução da opção 2 e depois trava tudo.

NÃO vai poder ter duas janelas WVG abertas, tem que ser uma de cada vez.

Já prepare pra evitar o travamento.

HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN

Enviado: 01 Fev 2021 16:34
por asimoes
Funciona +- com a HwGUi o problema é isso

@ 10,10 SAY "CAMPO1:" GET cCampo1

A hwgui tem o objeto say e quando a tela é exibida não mostra nada, tem conflito

HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN

Enviado: 01 Fev 2021 16:40
por JoséQuintas
Já acrescentei como exemplo na HMG.
IMPEDIR a abertura de mais de uma janela é OBRIGATÓRIO.
E nem pode ter mensagem de alerta, pelo menos não da GTWVG.
demo.prg
(1.21 KiB) Baixado 194 vezes
Nota: talvez aí possa entrar a wvgCrt()

HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN

Enviado: 01 Fev 2021 16:50
por JoséQuintas
Só comentário:

Acho que fica interessante usar só o hb_gtLoad( "WVG" ) nos dois lugares, assim fica claro que é uma necessidade da GTWVG, e não uma interferência da LIB gráfica.
Do mesmo jeito que aconteceria com GTWVG sozinha, vai acontecer com ela misturada a LIB gráfica.
Não é o fato de poder chamar duas vezes a janela GTWVG, que vai transformar a janela default em multithread.

Talvez com wvgCrt() dê certo, ou talvez precise de outra janela GTWVG Main escondida.

HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN

Enviado: 01 Fev 2021 16:51
por asimoes
Talvez em uma janela thread, funcione

HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN

Enviado: 01 Fev 2021 16:52
por marcosgambeta
Segue outro exemplo para testes, usando hb_gtCreate e hb_gtSelect:

Código: Selecionar todos

#include "minigui.ch"
#include "hbgtinfo.ch"

REQUEST hb_gt_gui_default
REQUEST hb_gt_wvt

STATIC lFlag := .F.

PROCEDURE Main()

   DEFINE WINDOW MainWindow ;
      AT 100, 100 ;
      WIDTH 640 ;
      HEIGHT 480 ;
      TITLE "Teste" ;
      MAIN

      DEFINE MAIN MENU
         POPUP "Menu"
            ITEM "Janela 1" ACTION telaconsole1()
            ITEM "Janela 2" ACTION telaconsole2()
         END POPUP
      END MENU

   END WINDOW

   ACTIVATE WINDOW MainWindow

RETURN

STATIC FUNCTION telaconsole1()

   LOCAL pNewGT
   LOCAL pOldGT
   LOCAL cCampo1 := space(30)

   IF lFlag
      RETURN NIl
   ENDIF

   lFlag := .T.

   //hb_gtReload("WVT")
   pNewGT := hb_gtCreate( "WVT" )
   pOldGT := hb_gtSelect( pNewGT )

   CLS

   hb_gtInfo( HB_GTI_WINTITLE, "Janela console 1" )
   hb_gtInfo( HB_GTI_ALTENTER, .T. )
   hb_gtInfo( HB_GTI_CLOSABLE, .F. )

   @ 10,10 SAY "CAMPO1:" GET cCampo1

   READ

   ? cCampo1

   WAIT

   //hb_gtReload("GUI")
   hb_gtSelect( pOldGT )
   pNewGT := NIL

   lFlag := .F.

RETURN NIL

STATIC FUNCTION telaconsole2()

   LOCAL pNewGT
   LOCAL pOldGT
   LOCAL cCampo1 := space(30)
   LOCAL cCampo2 := space(50)

   IF lFlag
      RETURN NIl
   ENDIF

   lFlag := .T.

   //hb_gtReload("WVT")
   pNewGT := hb_gtCreate( "WVT" )
   pOldGT := hb_gtSelect( pNewGT )

   CLS

   hb_gtInfo( HB_GTI_WINTITLE, "Janela console 2" )
   hb_gtInfo( HB_GTI_ALTENTER, .T. )
   hb_gtInfo( HB_GTI_CLOSABLE, .F. )

   @ 8,10 SAY "CAMPO1:" GET cCampo1
   @ 10,10 SAY "CAMPO2:" GET cCampo2

   READ

   ? cCampo1
   ? cCampo2

   WAIT

   //hb_gtReload("GUI")
   hb_gtSelect( pOldGT )
   pNewGT := NIL

   lFlag := .F.

RETURN NIL
Os passos são estes:

1. criar o novo GT
2. selecionar o novo GT, recebendo o anterior como retorno
3. usar o GT
4. selecionar o anterior
5. destruir o novo GT

Mas também precisa de controle para não abrir mais de uma vez.

HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN

Enviado: 01 Fev 2021 16:58
por asimoes
Consegui também na HwGui, tem que ser em fontes separados, ai funciona, ou seja não pode hwgui.ch onde vai usar Console

HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN

Enviado: 01 Fev 2021 17:02
por alxsts
Olá!

Tentei compilar o primeiro exemplo com a instalação padrão da Minigui Extended BCC 5.8 que tenho instalados mas está dando o erro abaixo:
C:\MiniGUI\SAMPLES\Advanced\MixGUI-WVT>call ..\..\..\batch\compile.bat demo
Harbour 3.2.0dev (r2011030937)
Copyright (c) 1999-2020, https://harbour.github.io/
Compiling 'demo.prg'...
Lines 23269, Functions/Procedures 3
Generating C source output to 'demo.c'... Done.
demo.c:
Turbo Incremental Link 5.69 Copyright (c) 1997-2005 Borland
Error: Unresolved external '_HB_FUN_HB_GT_WVT' referenced from C:\MINIGUI\SAMPLES\ADVANCED\MIXGUI-WVT\DEMO.OBJ

Link error.
Como resolver isto?

HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN

Enviado: 01 Fev 2021 17:27
por JoséQuintas
Talvez adicionar?

-gtgui
-gtwvt

Lembrando de um uso normal também:

Código: Selecionar todos

ANNOUNCE HB_GTSYS

PROCEDURE HB_GTSYS

   REQUEST HB_GT_GUI
   REQUEIST HB_GT_WVT

   RETURN
O announce obriga que o linqueditor procure nesse fonte antes de qualquer outra coisa.
E a hb_gtsys é um ponto de partida pra GTs.

Algumas LIBs usam isso pra empurrar a GT_GUI sozinha, sem mais nada, e isso pode impedir mudanças.
Mas do jeito acima acaba anulando o que possa existir em lib.