Página 1 de 2

testar se janela é main

Enviado: 24 Set 2020 11:07
por JoséQuintas
Como eu faço o teste pra saber se a janela é main ou não?

testar se janela é main

Enviado: 24 Set 2020 11:55
por Itamar M. Lins Jr.
Ola!
O nome do objeto. Como é o nome da Janela Main ?

Saudações,
Itamar M. Lins Jr.

testar se janela é main

Enviado: 24 Set 2020 12:05
por JoséQuintas
Ok, é que estava tentando entender o comportamento da hwgui na mistura.
Mas já entendi.

testar se janela é main

Enviado: 24 Set 2020 21:16
por JoséQuintas
Aviso: testes como este podem deixar o programa zumbi, e ter que fechar no gerenciador de tarefas.

Consegui uma luz:

Código: Selecionar todos

#include "hwgui.ch"

FUNCTION Main
LOCAL oMainW, nGT

nGT := hb_gtSelect()
hb_ThreadStart( { || test() } )
INIT WINDOW oMainW  ;
   TITLE "Dummy Main Window" AT 0,0 SIZE 0 , 0
hwg_Msginfo(Transform( nGT,"" ) )
oMainW:Close()

RETURN NIL

function Test()

LOCAL nGT
nGT := hb_gtSelect()
hb_gtReload( "WVG" )
CLS
? nGT
Alert( "WVG" )

return ""
gtwvg.png
Mesmo com erro, significa que aparentemente funcionou.

Se usar hb_gtReload("WVG") sem multithread, isso equivale a uma janela MODAL.
Significa que a janela anterior vai ficar congelada, até que a atual seja liberada.

Se usar em multithead, a coisa fica interessante.
Aí acontece o contrário: nada segurou a janela Main(), nem nada segurou a rotina Main(), fechou Main() fechou tudo.

A conclusão é:
- uma rotina segura a janela que criou.
- uma janela MODAL prende a janela anterior, porque as rotinas NÃO tem multithread.
- uma janela NÃO MODAL, não fica presa à rotina, parece livre, mas está presa à janela Main()

hb_gtSelect() justamente retorna a rotina de eventos da janela, e isso acaba valendo igual a transformar uma janela pai da outra.

Resumindo:
O que impediu de fechar TODA GTWVG, foi a variável nGT.
E o que impediu de fechar TODA HWGUI, foi a variável oMainW.
Isso manteve as duas Main() de cada uma aberta.
Agora pensar em como usar isso a meu favor.

É porque TODAS as próximas janelas dependem dessas.

testar se janela é main

Enviado: 24 Set 2020 21:20
por JoséQuintas
JoséQuintas escreveu:Isso manteve as duas Main() de cada uma aberta.
Correção: isso manteve as duas Main() funcionando, mesmo sem janela visível.

testar se janela é main

Enviado: 24 Set 2020 22:03
por JoséQuintas
E fechando GTWVG fecha GTWVG, e fechando HWGUI fecha HWGUI.
Não importa a ordem !

Esse é o ponto de partida agora pra encontrar solução.
A partir daí, janelas hwgui vão ficar presas à Main HWGUI, e janelas GTWVG vão ficar presas à janela Main da GTWVG.

Como eu já disse, GTWVG já estou craque.

Falta confirmar:
- o que realmente segura a main() hwgui
- o que muda se o aplicativo iniciar pela gtwvg
- o que acontece com hwgui em multithread

Esta última é porque multithread pode causar confusão pra hwgui.
É porque se uma thread não enxerga a outra, a hwgui pode não enxergar a própria janela Main(), e criar outra Main().

testar se janela é main

Enviado: 25 Set 2020 01:06
por JoséQuintas
Qual a forma correta de definir nas janelas, que vão ser todas isoladas?
Ou quais as opções existentes pra:

janela modal e não modal

Como fica pra isso: a janela main e as demais janelas?

MDI, CHILD, etc.

testar se janela é main

Enviado: 25 Set 2020 08:02
por Itamar M. Lins Jr.
Olá!
Tá lá no exemplo dentro do TUTOR.

Código: Selecionar todos

