Ajuda com MODAL

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

abarbosa
Usuário Nível 1
Usuário Nível 1
Mensagens: 8
Registrado em: 25 Jun 2015 17:39
Localização: Brasilia/DF

Ajuda com MODAL

Mensagem por abarbosa »

Pessoal,
O Código abaixo é apenas para ilustrar o problema, não está assim no original, simplifiquei para ficar melhor a compreensão.
Meu problema consiste no uso de MODAL, o formulário principal chama outro de pesquisa através da tecla de atalho F2, ao tentar pressionar a tecla F2 pela segunda vez o programa perde o foco, aparentemente está travado, ao focar manualmente nada funciona, apenas o F2. Troquei para CHILD o formulário de pesquisa e o comportamento desaparece, porém, gostaria que fosse MODAL para que o formulário que chamou fique "congelado" até o retorno da pesquisa.
Obrigado,
André

Código: Selecionar todos

*----------------------------------------------------------------------------*

#Include "Minigui.ch"

*----------------------------------------------------------------------------*
Function Main()

Define Window frmTRA000 ;
              At 0,0 ;
              Width 435 ;
              Height 470 ;
              Title 'Cadastro de Transportadoras' ;
              Main 

       @ 040,005 Frame fraTransportadora Width 410 Height 345 Caption "Transportadora" 

       @ 060,010 Label lblCodtrans    Value "Codigo"                 
       @ 100,010 Label lblTransp      Value "Transportadora"
       @ 200,010 Label lblExplica1    Value "Ao pressionar o F2 pela segunda vez o programa perde o foco." Width 100 Height 100 
       @ 200,200 Label lblExplica2    Value "Ao perder o foco da a impressão de travamento." Width 100 Height 100 
       @ 300,010 Label lblExplica3    Value "O comportamento é diferente ao pressionar o botão '...' de ação."  Width 100 Height 100 

       @ 075,010 GetBox _CodTrans     Width   060;
                                      Height  21;
                                      Value   Space(004);
                                      Picture "9999";
                                      Tooltip '<F2>-Pesquisa';
                                      Action        fPesquisaTransportadora();
                                      Valid         fValidaTransportadora() 

       @ 115,010 GetBox _Transp       Width   400;
                                      Height  21;
                                      Value   Space(040);
                                      Picture "@!"
                                                                            
                                      Picture "@!"                                    
End Window

On Key F2 Of frmTRA000 Action frmTRA000._CodTrans.Action

Center Window frmTRA000
Activate Window frmTRA000

Return(NIL)

*----------------------------------------------------------------------------*
Function fValidaTransportadora()
LOCAL lRet := .T.

If !Empty(frmTRA000._codtrans.Value)
   If 1=1
      MsgStop("Codigo invalido")
      lRet := .F. 
   EndIf  
EndIf
Return(lRet)

*----------------------------------------------------------------------------*
Function fPesquisaTransportadora()

fPesquisa()
SetProperty('frmTRA000','_CodTrans','value','0042')
frmTRA000.SetFocus()
frmTRA000._CodTrans.SetFocus()

Return(NIL)

*----------------------------------------------------------------------------*
Function fPesquisa()

Define Window frmPesquisa;
              At      10,20; 
              Width   200; 
              Height  200; 
              Title   "Teste";
              MODAL

 		@ 80,50 BUTTON Button_1 ;
		      	CAPTION 'Sair' ;
			      ACTION frmPesquisa.Release() ;
			      WIDTH 80 ;
			      HEIGHT 40
End Window

Center   Window frmPesquisa
Activate Window frmPesquisa

Return(NIL)
*----------------------------------------------------------------------------*
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á

Ajuda com MODAL

Mensagem por Pablo César »

Acho que o seu problema está na linha 39.

On Key F2 Of frmTRA000 Action frmTRA000._CodTrans.Action

Na minha opinion você deveria atribuir ao F2 uma função e não entendi o que você fez...
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.
abarbosa
Usuário Nível 1
Usuário Nível 1
Mensagens: 8
Registrado em: 25 Jun 2015 17:39
Localização: Brasilia/DF

Ajuda com MODAL

Mensagem por abarbosa »

Pablo,

