Formulários: Modal só aceita iniciar outro Modal?

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Avatar do usuário
NiltonGM
Usuário Nível 3
Usuário Nível 3
Mensagens: 397
Registrado em: 05 Jun 2014 23:47
Localização: Caieiras/SP

Formulários: Modal só aceita iniciar outro Modal?

Mensagem por NiltonGM »

Prezados,

Tenho o Form_Main do tipo WindowType MAIN, este por sua vez abre um Form_2 do tipo WindowType MODAL, gostaria de abrir o Form_3 a partir do Form_2 mas que não fosse MODAL pois preciso que com o Form_3 aberto seja possível o usuário clicar e mexer no Form_2 porem o MAIN não pode ser acessado, tentei todos os tipos mas o Form_2 MODAL só aceita ativar outro do tipo MODAL, se eu mudar o tipo do Form_2 para STANDARD e Form_3 para STANDARD beleza porem há o inconveniente que o usuário possa mexer no Form_MAIN e isso pode dar erro, eu teria que desativar tudo q é clicável (botões, menu, etc) do Form_MAIN.
Eu tentei isso também mas não surtiu efeito:
Form_2 STANDARD

Código: Selecionar todos

// No evento oninit do Form_2:
          SetProperty( "Main", "Visible", .F. )     // Não funciona para o form Main
          SetProperty( "Main", "Enabled", .F. )   // Este também Não funciona para o form Main
Amigos, tem solução para isso?
Nilton Medeiros
nilton@sistrom.com.br
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Formulários: Modal só aceita iniciar outro Modal?

Mensagem por Pablo César »

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,
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Responder