Página 2 de 3

Atualizações Hwgui 28/10/2021

Enviado: 29 Out 2021 18:03
por Itamar M. Lins Jr.
Olá!
Pois é, no teste que fiz para demonstrar o problema as variáveis são locais.
Mas ele alertou para usar o tal "OF ODLG" foi o que entendi, colocar isso no OwnerButton, mas se é local ?

Código: Selecionar todos

#include "hwgui.ch"
Function main
LOCAL oFormMain, oBt

INIT WINDOW oFormMain MAIN APPNAME "TEST" STYLE WS_POPUP +  WS_CAPTION + WS_SYSMENU ;
AT 0,0 SIZE 500,400 
 @ 10,10 OWNERBUTTON oBt SIZE 70,70 TEXT "CLICK ME" ON CLICK {||DialogA()} 
oFormMain:Activate()

Function DialogA
local oBt, oDlg
INIT DIALOG oDlg CLIPPER NOEXIT AT 70,70 SIZE 800,500 
 @ 10,10 OwnerButton oBt Size 70,70 TEXT "CLICK ME" ON CLICK {||MyFunction()} //Hiden Dlg MyFunction, while mouse cursor exit button.
oDlg:Activate()
Return Nil

Function MyFunction
Local oDlg
INIT DIALOG oDlg CLIPPER NOEXIT AT 300,300 SIZE 300,100
oDlg:Activate() 

return nil
Isso ai em cima escondia o DIALOG anterior, antes da correção dele.

Saudações,
Itamar M. Lins Jr.

Atualizações Hwgui 28/10/2021

Enviado: 29 Out 2021 18:17
por JoséQuintas
Itamar M. Lins Jr. escreveu:Melhor um exemplo demostrando o problema, para todo mundo testar.
Eu sempre faço isso, ai não tem o que reclamar. Dá um trabalho mas é preciso fazer, que as vezes isolando o BUG, achamos alternativas.
O problema é que não sei usar hwgui, e não sei criar as situações, já falei isso.

O que imaginei para o problema foi o seguinte:

A janela modal pode ter como parent a janela anterior, porque ela vai estar bloqueada, e vai destravar ao sair da modal.
Já uma janela não modal... que é de certa forma livre... tem que ficar presa não à janela anterior, talvez até presa a Main e não numa dialog modal.
Como o modal destrava o pai/mãe ao sair... fazer referência a uma dialog modal não deu certo.

E não é sempre que dá o problema, porque não depende da dialog atual, e sim do conjunto anterior + atual.

Acho que por isso apanharam muito, porque isso se traduz em 4 situações.

- modal + modal
- modal + nomodal
- nomodal + modal
- nomodal + nomodal

Era resolver uma situação, e criar problema pra outra.
Talvez até isso permita fazer uma revisão geral.

Atualizações Hwgui 28/10/2021

Enviado: 29 Out 2021 18:20
por Itamar M. Lins Jr.
Olá!
Já viu que a "correção" ai pelo exemplo que passei, piorou a situação.
Faz exemplos simples igual a esse que fiz, para demonstrar o problema.
Agora nem a outra dialog abre mais.

É uma faca de muito legumes, mexer na Hwgui.

Saudações,
Itamar M. Lins Jr.

Atualizações Hwgui 28/10/2021

Enviado: 29 Out 2021 18:26
por Itamar M. Lins Jr.
Olá!
Usando o exemplo que postei dá esse erro:

Código: Selecionar todos

Error BASE/1066  Argument error: conditional
Called from source\winapi\hdialog.prg->HDIALOG:ACTIVATE(132)
Called from bugdialog.prg->DIALOGA(14)
Called from bugdialog.prg->(b)MAIN(7)
Called from source\winapi\hownbtn.prg->HOWNBUTTON:MUP(414)
Called from source\winapi\hownbtn.prg->HOWNBUTTON:ONEVENT(165)
Called from ->HWG_ACTIVATEMAINWINDOW(0)
Called from source\winapi\hwindow.prg->HMAINWINDOW:ACTIVATE(400)
Called from bugdialog.prg->MAIN(8)