Nesse caso é acionada a função atribuída no action do objeto.

@ 075,010 GetBox _CodTrans Width 060;
...
Action fPesquisaTransportadora();
...

Usando

On Key F2 Of frmTRA000 Action frmTRA000._CodTrans.Action

ou

On Key F2 Of frmTRA000 Action fPesquisaTransportadora()

O efeito é mesmo e funcionou pra mim. No meu caso se eu mudo a janela de pesquisa para CHILD funciona, o único problema é que a janela principal fica acessível, gostaria que fosse MODAL ou se comportasse como e entender porque não funciona como MODAL.

Obrigado,

André
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á

Ajuda com MODAL

Mensagem por Pablo César »

Não sabia que isso funcionava, eu nunca testei isso (Parece racional. Uma nova que aprendo). Mas eu fosse você colocava o nome da função.

Com respeito ao MODAL, tem um jeito. No _HMG_PRINTER_SHOWPREVIEW muda essa condição de MODAL obtendo o ModalHandle e DisableWindow. Mas depois teria que voltar a ser MODAL se quiser que a janela fique assim.

Dê uma olhada no C:\hmg.3.4.1\SOURCE\h_controlmisc.prg
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.
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Ajuda com MODAL

Mensagem por Toledo »

Amigo, está ocorrendo algum conflito entre a função do ACTION e VALID do GETBOX, mas não sei dizer o que realmente está ocorrendo, então fiz algumas alterações no seu código para que em quanto a função fPesquisaTransportadora() está sendo executada, o VALID do GETBOX (fValidaTransportadora()) retorne sempre verdadeiro (.T.). Após o encerramento da função fPesquisaTransportadora() o VALID vai validar corretamente o GETBOX.

As alterações estão marcadas com //*** alteracao toledo ***

Código: Selecionar todos

*----------------------------------------------------------------------------*

#Include "Minigui.ch"

*----------------------------------------------------------------------------*
Function Main()

Private lPesq:=.F.   //*** alteracao toledo ***

Define Window frmTRA000 ;
              At 0,0 ;
              Width 435 ;
              Height 470 ;
              Title 'Cadastro de Transportadoras' ;
              Main 

       @ 040,005 Frame fraTransportadora Width 410 Height 345 Caption "Transportadora" 

       @ 060,010 Label lblCodtrans    Value "Codigo"                 
       @ 100,010 Label lblTransp      Value "Transportadora"
       @ 200,010 Label lblExplica1    Value "Ao pressionar o F2 pela segunda vez o programa perde o foco." Width 100 Height 100 
       @ 200,200 Label lblExplica2    Value "Ao perder o foco da a impressão de travamento." Width 100 Height 100 
       @ 300,010 Label lblExplica3    Value "O comportamento é diferente ao pressionar o botão '...' de ação."  Width 100 Height 100 

       @ 075,010 GetBox _CodTrans     Width   060;
                                      Height  21;
                                      Value   Space(004);
                                      Picture "9999";
                                      Tooltip '-Pesquisa';
                                      Action        fPesquisaTransportadora();
                                      Valid         fValidaTransportadora() 

       @ 115,010 GetBox _Transp       Width   400;
                                      Height  21;
                                      Value   Space(040);
                                      Picture "@!"
                                                                            
End Window

On Key F2 Of frmTRA000 Action frmTRA000._CodTrans.Action

Center Window frmTRA000
Activate Window frmTRA000

Return(NIL)

*----------------------------------------------------------------------------*
Function fValidaTransportadora()
LOCAL lRet := .T.
if lPesq   //*** alteracao toledo ***
  Return(lRet)
endif
If !Empty(frmTRA000._codtrans.Value)
   If 1=1
      MsgStop("Codigo invalido")
      lRet := .F. 
   EndIf  
EndIf
Return(lRet)

*----------------------------------------------------------------------------*
Function fPesquisaTransportadora()
lPesq:=.T.  //*** alteracao toledo ***
fPesquisa()
SetProperty('frmTRA000','_CodTrans','value','0042')
frmTRA000.SetFocus()
frmTRA000._CodTrans.SetFocus()
lPesq:=.F.  //*** alteracao toledo ***
Return(NIL)

*----------------------------------------------------------------------------*
Function fPesquisa()

