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