Página 1 de 2

GTWVG browse em outra janela

Enviado: 19 Mar 2023 15:45
por JoséQuintas

Código: Selecionar todos

FUNCTION BrowseADO( cnSQL, oTBrowse, cFilterKey, bKeyboard, bUserFunction, nFixToCol, aADOFilterList )

   IF Len( appForms() ) > 0 // .AND. oCrt == NIL
      Atail( AppForms()):GuiHide()
   ENDIF
   oFrm := frmGuiClass():New()
   wSave()
   oFrm:FormBegin()
Acima a parte que interessa aqui no assunto.

O que chamo de oFrm, e salvo em AppForms(), seria a informação da parte GUI.
Atail( AppForms() ):GuiHide()
Isso acima esconde todos os componentes GUI da "janela anterior" (que na verdade é a mesma janela)
wSave() é meu SAVE SCREEN.

Traduzindo:
O que é texto, SAVE SCREEN salva, depois dá pra retornar.
O que é componente do Windows, GUI, vou precisar deles depois, então apenas escondo/deixo não visível.
A tela fica livre pra qualquer coisa.

O browse também tem botões, que são criados.
No final destruo esses botões do browse.
restauro a tela, e retorno os componentes windows pra visíveis.

Até aí, tudo bem, tá funcionando direito.
A diferença do uso normal de GUI é esse fato de reaproveitar janela, e é o que dá esse "trabalhinho" a mais.

O que quero fazer agora é abrir uma nova janela pro browse, assim elimina esse "trabalhinho" extra.
Não só isso, passa a ser o funcionamento normal de GUI.

Por enquanto imagino duas possibilidades: ou wvgCrt(), ou hb_gtReload("WVG")
Nos dois casos vai dar uma janela nova, o que acaba com Hide()/Show() e com SAVE SCREEN/RESTORE SCREEN.
O problema que pode aparecer é das janelas inverterem de posição, e o usuário pensar que travou tudo.

Alguém já fez isso em GTWVG ?

Ou talvez um Style de janela.
O radical seria o TOPMOST, que deixa a janela no topo de tudo, mas eu preferia um que fizesse isso POR THREAD, menos radical.

GTWVG browse em outra janela

Enviado: 19 Mar 2023 15:57
por JoséQuintas
style.png
Tentando entender isso acima.
Tem esta outra também:
If an application is not in the foreground, and should be in the foreground, it must call the SetForegroundWindow function.
Alguém já usou as opções?
Vale pra janelas GUI de qualquer tipo.

GTWVG browse em outra janela

Enviado: 19 Mar 2023 16:03
por JoséQuintas
Tem também FlashWindow()
Pra fazer piscar a janela e chamar a atenção do usuário.

Apenas listando as opções, ainda vou testar pra ver diferenças, caso ninguém tenha testado.

GTWVG browse em outra janela

Enviado: 19 Mar 2023 18:01
por JoséQuintas
crt.png
primeiro teste.
Se levar o foco pra janela principal, ele vai pra secundária que é modal.

Na janela secundária um Inkey(0) e na principal nada.
Teclou alguma coisa, fecha tudo, normal.

Só que... tá faltando alguma coisa... e se a principal for fazer mais coisas ?
Tá faltando alguma coisa pra retornar à janela anterior e prosseguir.
E será que o Inkey(0) é da primeira janela ou da segunda?

GTWVG browse em outra janela

Enviado: 19 Mar 2023 18:19
por JoséQuintas
xbase++zada é phoda.

oCrt:Close() não faz nada.

tem que ser oCrt:Destroy()

Código: Selecionar todos

PROCEDURE Main

   LOCAL oCrt

   SetMode(33,90)
   CLS

   oCrt := wvgCrt():New()
   oCrt:lModal := .T.
   oCrt:Create( ,,{ 0, 0 }, { 25, 80 } )
   Inkey(0)
   oCrt:Destroy()
   Inkey(0)

   RETURN

GTWVG browse em outra janela

Enviado: 19 Mar 2023 18:28
por JoséQuintas
crt.png

GTWVG browse em outra janela

Enviado: 19 Mar 2023 18:35
por JoséQuintas
Funcionou exatamente como no fonte.

Código: Selecionar todos

PROCEDURE Main

   LOCAL cTeste := Space(50), GetList := {}

   SetMode(33,90)
   CLS
   @ 1, 0 SAY "teste1" GET cTeste

   ExecutaModulo( "teste2" )

   READ
   Inkey(0)

   RETURN
Acima criou uma janela, montou o GET, MAS.... antes do READ chamou a rotina ExecutaModulo() passando o nome da procedure "teste2"

Código: Selecionar todos

FUNCTION ExecutaModulo( cModule )

   LOCAL oCrt

   oCrt := wvgCrt():New()
   oCrt:lModal := .T.
   oCrt:Create( ,,{ 0, 0 }, { 25, 80 } )
   Do( cModule )
   oCrt:Destroy()

   RETURN Nil
Acima só uma função intermediária, cria janela, chama PROCEDURE, e encerra

Código: Selecionar todos

PROCEDURE teste2

   LOCAL cTeste := Space(20), GetList := {}

   SetColor( "W/R" )
   CLS
   @ 1, 0 SAY "teste2" GET cTeste
   READ

   RETURN
Acima a rotina que foi executada na segunda janela.
Tem até mudança de cor e limpeza de tela (CLS).
crt.png
São duas janelas windows, com direito a título, e a mover a janela de cima como quiser.
o primeiro GET confunde com uma falha, mas é o get normal.

GTWVG browse em outra janela