HWGUI 2.23 dev Build 1
Date:10/29/21
Time:18:18:10
Saudações,
Itamar M. Lins Jr.

Atualizações Hwgui 28/10/2021

Enviado: 29 Out 2021 18:27
por JoséQuintas
Mal sei usar uma dialog, esse exemplo precisa de pelo menos 3, podendo ser 12 pra simular cada combinação.

Atualizações Hwgui 28/10/2021

Enviado: 29 Out 2021 18:28
por JoséQuintas
Itamar M. Lins Jr. escreveu:Usando o exemplo que postei dá esse erro:
Traduza por favor, isso é depois das alteraçòes?

Atualizações Hwgui 28/10/2021

Enviado: 29 Out 2021 18:34
por JoséQuintas
Vixe travou tudo.

Atualizações Hwgui 28/10/2021

Enviado: 29 Out 2021 18:39
por Itamar M. Lins Jr.
Olá!
podendo ser 12 pra simular cada combinação.
Não é assim não moço!
Senão com 10 janelas iria p/ 400 ?
Veja como é a classe na Hwgui.
Use hb_valtoexp(oDlg) ou hb_valtoexp(oFormMain) p/ ver tudo dentro uma das outras.

hwg_msginfo(hb_valtoexp(oDlg)) mostra a estrutura de objetos, etc da classe.

Saudações,
Itamar M. Lins Jr.

Atualizações Hwgui 28/10/2021

Enviado: 29 Out 2021 19:02
por JoséQuintas
Tô olhando tanto fonte que já estou confundindo tudo.
Analisando ainda.

Atualizações Hwgui 28/10/2021

Enviado: 29 Out 2021 20:25
por JoséQuintas
hwgui.png
Reverti, deixando da forma anterior.
Apesar de ter resolvido o problema do Fernando Queiroz, cria problemas pra outras pessoas.
Por enquanto ele mantém os fontes com a mudança.
Pelo menos agora ele está usando a última versão, apenas sem essa última anulação. (equivalente a não ter a alteração de 06/08)

Hoje na hwgui tem aDlgs e aModalDlgs.
Ainda não olhei, mas.... aDlgs contém só nomodal, ou contém tudo?
É... porque se só tem nomodal... como é que dá pra obter a última dialog, independente do tipo?

Atualizações Hwgui 28/10/2021

Enviado: 29 Out 2021 20:31
por Itamar M. Lins Jr.
Olá!
Apesar de ter resolvido o problema do Fernando Queiroz
Ai é que está a situação !
Cadê o exemplo demonstrado o problema ?
Eu postei ai o exemplo demonstrando o BUG, mas cadê o exemplo dele ?
Vai resolver como ? sem exemplo ?

Saudações,
Itamar M. Lins Jr.

Atualizações Hwgui 28/10/2021

Enviado: 29 Out 2021 20:38
por JoséQuintas
Uia
Tá aqui o problema dele

Código: Selecionar todos

#include "hwgui.ch"

FUNCTION main

   LOCAL oFormMain, oBt

   INIT WINDOW oFormMain MAIN APPNAME "TEST" STYLE WS_POPUP +  WS_CAPTION + WS_SYSMENU ;
      AT 0,0 SIZE 500,400
   @ 10,10 OWNERBUTTON oBt SIZE 70,70 TEXT "CLICK ME" ON CLICK {||DialogA()}
   oFormMain:Activate()

   RETURN Nil

FUNCTION DialogA

   LOCAL oBt, oDlg

   INIT DIALOG oDlg CLIPPER NOEXIT AT 70,70 SIZE 800,500
   @ 10,10 OwnerButton oBt Size 70,70 TEXT "CLICK ME" ON CLICK {||MyFunction()} //Hiden Dlg MyFunction, while mouse cursor exit button.
   ACTIVATE DIALOG oDlg NOMODAL

   RETURN Nil