#include "hwgui.ch"
Function Test
   Local oMain

   /* MENUPOS clause sets the submenu, where items with child windows names
      will appear. It is set by position, starting with 0. */
   INIT WINDOW oMain MDI TITLE "MDI window" AT 100, 100 SIZE 400, 300 ;
         MENUPOS 1

   MENU OF oMain
      MENU TITLE "&File"
         MENUITEM "&Create Child" ACTION CreateChildWindow()
         SEPARATOR
         MENUITEM "&Exit" ACTION oMain:Close()
      ENDMENU
      MENU TITLE "&Windows"
         // Rearrange child windows
         MENUITEM "&Tile" ACTION hwg_Sendmessage(HWindow():GetMain():handle,WM_MDITILE,MDITILE_HORIZONTAL,0)
      ENDMENU
      MENU TITLE "&Help"
         MENUITEM "&About" ACTION hwg_Msginfo( HwG_Version(), "About" )
      ENDMENU
   ENDMENU

   ACTIVATE WINDOW oMain
  
Return Nil

Function CreateChildWindow
Local oChildWnd

   INIT WINDOW oChildWnd MDICHILD TITLE "Child "+Time()

     // Here may be any controls...
   oChildWnd:Activate()
Return Nil
Uma janela comum, dentro de outra comum.
Até hoje faço confusão com isso. Pq uma DIALOG aberto não deixa o usuário minimizar a MAIN, são detalhes que só usando para ver, mesmo com explicações, só com uso para ver como é o comportamento.

Saudações,
Itamar M. Lins Jr.

testar se janela é main

Enviado: 25 Set 2020 18:27
por sygecom
Zé,
Não entendi bem, mas veja esse exemplo abaixo, usamos para identificar as DIALOG, MDI E MDIMAIN abertas, talvez lhe ajude.

oWnd = objeto da tela principal do sistema.

Código: Selecionar todos

***************************************
FUNCTION FECHA_JANELAS(oWnd,lFECHATUDO)
***************************************
LOCAL oDLGS      := HDIALOG():ADIALOGS
LOCAL oDLGSMODAL := HDIALOG():aModalDialogs
LOCAL oDLGSMDI   := HWindow():aWindows
LOCAL nHANDLE    := oWnd:handle
LOCAL lRET       :=.T.
LOCAL nI, nI2

IF lFECHATUDO=NIL
   lFECHATUDO:=.F.
ENDIF

IF LEN(oDLGS)>0
   FOR nI= 1 TO LEN(oDLGS)
      IF lFECHATUDO
         oDLGS[nI]:close()
      ELSE
         lRET:=.F.
      ENDIF
   NEXT
ENDIF

IF LEN(oDLGSMODAL)>0
   FOR nI= 1 TO LEN(oDLGSMODAL)
      IF lFECHATUDO
         oDLGSMODAL[nI]:close()
      ELSE
         lRET:=.F.
      ENDIF
   NEXT
ENDIF

FOR nI2= 1 TO LEN(oDLGSMDI)
   IF nI2 > 3
      IF nHANDLE != oDLGSMDI[nI2]:handle
         lRET:=.F.
         //ShowMsg(valtoprg(oDLGSMDI[i]:handle))
         //oDLGSMDI[i2]:close()
      ENDIF
   ENDIF
NEXT
RETURN(lRET)

testar se janela é main

Enviado: 25 Set 2020 19:03
por JoséQuintas
Valeu.
Com a lista de janelas, dá pra ver se tem Main

testar se janela é main

Enviado: 25 Set 2020 20:22
por asimoes
Itamar M. Lins Jr. escreveu:Até hoje faço confusão com isso. Pq uma DIALOG aberto não deixa o usuário minimizar a MAIN, são detalhes que só usando para ver, mesmo com explicações, só com uso para ver como é o comportamento.
Mas pode fazer Hide() na MAIN

oThisFormMain:Hide()

testar se janela é main

Enviado: 25 Set 2020 21:00
por JoséQuintas
Itamar M. Lins Jr. escreveu: Pq uma DIALOG aberto não deixa o usuário minimizar a MAIN,
Pera aí....
Deixei passar...
Se não pode minimizar, então também não pode abrir com Main oculta.

testar se janela é main

Enviado: 25 Set 2020 21:52
por asimoes
JoséQuintas escreveu:Pera aí....
Deixei passar...
Se não pode minimizar, então também não pode abrir com Main oculta.
Pode fazer hide()

testar se janela é main

Enviado: 25 Set 2020 22:34
por asimoes
Outra forma de "esconder" a janela main

Esconder

Código: Selecionar todos

ThisformMain:Move( 0, 0, 0, 0 )
Exibir

Código: Selecionar todos

With Object ThisformMain
   :Move( 0, 0, ::nWidth, ::nHeight )
   :Restore()
End

testar se janela é main

Enviado: 25 Set 2020 22:48
por asimoes
Parâmetros do Move

Código: Selecionar todos

   Move(nCol, nRow, nWidth, nHeight)