Enviado: 19 Mar 2023 18:42
por JoséQuintas
Alterando pra lModal := .F., só aparece a segunda janela, e após o get trava tudo.
Acho que NOMODAL só com multithread.
Vai entender....

GTWVG browse em outra janela

Enviado: 19 Mar 2023 19:13
por JoséQuintas
crt.png

Código: Selecionar todos

   oCrt := wvgCrt():New()
   oCrt:lModal := .T.
   oCrt:Create( ,,{ 0, 0 }, { 25, 80 } )
   SetMode(30,85)
NÃO pode usar SetMode() depois de criada a Crt.
Na imagem a janela vermelha ficou vermelha só no tamanho criado.
O tamanho que aumentou com SetMode() continua em preto.
O vermelho foi aplicado depois do SetMode(), mas considerou somente o tamanho usado na criação da janela.

Até aí..... normal... não faz sentido criar diferente do que vai usar.

curiosidade: criação da crt. tem mais fonte, incluindo Style da janela, mas essa parte é interessante

Código: Selecionar todos

   IF ::lModal
      ::pGT  := hb_gtCreate( "WVG" )
      ::pGTp := hb_gtSelect( ::pGT )
   ELSE
      hb_gtReload( "WVG" )
      ::pGT := hb_gtSelect()
   ENDIF
hb_gtSelect() é o que seleciona janela em uso, define pra onde vai teclado/mouse

Também nunca usei isso, porque nunca precisei.
Vou começar agora.

GTWVG browse em outra janela

Enviado: 19 Mar 2023 19:41
por JoséQuintas
Recapitulando pra entenderem:

Hoje executo CADA módulo em uma thread diferente, com janela independente.
Até aí, tudo bem, tudo funciona.

Mas por exemplo o BROWSE, ele usa a mesma janela do módulo.
Isso significa SAVE SCREEN/RESTORE SCREEN, e também deixar os controles windows visíveis/invisíveis.
A idéia é que a partir de agora o browse tenha janela própria, igual qualquer lib GUI.
Essa janela do browse vai ser MODAL.

E o mesmo pra outras janelas, que alguns módulos tem.

Eu ia fazer isso com HWGUI, mas achei muita complicação pra pouca coisa.
De qualquer jeito eu iria fazer em outra janela, apenas vou fazer com GTWVG mesmo.
Algum dia, no futuro, a janela pode virar outra coisa, em outra LIB.

Isso vai simplificar fontes, vou remover aquelas coisas de save screen/restore screen, e aquelas coisas de mostrar/esconder controles windows.

GTWVG browse em outra janela

Enviado: 19 Mar 2023 20:15
por JoséQuintas
valadic.png
É que a rotina atual é meio genérica.
Posso abrir uma janela de qualquer tamanho, e escondo os botões pra não atrapalhar.
valadic2.png
Não tem problema nenhum nisso, mas vou abrir uma nova janela windows, e deixar os botões na anterior.

ESSA não, mas tem "janelinha" que usa BROWSE de cadastro...
Hoje o browse usa a janela atual, que é grande.
Não posso mudar pra "janelinha" independente, enquanto o browse não tiver sua própria janela grande, separada da que estiver aberta.
Usar o browse em hwgui até ficaria interessante mas.... só o browse é pouco.

De qualquer jeito, fica aí a dica: a primeira coisa a mudar no aplicativo são as telas de browse, porque o browse é usado na grande maioria das telas. (menos na que mostrei agora, de valores adicionais)

Depois que a janela de browse está pronta, próxima etapa podem ser essas "janelinhas" internas.

Depois as janelonas, e por último o menu, quando eu inventar um menu que eu goste - acho que esta vai ser a parte mais difícil.

Com essas mudanças, vou poder usar recursos que deixei de lado, e outros que nunca usei.

GTWVG browse em outra janela

Enviado: 20 Mar 2023 18:38
por JoséQuintas
browse.png
Primeiro teste falhou.
Os botões do browse ficaram na janela de trás.

Não, não é exatamente erro em fonte.
Se não indicar a janela "pai", assume a default, mas .... está considerando como default a outra.

GTWVG browse em outra janela

Enviado: 20 Mar 2023 18:57
por JoséQuintas
Error BASE/1004 No exported method: SHOWVENCIDAS
Called from SHOWVENCIDAS(0)
Called from SISTEMA(71)
Called from (b)MAIN(82)
(1) = Tipo: U
Xi..... ainda fazendo testes.

GTWVG browse em outra janela

Enviado: 20 Mar 2023 20:52
por JoséQuintas
Não deu certo com CRT.
E não sei dizer porque.

Até pensei na possibilidade de ser o handle da janela, ao invés da janela, mas não é.

Código: Selecionar todos

   IF Empty( ::oParent )
      IF ! ::ClassName() $ "WVGCRT,WVGDIALOG"
         ::oParent := WvgSetAppWindow()
      ENDIF
   ENDIF
wvgSetAppWindow() é a janela default, o que significa que é a janela e não o handle dela.
wvgCrt() é a janela Crt

Se passar alguma coisa aborta tudo.
O erro anterior é devido ao programa abortar, mas o programa continuar assim mesmo, por isso deu falta da classe.


Vou tentar entender isso porque agora virou piada.
Uso fora do normal.
Agora que ia usar normal, não quer funcionar kkkk

GTWVG browse em outra janela

Enviado: 21 Mar 2023 10:23
por JoséQuintas
Quem tiver acostumado a usar wvgCrt(), ou puder fazer testes, é interessante.
Meu primeiro teste foi direto no aplicativo, mas não funcionou.

DEPOIS vou fazer testes em separado.

Agora preciso trabalhar nas mudanças do governo pra abril, porque a contagem regressiva começou.
E pegando mais detalhes não previstos.