FUNCTION MyFunction

   LOCAL oDlg

   INIT DIALOG oDlg CLIPPER NOEXIT AT 300,300 SIZE 300,100
   oDlg:Activate()

   RETURN Nil
Só alterei a janela do meio pra NOMODAL

Atualizações Hwgui 28/10/2021

Enviado: 29 Out 2021 20:40
por JoséQuintas

Código: Selecionar todos

   IF ::oParent == Nil
      ::oParent := hwg_GetModalDlg()
   ENDIF
E essa foi a alteração que causou problema pra ele, e resolveu o problema pra você.
Então... ::oParent é liberado no final, mas no caso dele, a MODAL DIALOG é a primeira e não a segunda, e isso causa liberar janela errada.
Com certeza... a liberação não está nessa rotina, assim como não deve estar o bloqueio.

Atualizações Hwgui 28/10/2021

Enviado: 29 Out 2021 21:05
por JoséQuintas
Complemento....

Por isso foi comentado com você usar OF oDLG.
Desse jeito você atribui ::oParent manualmente.

Esse tipo de problema eu não tive com GTWVG, mas tem uma explicação (ou duas):

Muita coisa na HWGUI é apenas definida, a criação só vém depois. Com isso, nem sempre pegar o handle da janela funciona, porque ela não existe.

NA GTWVG vai criando na hora, e já tem o handle da janela.
Mas.... NÃO USEI a dialog dela, talvez possa ter os mesmos problemas.

Código: Selecionar todos

   hParent := Iif( ::oParent != Nil .AND. ;
      __ObjHasMsg( ::oParent, "HANDLE" ) .AND. !Empty( ::oParent:handle ), ;
      ::oParent:handle, Iif( ( oWnd := HWindow():GetMain() ) != Nil,  ;
      oWnd:handle, hwg_Getactivewindow() ) )
Repare que tem Hparent e ::oParent
É porque nas classes guarda o objeto, que ainda não tem janela/handle, a janela vai ser criada depois.
Usando o objeto em run-time, com janelas criadas, ele vai ter conteúdo do handle.
De repente o problema é usar essas variáveis antes que elas contenham janela/handle.

Só que aí ferrou... é muita coisa interligada, e é onde entra conhecer bem a API do Windows, e o funcionamento geral da HWGUI.

Talvez nisso que a HMG leve vantagem, muita coisa ela faz direto pela API do Windows, inclusive pra descobrir qual é o :Parent.
Ou... pelo simples fato de que tudo é um array linguição... a janela anterior é o elemento anterior do array.

Atualizações Hwgui 28/10/2021

Enviado: 29 Out 2021 21:18
por JoséQuintas
getparent.png
Olhe aí, é passar a janela atual, e o Windows mostra a janela :Parent.
E olhe aqui:
d:\temp>hbmk2 -find parent

gtwvg.hbc (instalado):
wvg_SetParent()
gtwvw.hbc (instalado):
wvw_SetParent()
hbfimage.hbc (não instalado):
fi_IsTransparent()
fi_SetTransparent()
hbgd.hbc (não instalado):
gdImageColorTransparent()
gdImageGetTransparent()
hbhpdf.hbc (instalado):
HPDF_MarkupAnnot_SetInteriorTransparent()
hbmxml.hbc (instalado):
mxmlGetParent()
hbwin.hbc (instalado):
wapi_SetParent()
wapi_TreeView_GetParent()
Núcleo Harbour (instalado):
__clsParent()
não tem isso na hbwin.

Talvez em run-time fosse mais interessante usar essa função do Windows
Mas não é certeza, tudo depende de como "a coisa toda" está organizada.

É o que eu falo: aí começa a depender de rotina em C, e outras coisas mais, e aí cai na limitação do meu conhecimento.