Página 1 de 2

Janelas hwgui

Enviado: 17 Out 2020 23:36
por JoséQuintas
Alguma coisa impede ter várias janelas?
Por exemplo: título repetido

Janelas hwgui

Enviado: 18 Out 2020 00:49
por JoséQuintas
Ainda estou tentando ajustar isso, QUE NÃO TEM A VER COM O USO NORMAL.

Se usar WINDOW, no uso misturado, abre uma WINDOW, e fechando ou não, não abre mais nenhuma.
E além disso, fica alguma coisa zumbi ao sair, tendo que fechar no gerenciador de tarefas.
Também estranhei que o hmg_EndWindow() não funciona nessa janela, somente o fechar no "X".
Provavelmente tenha a ver com o problema, uma vez que fechar a janela não significa que fechou o "conjunto" janela+módulo.

Janelas hwgui

Enviado: 18 Out 2020 01:42
por JoséQuintas
Resolvido de não fechar.

Código: Selecionar todos

   INIT WINDOW ::oFrm TITLE ::cTitulo AT 20, 0 SIZE 800, 600 ON EXIT hwg_EndWindow( ::oFrm )
Alterei hwg_EndWindow pra aceitar parâmetro.

Agora falta resolver o de não abrir - só abre a primeira.

Janelas hwgui

Enviado: 18 Out 2020 08:39
por asimoes
Somente Dialog, INIT WINDOW não pode abrir mais de uma. Internamente a classe das janelas as propriedades são iniciadas, somente são iniciadas novamente quando a janela é fechada.
A Dialog permite, um exemplo disso é abrir uma janela dialog e no activate dela abrir outra dialog

Janelas hwgui

Enviado: 18 Out 2020 11:36
por JoséQuintas
Eliminei o controle de janelas, mas ainda não resolveu, por isso perguntei.

Janelas hwgui

Enviado: 18 Out 2020 12:04
por JoséQuintas
Mas me lembrou da dialog, e isso me fez lembrar do que já comentei:

Código: Selecionar todos

 METHOD Close()    INLINE hwg_EndDialog( ::handle )
Agora preciso voltar ao meu teste inicial, quando conseguia abrir dialogs mas só fechavam na ordem em que foram abertas.
Eu estava usando hwg_EndDialog(), e isso não indica exatamente o que fechar.

Janelas hwgui

Enviado: 18 Out 2020 12:12
por JoséQuintas
Acho que isso vai resolver.

Código: Selecionar todos

   IF handle == Nil
      IF ( oDlg := Atail( HDialog():aModalDialogs ) ) == Nil
         RETURN Nil
      ENDIF
Quando não indica o que fechar, é fechada a última da lista, que é a última que foi aberta.
Exatamente o que eu tinha mencionado como problema, quando tudo começou.

A boa notícia é que basta usar o Close().
A má notícia.... é que na criação da dialog não existe a classe e muito menos o close(), não dá pra passar como parâmetro.

Janelas hwgui

Enviado: 18 Out 2020 14:10
por asimoes
Dá uma pesquisada em hwg_GetModalHandle(), retorna o handle da janela, talvez jogando o handle em um vetor global

Janelas hwgui

Enviado: 18 Out 2020 15:29
por JoséQuintas
Este troço não tá meio doido?

Código: Selecionar todos

FUNCTION hwg_EndDialog( handle )

   LOCAL oDlg, lRes

   IF handle == Nil
      IF ( oDlg := Atail( HDialog():aModalDialogs ) ) == Nil
         RETURN Nil
      ENDIF
   ELSE
      IF ( ( oDlg := Atail( HDialog():aModalDialogs ) ) == Nil .OR. ;
            oDlg:handle != handle ) .AND. ;
            ( oDlg := HDialog():FindDialog( handle ) ) == Nil
         RETURN Nil
      ENDIF
   ENDIF
   IF oDlg:bDestroy != Nil
      lRes := Eval( oDlg:bDestroy, oDlg )
      IF Valtype( lRes ) != "L" .OR. lRes
         RETURN Iif( oDlg:lModal, Hwg__EndDialog( oDlg:handle ), hwg_Destroywindow( oDlg:handle ) )
      ELSE
         RETURN Nil
      ENDIF
   ENDIF

   RETURN  Iif( oDlg:lModal, Hwg__EndDialog( oDlg:handle ), hwg_Destroywindow( oDlg:handle ) )
É... porque se é passado exatamente qual diálogo fechar, porque a pesquisa doida?
Dá a impressão de que vai fechar outro diálogo e não o que foi solicitado.

Janelas hwgui

Enviado: 18 Out 2020 15:54
por JoséQuintas
ok, entendi.

No caso de dialog MODAL, só pode fechar o último.

Mas em multithread, como o modal equivale a um não modal... isso não se aplica.... bingo....

Ou quase bingo... depende se resolvendo uma coisa não vai atrapalhar a outra.

Janelas hwgui

Enviado: 18 Out 2020 16:18
por JoséQuintas

Código: Selecionar todos

CLASS VAR aModalDialogs SHARED INIT {}
Como alterar isso pra ser por thread?
Isso foge do meu uso normal.

Talvez alguma coisa do tipo

THREAD STATIC Variavel := {}

CLASS VAR aModalDialogs SETGET

Janelas hwgui

Enviado: 18 Out 2020 16:59
por JoséQuintas
tá complicado.
Error BASE/1004 No exported method: CLOSE
Called from CLOSE(0)
Called from (b)FRMCLASS_SAIR(172)
Called from FRMCLASS:SAIR(172)
Called from FRMCLASS:NEW(51)
Called from PTESHWGUI(16)
Não posso usar o Close() porque a tradução do método é feita antes da classe existir.

Janelas hwgui

Enviado: 18 Out 2020 17:17
por JoséQuintas
Aqui funcionou "gambiarra".

Código: Selecionar todos

METHOD Sair() CLASS FrmClass

   Eval( { || ::oFrm:Close() } )

   RETURN Nil
hwgui.png
Agora inverteu: vou precisar de uma soluçào pra quando realmente for modal... kkkkk
Dialogs ilimitadas e independentes, igual GTWVG.

Janelas hwgui

Enviado: 18 Out 2020 17:38
por JoséQuintas

Código: Selecionar todos

FUNCTION hwg_EndDialog( handle )

   LOCAL oDlg, lRes, nItem

   IF handle == Nil
      IF ( oDlg := Atail( HDialog():aModalDialogs ) ) == Nil
         RETURN Nil
      ENDIF
   ELSE
      IF ( nItem := hb_AScan( HDialog():aModalDialogs, { | e | e:Handle == Handle } ) ) != 0
         oDlg := HDialog():aModalDialogs[ nItem ]
      ELSEIF ( ( oDlg := Atail( HDialog():aModalDialogs ) ) == Nil .OR. ;
            oDlg:handle != handle ) .AND. ;
            ( oDlg := HDialog():FindDialog( handle ) ) == Nil
         RETURN Nil
      ENDIF
   ENDIF
O que fiz foi acrescentar a parte que permite fechar qualquer dialogo modal.

Foi só um teste.
Agora é pensar como ter esse "novo comportamento" e o original ao mesmo tempo.

Janelas hwgui

Enviado: 18 Out 2020 18:01
por JoséQuintas
misto.png
Traduzindo:

Agora tanto faz.
Continuo usando GTWVG, mas pode ter módulos em HWGUI ou HMG.
Posso abrir ou fechar qualquer módulo a qualquer momento.
Na tela, 3 módulos GTWVG e 2 HWGUI.
Só falta ajustar pra quando eu quiser que um módulo hwgui abra outro módulo hwgui modal.