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
Com thread
2021-02-01 18_21_09-Greenshot.png

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
2021-02-01 18_37_27-Greenshot.png

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.