Define Window frmPesquisa;
              At      10,20; 
              Width   200; 
              Height  200; 
              Title   "Teste";
              MODAL

       @ 80,50 BUTTON Button_1 ;
               CAPTION 'Sair' ;
               ACTION frmPesquisa.Release() ;
               WIDTH 80 ;
               HEIGHT 40
End Window

Center   Window frmPesquisa
Activate Window frmPesquisa

Return(NIL)
*----------------------------------------------------------------------------*
Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
abarbosa
Usuário Nível 1
Usuário Nível 1
Mensagens: 8
Registrado em: 25 Jun 2015 17:39
Localização: Brasilia/DF

Ajuda com MODAL

Mensagem por abarbosa »

Toledo,

O problema persiste, pelo debug eu já tinha visto que o problema aparecia na validação, inclusive já havia tentado fazer exatamente como você sugeriu.

Toquei a janela para CHILD e estou usando funções para desativar o formulário pai, ficou da seguinte forma:

Código: Selecionar todos


Function fPesquisaTransportadora()

**Destivando o formulário pai
DisableWindow ( GetFormHandle ('frmTRA000') )

fPesquisa()

** Ativando o formulário pai
EnableWindow ( GetFormHandle ('frmTRA000') )  


SetProperty('frmTRA000','_CodTrans','value','0042')

frmTRA000.SetFocus()

frmTRA000._CodTrans.SetFocus()

Return(NIL)

Estou nos testes finais, mas aparentemente esta funcionando.
Mas fiquei curioso em saber o motivo de não funcionar com MODAL

Obrigado,

André
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Ajuda com MODAL

Mensagem por Toledo »

abarbosa escreveu:O problema persiste
Bom, eu fiz as alterações, compilei e funcionou sem o erro ao chamar o F2 pela segunda vez.

Segue em anexo o teste que eu fiz.
Anexos
demo_modal.zip
(655.86 KiB) Baixado 100 vezes
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
abarbosa
Usuário Nível 1
Usuário Nível 1
Mensagens: 8
Registrado em: 25 Jun 2015 17:39
Localização: Brasilia/DF

Ajuda com MODAL

Mensagem por abarbosa »

Toledo,
Me desculpe, realmente funcionou, acho que não salvei o código alterado e compilei o antigo.
Saberia me dizer o motivo de perder o foco?
Essa alternativa que usei, com CHILD e desabilitando o formulário pai, acredita que possa dar algum problema?
Outra coisa, a função de pesquisa retorna o valor selecionado para o get ativo, estou usando um código em C para simular o ENTER para pular o campo, como fazia no xHarbour usando "keyboard chr(13)", tem uma maneira mais elegante para fazer isso? Num primeiro momento pensei em setar o foco para o campo seguinte, mas achei mais trabalhoso que usar esse código em C.

Código: Selecionar todos

#pragma BEGINDUMP
	#include <windows.h>
	HB_FUNC( FSIMULAENTER )
	{
	  keybd_event(
	      VK_RETURN,
	      0,
	      0,
	      0
	      );
	 }
#pragma ENDDUMP
André
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Ajuda com MODAL

Mensagem por Toledo »

abarbosa escreveu:Saberia me dizer o motivo de perder o foco?
Não sei dizer não, teria que ver o código da função GETBOX, mas deve ser algum conflito com o VALID e o SETFOCUS.
abarbosa escreveu:Essa alternativa que usei, com CHILD e desabilitando o formulário pai, acredita que possa dar algum problema?
Nunca fiz isto, o único jeito é testar.
abarbosa escreveu:estou usando um código em C para simular o ENTER para pular o campo
Na MiniGui já existe a função InsertTab() que simula a tecla TAB, que no caso do GETBOX não fará diferença nenhuma em usar o TAB ou ENTER para mudar de campo, basta colocar o InsertTab() no final da sua função de pesquisa.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
abarbosa
Usuário Nível 1
Usuário Nível 1
Mensagens: 8
Registrado em: 25 Jun 2015 17:39
Localização: Brasilia/DF

Ajuda com MODAL

Mensagem por abarbosa »

Toledo,
Muito obrigado pela sua ajuda!!!
André
Responder