Página 2 de 5
HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN
Enviado: 01 Fev 2021 17:33
por marcosgambeta
O arquivo batch\compile.bat usa a gtwin.lib. Experimente isto:
1. Faça uma cópia do arquivo original
2. Para cada ocorrência da gtwin, crie uma linha igual logo abaixo, mas trocando gtwin por gtwvt
Se a compilação for com hbmk2, é apenas questão de usar o parâmetro -gtwvt.
HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN
Enviado: 01 Fev 2021 17:38
por alxsts
Olá!
Mesmo erro. Ele não encontra uma lib onde exista esta função '_HB_FUN_HB_GT_WVT'.
HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN
Enviado: 01 Fev 2021 17:40
por marcosgambeta
Neste último exemplo, com hb_gtCreate e hb_gtSelect, quase foi possível usar duas janelas simultâneas. Mas ocorre este problema:
A digitação, na janela criada por último, funciona normal. Mas na primeira janela, fica presa enquanto a segunda não for fechada.
Quando a segunda é fechada, o que foi digitado na primeira aparece.
Mesmo usando LOCAL getlist := {}, o problema persiste.
HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN
Enviado: 01 Fev 2021 18:00
por asimoes
marcosgambeta escreveu:Neste último exemplo, com hb_gtCreate e hb_gtSelect, quase foi possível usar duas janelas simultâneas. Mas ocorre este problema:
Tentou o uso com thread ?
HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN
Enviado: 01 Fev 2021 18:03
por asimoes
Eu tenho isso na minha aplicação
Código: Selecionar todos
IF pWindowGTI != Nil
wapi_DestroyWindow( pWindowGTI )
ENDIF
HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN
Enviado: 01 Fev 2021 18:05
por JoséQuintas
asimoes escreveu:Tentou o uso com thread ?
Melhor nem complicar.
Se pro usuário já é difícil entender sem multithread, com multithread piorou....
Além disso, com multithread aí sim vai ter que reescrever tudo, ou vai sugerir gambiarra com tudo visível.
É melhor deixar isso pra quem já mexe com isso.
HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN
Enviado: 01 Fev 2021 18:07
por JoséQuintas
Depois, quando sobrar tempo, vou brincar com tudo isso.
Talvez a hb_gtSelect() presa a rotina da LIB GUI, ou coisa do tipo, só testando pra ver se dá.
De repente ao invés de usar multithread pra geral, usa só pra guardar esse hb_gtSelect(), se isso funcionar.
HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN
Enviado: 01 Fev 2021 18:08
por asimoes
Só completando o meu último post para destruir a janela
Código: Selecionar todos
pWindowGTI := Hb_gtInfo( HB_GTI_WINHANDLE )
IF pWindowGTI != Nil
wapi_DestroyWindow( pWindowGTI )
ENDIF
HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN
Enviado: 01 Fev 2021 18:13
por marcosgambeta
Com thread não tentei.
A ideia era obter o mesmo efeito quando se tem duas janelas GUI. O usuário pode digitar numa, mudar o foco para outra e digitar nela, sem problemas. Sem ter de lidar com threads.
Mas com janelas de console, tem este detalhe da digitação.
Por enquanto, o mais seguro é abrir uma janela por vez para o usuário, assim como é num programa em modo texto.
HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN
Enviado: 01 Fev 2021 18:22
por asimoes
HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN
Enviado: 01 Fev 2021 18:27
por asimoes
Isso mesmo Marcos, tem que usar LOCAL GetList := {}, cada uma com o seu objeto get
Mesmo usando thread
HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN
Enviado: 01 Fev 2021 18:38
por asimoes
HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN
Enviado: 01 Fev 2021 20:24
por JoséQuintas
marcosgambeta escreveu:Com thread não tentei.
A ideia era obter o mesmo efeito quando se tem duas janelas GUI. O usuário pode digitar numa, mudar o foco para outra e digitar nela, sem problemas. Sem ter de lidar com threads.
Mas com janelas de console, tem este detalhe da digitação.
Por enquanto, o mais seguro é abrir uma janela por vez para o usuário, assim como é num programa em modo texto.
Com thread pode cair no problema de precisar reescrever fonte, e com isso, criamos mais uma dificuldade para o usuário.
Com certeza, TEORICAMENTE, resolve qualquer parada.
Mas na prática.... podemos criar um problema muito maior.
Começa em que.... quem disse que as LIBs estão preparadas pra multithread?
Aí... resolver o problema inicial vai se tornar até suporte pra modificar a LIB, e explicar multithread, e outras coisas mais...
Tendo a janela GTWVG, ele se vira com o que costuma usar e pronto.
Eu quero terminar essa remontagem inicial que comecei das LIBs, e por enquanto não quero desviar com testes, mas talvez facilite muito usar a WVG como default, ao invés de GUI.
A montagem inicial é apenas usar HBP, e modificar o nome das LIBs.
Depois... aí vou começar a misturar ao máximo, mas alterando o mínimo possível.
HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN
Enviado: 01 Fev 2021 20:52
por asimoes
Na minha opinião ele deveria iniciar o projeto totalmente MINIGUI, colocar em homologação pro usuário testar e deixar o outro sem modificações, vai dar trabalho de qq jeito, com thread ou sem thread, essa coisa de misturar console/gui tem trabalho mesmo, quando eu tinha issso, eu fiz um fonte que iniciava e chamava todas as janelas consoles a partir da gui, também só escrevi uma única vez, código com 30 linhas ou menos, ai é decisão do microvolution, usei thread com waitthread, não queria várias janelas abertas ao mesmo tempo
HMG | EXECUTAR MÓDULO CONSOLE DENTRO DE FORM WINDOW MAIN
Enviado: 02 Fev 2021 07:25
por marcosgambeta
Mais um exemplo, adaptado para usar funções:
Código: Selecionar todos
#include "hbgtinfo.ch"
STATIC lFlag := .F.
STATIC pNewGT
STATIC pOldGT
FUNCTION OpenConsole( cTitle, lAltEnter, lClosable )
IF lFlag
RETURN .F.
ENDIF
lFlag := .T.
pNewGT := hb_gtCreate( "WVT" )
pOldGT := hb_gtSelect( pNewGT )
CLS
hb_gtInfo( HB_GTI_WINTITLE, cTitle )
hb_gtInfo( HB_GTI_ALTENTER, lAltEnter )
hb_gtInfo( HB_GTI_CLOSABLE, lClosable )
RETURN .T.
FUNCTION CloseConsole()
IF !lFlag
RETURN .F.
ENDIF
lFlag := .F.
hb_gtSelect( pOldGT )
pNewGT := NIL
RETURN .T.
Código: Selecionar todos
#include "minigui.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)
IF !OpenConsole( "Janela console 1", .T., .F. )
RETURN NIl
ENDIF
@ 10,10 SAY "CAMPO1:" GET cCampo1
READ
? cCampo1
WAIT
CloseConsole()
RETURN NIL
STATIC FUNCTION telaconsole2()
LOCAL cCampo1 := space(30)
LOCAL cCampo2 := space(50)
IF !OpenConsole( "Janela console 2", .T., .F. )
RETURN NIl
ENDIF
@ 8,10 SAY "CAMPO1:" GET cCampo1
@ 10,10 SAY "CAMPO2:" GET cCampo2
READ
? cCampo1
? cCampo2
WAIT
CloseConsole()
RETURN NIL
Talvez fique mais simples de usar, fazendo desta forma. Não é necessário ficar repetindo o mesmo código em cada rotina. Apenas abrir o console no início e fechar no final.