Oi Milton,
As windows do tipo MODAL, tem uma finalidade que deve ser respeitada principalmente se o programador não prevê o tratamento das windows que são abertas posteriormente (caso o MODAL é quebrado).
Eu vou passar esse truque no HMG, mas sem responsabilidade alguma. Tudo ao critério do seu uso e risco.
Preparei 3 windows: Main, Modal e Standard mas este ultimo tem a propriedade de TOPMOST que serve para ficar na tela:
Código: Selecionar todos
#include <hmg.ch>
Function Main
PRIVATE ModalHandle
DEFINE WINDOW Form_1 AT 138, 235 WIDTH 550 HEIGHT 350 TITLE "Main" MAIN
DEFINE BUTTON Button_1
ROW 140
COL 40
WIDTH 100
HEIGHT 28
ACTION Open_Form_2()
CAPTION "Modal 1"
END BUTTON
END WINDOW
Form_1.Center
Form_1.Activate
Return Nil
Function Open_Form_2()
If IsWindowActive("Form_3")
If MsgYesNo("Se abrir a janela Modal 1,"+CRLF+"terá que fechar a janela Modal 2."+CRLF+CRLF+"Confirma ?")
DoMethod("Form_3","Release")
Else
Return Nil
Endif
Endif
DEFINE WINDOW Form_2 AT 418, 839 WIDTH 388 HEIGHT 290 TITLE "Modal 1" MODAL ON RELEASE Fechando_Modal1()
DEFINE BUTTON Button_1
ROW 130
COL 50
WIDTH 100
HEIGHT 28
ACTION Open_Form_3()
CAPTION "Modal 2"
END BUTTON
DEFINE TEXTBOX Text_1
ROW 10
COL 127
WIDTH 120
HEIGHT 24
ONENTER MsgInfo(This.Value)
VALUE ""
END TEXTBOX
END WINDOW
Form_2.Activate
Return Nil
Function Open_Form_3()
LOCAL hwd_Form_3
If IsWindowActive("Form_3")
DoMethod("Form_3","SetFocus")
Else
Remove_Modal()
DEFINE WINDOW Form_3 AT 476, 1027 WIDTH 190 HEIGHT 212 TITLE "Modal 2" TOPMOST
DEFINE BUTTON Button_1
ROW 90
COL 30
WIDTH 125
HEIGHT 64
ACTION Add_Modal()
CAPTION "Remove Modal"
END BUTTON
DEFINE TEXTBOX Text_1
ROW 30
COL 30
WIDTH 120
HEIGHT 24
ONENTER MsgInfo(This.Value)
VALUE ""
END TEXTBOX
END WINDOW
Form_3.Activate
Endif
Return Nil
Function Remove_Modal()
ModalHandle := _HMG_SYSDATA [ 167 ]
_HMG_SYSDATA [ 271 ] := .F.
_HMG_SYSDATA [ 167 ] := 0
DisableWindow ( ModalHandle )
Return Nil
Function Add_Modal()
EnableWindow ( ModalHandle )
SetFocus( ModalHandle )
_HMG_SYSDATA [ 271 ] := .T.
_HMG_SYSDATA [ 167 ] := ModalHandle
Return Nil
Function Fechando_Modal1()
If IsWindowActive("Form_3") .and. MsgYesNo("Deseja fechar a janela Modal 2")
DoMethod("Form_3","Release")
Endif
Return Nil
Este exemplo, não condiz com uma situação normal. Caberia você avaliar melhor antes de usar se realmente precisa dele.
Sobre a janela do Form_3, eu não consegui voltar focus depois de fechar a Form_2. Teroricamente o Form_3 deveria ser fechado. Esse cuidado você vai ter que tomar. Por isso acrescentei duas funções que perguntam o fechamento da Form_3.
Bom espero que tenha gostado e que seja útil. Mas avalie mesmo se isso não pode ser resolvido de uma outra forma de exibição dos dados. Interagir em dua janela tendo uma como MODAL: não é normal.
Um abraço,