Errro na criação de um formulario

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Fernando Almeida
Usuário Nível 1
Usuário Nível 1
Mensagens: 33
Registrado em: 24 Set 2016 12:53
Localização: Dourados - MS

Errro na criação de um formulario

Mensagem por Fernando Almeida »

Boa tarde colegas, venho desta forma pedir ajuda para resolver o seguinte erro.
Criei um formulário com o WindowType=Main sendo ele o principal, e um segundo formulário de Pedido de Vendas com o windowType=Modal, mas se eu mensionar MODAL neste segundo ele dá um erro de compilação//linkagem.
Só faz a linkagem do trabalho se eu retirar o windowtype MODAL.

Código: Selecionar todos

DEFINE WINDOW TEMPLATE AT GetDesktopRealTop() , GetDesktopRealLeft() WIDTH GetDesktopRealWidth();
    HEIGHT GetDesktopRealHeight() VIRTUAL WIDTH Nil VIRTUAL HEIGHT Nil TITLE "Pedido de Vendas, "+m_LicEmp[12]; 
    ICON "Imagens\document_new.ico"  [b]MODAL[/b] NOSIZE NOMAXIMIZE CURSOR NIL ON INIT pedido_de_vendas_form_oninit();
Só me aceita CHILD, para não dar o erro de linkagem, mas com esse windowtype eu não consigo trabalhar com a tela completa.
Como posso fazer para o colmatar o problema porque não tenho qualquer pista para o resolver.
ivanil
Usuário Nível 3
Usuário Nível 3
Mensagens: 166
Registrado em: 11 Set 2004 15:13
Localização: Florianópolis/SC

Errro na criação de um formulario

Mensagem por ivanil »

Ola;

você esta usando definições que não são compatíveis entre-si, acredito que retirando "NOMAXIMIZE" deva compilar;

Mas fiquei curioso com sua frase:
eu não consigo trabalhar com a tela completa.
o que exatamente quer dizer?
Fernando Almeida
Usuário Nível 1
Usuário Nível 1
Mensagens: 33
Registrado em: 24 Set 2016 12:53
Localização: Dourados - MS

Errro na criação de um formulario

Mensagem por Fernando Almeida »

Boa tarde, Sr. Ivanil já consegui resolver o problema. o erro é provocado por estas 2 linhas na definição da window.
Abaixo vou exemplificar:

Código: Selecionar todos

DEFINE WINDOW TEMPLATE AT GetDesktopRealTop() , GetDesktopRealLeft() WIDTH GetDesktopRealWidth();
    HEIGHT GetDesktopRealHeight() TITLE "Pedido de Vendas, "+m_LicEmp[12]; 
    ICON "Imagens\document_new.ico" MODAL NOSIZE;                                 
	ON INIT pedido_de_vendas_form_oninit();
	ON PAINT PaintPedidos();
	BACKCOLOR {221,223,255};
	ON INTERACTIVECLOSE {|| IF(lEncerraPedido, .t., SAIDAVENDA() )};
	ON GOTFOCUS {|| ACTVARSVD(ativoUser, BotaoPagamento) }
Assim sem as linhas ON MINIMIZE e ON MAXIMIZE, funciona perfeitamente.
Essas linhas são enviadas assim:

Código: Selecionar todos

ON MINIMIZE {|| IF(CFG_EMP->TEMPOPEVEN>0, Pedido_de_Vendas.Timer_PedidoAtraso.Enabled :=.f., Nil),;
	                IF(CFG_EMP->PedeUser, Pedido_de_Vendas.TPedVUser.Enabled :=.f., Nil)};
	ON MAXIMIZE {|| IF(CFG_EMP->TEMPOPEVEN>0, Pedido_de_Vendas.Timer_PedidoAtraso.Enabled :=.t., Nil),;
	                IF(CFG_EMP->PedeUser, Pedido_de_Vendas.TPedVUser.Enabled :=.t., Nil)}

Eu estava a usar essa linhas porque tenho dois temporizadores e quando fizesse a operação de minimizar a janela, acho que devia desligar essas variaveis de temporizador. É por isso que uso essa instrução dessa forma.
Pergunto-lhe porque é que não posso usar essa instrução com essa sintaxe visto que as variavis são desse formulário ?
A variavel de nome TEMPOPEVEN está definida nas configurações de empresa e guarda o tempo a ser usado .
A variavel de nome PedeUser também está nas configurações de empresa par ppodermos definir se o usuário que ativar ou não a operaçõa de pedido de identificação de usuário ao vabo de x tempo.
Quanto a frase "Não consigo usar a tela completa" é porque se colocar no WindowType CHILD, não usar a tela toda.
Fernando Almeida
Usuário Nível 1
Usuário Nível 1
Mensagens: 33
Registrado em: 24 Set 2016 12:53
Localização: Dourados - MS

Errro na criação de um formulario

Mensagem por Fernando Almeida »

Peço que me informe se é melhor compilar/linkar o aplicativo com 0 -gc3 ativo.
Pergunto porque vi aqui algures enquanto pesquisava o erro que dá para usar esse comando e gostaria de saber se tras vantagens ou não usa-lo.
ivanil
Usuário Nível 3
Usuário Nível 3
Mensagens: 166
Registrado em: 11 Set 2004 15:13
Localização: Florianópolis/SC

Errro na criação de um formulario

Mensagem por ivanil »

Olá;
Pergunto-lhe porque é que não posso usar essa instrução com essa sintaxe visto que as variáveis são desse formulário?
Para se referenciar a um formulário ou objetos de outro módulo, ou mesmo em função codificada acima da criação do formulário, adicione a diretiva Declare window seuform no topo do módulo com os demais includes;
Quanto a frase "Não consigo usar a tela completa" é porque se colocar no WindowType CHILD, não usar a tela toda.
Você pode usar a tela toda com uma child naturalmente, não confundir child com mdichild;
Peço que me informe se é melhor compilar/linkar o aplicativo com 0 -gc3 ativo.
Neste caso, coloque essa dúvida no tópico desse assunto, infelizmente não tenho nada a acrescentar; mas nesse caso eu faria meus próprios testes;

Nota:
Não entendi seu código; não tenho o contexto, mas se for o que penso, seu sistema travará quando minimizar uma modal e só retomará quando a restaurar; a modal tem por característica ter o foco exclusivo;

Grande abraço;
Fernando Almeida
Usuário Nível 1
Usuário Nível 1
Mensagens: 33
Registrado em: 24 Set 2016 12:53
Localização: Dourados - MS

Errro na criação de um formulario

Mensagem por Fernando Almeida »

Agradeço a sua colaboração na resolução do problema.
Está tudo a funcionar bem agora, eu só não consigo Compilar/Linker com essas Linhas ON MINIMIZE e ON MAXIMIZE junto.
Por isso é que elas se encontram com // antes para não serem consideradas.

Para se referenciar a um formulário ou objetos de outro módulo, ou mesmo em função codificada acima da criação do formulário,
adicione a diretiva Declare window seuform no topo do módulo com os demais includes;
isto é o código de um arquivo.FMG e está assim feito:

Código: Selecionar todos

* HMG-IDE UNICODE Form Designer Generated Code
* (c) Roberto Lopez - http://sites.google.com/site/hmgweb
*   

DEFINE WINDOW TEMPLATE AT GetDesktopRealTop() , GetDesktopRealLeft() WIDTH GetDesktopRealWidth();
    HEIGHT GetDesktopRealHeight() TITLE "Pedido de Vendas, "+m_LicEmp[12]; 
    ICON "Imagens\document_new.ico" MODAL NOSIZE;                                 
	ON INIT pedido_de_vendas_form_oninit();
	ON PAINT PaintPedidos();
	BACKCOLOR {221,223,255};
	ON INTERACTIVECLOSE {|| IF(lEncerraPedido, .t., SAIDAVENDA() )};
	ON GOTFOCUS {|| ACTVARSVD(ativoUser, BotaoPagamento) }
	
	//ON MINIMIZE {|| IF(CFG_EMP->TEMPOPEVEN>0, Pedido_de_Vendas.Timer_PedidoAtraso.Enabled :=.f., Nil),;
	//                IF(CFG_EMP->PedeUser, Pedido_de_Vendas.TPedVUser.Enabled :=.f., Nil)};
	//ON MAXIMIZE {|| IF(CFG_EMP->TEMPOPEVEN>0, Pedido_de_Vendas.Timer_PedidoAtraso.Enabled :=.t., Nil),;
	//                IF(CFG_EMP->PedeUser, Pedido_de_Vendas.TPedVUser.Enabled :=.t., Nil)}
	
	    														
    DEFINE CONTEXT MENU 
	    MENUITEM "Acesso a &Calculadora" ACTION MYRUNEXE("C:\WINDOWS\system32\calc.exe", .T.) NAME ChamaCalc IMAGE "Imagens\Calculadorax28x28.Png"  
		MENUITEM "&Teclado Virtual   [Ctrl+Win+O]" ACTION Nil NAME ChamaTeclado IMAGE "Imagens\Tecladox28x28.Png"   &&ShowTeclado() 
		SEPARATOR
		MENUITEM "Cadastro de &Artigos"  ACTION Nil NAME CriaArtigo IMAGE "Imagens\Ingredientsx28x28.png"       //CaixaArtigo.png" 
		MENUITEM "Cadastro de &Grupos"   ACTION Nil NAME CriaGrupo  IMAGE "Imagens\IconeFamilias.png" 
		SEPARATOR
		MENUITEM "Mudança de &Usuário"   ACTION EscolheUser(, 'Pedido_de_Vendas') NAME TrocaUser IMAGE "Imagens\Log-Inx28x28.png"
        SEPARATOR
		MENUITEM "&Reabrir a Conta do Pedido" ACTION IF(matModAtivo[npModulo,2]>0, IF(Pedido_de_Vendas.AbrirMesa.Enabled,;
		                                             IF(numMesaVD==0, MsgExclamation('Não está com pedido aberto no momento.', 'Atenção'),;
		                                             IF(Pedido_de_Vendas.Image_StatusFechada.Visible==.t., ReabreMesa(), MsgExclamation("o pedido já está aberto", "Atenção"))),;
		                                                MsgExclamation({PADC("Usuário sem permissão...",35), CHR(13), "Solicite um responsável do sistema."}, "Atenção")),;
												       Pedido_de_Vendas.AbrirMesa.Enabled :=.f.);
									    NAME AbrirMesa IMAGE "Imagens\Mesas.Ico"  
									   
		MENUITEM "Ver &Pedido(s) em Atraso" ACTION IF(matModAtivo[npModulo,2]>0 .AND. CFG_EMP->TpVeAtraso>0 .AND. numMesaVD>0,;
		                                              IF(Pedido_de_Vendas.VerPedidoAtraso.Enabled, PEDIDOATRASADO(), Nil), Nil);
									    NAME VerPedidoAtraso IMAGE "Imagens\Alerta-Relógiox28x28.Png" 
		MENUITEM "&Salva o Pedido em Aberto" ACTION IF(matModAtivo[npModulo,2]>0, IF(Pedido_de_Vendas.ConfPedidoVD.Enabled,;
		                                                IF(VAL(STRTRAN(Pedido_de_Vendas.Label_Tot_Merc.Value,",",""))>0, IF(numMesaVD>0, CONFIRMAVD(),; 
												                   MsgExclamation("Como è uma venda livre, confirme fazendo o seu pagamento.", 'Atenção')),;
													       MsgExclamation("Sem lançamentos em aberto para confirmar.", 'Atenção')), Nil ), Nil);
									    NAME ConfPedidoVD IMAGE "Imagens\F10x28x28.Png"  
        MENUITEM "Pe&dido(s) dado(s) como Pronto(s)" ACTION IF(matModAtivo[npModulo,2]>0, IF(Pedido_de_Vendas.PedidoFeito.Enabled, IF(Pedido_de_Vendas.Grid_Pedidos.ItemCount>0, PEDIDOFEITO(),;
		                                                                                     MsgExclamation("Não existem pedidos pendentes...", "Atenção")), Nil), Nil);
		                                NAME PedidoFeito IMAGE "Imagens\TarefaConcluidax32x32.Png"	
        MENUITEM "An&ula os dados da mesa Fechada" ACTION IF(matModAtivo[npModulo,2]>0 .AND. StatusMesa=='F', IF(Pedido_de_Vendas.AnulaMesaFechada.Enabled, ANULADOCVD(),; 
		                                                        IF(MsgYesNo({PADC("Usuário sem acesso...",45), CHR(13), "Quer continuar com a anulação da mesa ?"}, "Confirmação"),;
															    CONFAPGLIN('ANULATUDO'), Nil)), IF(Pedido_de_Vendas.Grid_Pedidos.ItemCount>0,;
																                                   MsgExclamation(IF(numMesaVD>0, "A conta ainda se encontra aberta.", "Está a elaborar uma venda livre."), "Atenção"),;
																								   Nil) );
										NAME AnulaMesaFechada IMAGE "Imagens\Apagadorx32x32.Png"

	END MENU
    	
    DEFINE STATUSBAR FONT "Arial" SIZE 12    &&Corbel
        STATUSITEM "Licenciado a: " + nomeEmpresa WIDTH 185 ICON "Imagens\Home.ico" TOOLTIP "Acesso aos dados de licençiamento"
        STATUSITEM "Usuário: " + ativoUser WIDTH 275 ICON "Imagens\add-user.ico" TOOLTIP "Acesso a criação de Usuários"
        STATUSITEM "Posto: "  + Posto->NomePosto WIDTH 235 ICON "Imagens\posto-de-trabalho.ico"
        STATUSITEM "Data: "+DTOC(DATE()) WIDTH 138
        STATUSITEM "Hora: "+TIME() WIDTH 125
		STATUSITEM "Sair" WIDTH 84 ACTION SAIDAVENDA( IF(Pedido_de_Vendas.Grid_Pedidos.ItemCount>0,;
		                                                 VAL(STRTRAN(Pedido_de_Vendas.Label_Tot_Merc.Value,",","")),0) ) ICON "Imagens\Sair.ico" TOOLTIP "Abandonar"
    END STATUSBAR

    DEFINE LABEL LABEL_Tipo_Doc
        ROW     6
        COL    15
        WIDTH  95
        HEIGHT 20
		VALUE "<Identificação>"
        FONTNAME "Arial"
        FONTSIZE 11
        FONTBOLD .F.
        FONTITALIC .F.
        FONTUNDERLINE .F.
        FONTSTRIKEOUT .F.
        HELPID Nil
        VISIBLE .T.
        TRANSPARENT .F.
        ACTION Nil
        AUTOSIZE .F.
        BACKCOLOR {221,223,255}
        FONTCOLOR NIL
    END LABEL
    ...
    ...
    .... 

   IF (CFG_EMP->ScreenSave .OR. CFG_EMP->PedeUser)    // DEFINE A VAR TIMER PARA PEDIR O USUARIO //
         DEFINE TIMER TPedVUser OF Pedido_de_Vendas INTERVAL CFG_EMP->TpPedeUser ACTION IF( DesligaTela==.f., PublicaScreen("Pedido_de_Vendas", 
          "TPedVUser"), Nil )
    ENDIF        
	
    IF matModAtivo[npModulo,2]>0 
	   DEFINE TIMER Timer_PedidoAtraso OF Pedido_de_Vendas INTERVAL CFG_EMP->TEMPOPEVEN ACTION PEDIDOATRASADO( 'Pedido_de_Vendas', 
           "Timer_PedidoAtraso" )
	   IF Pedido_de_Vendas.Grid_Pedidos.ItemCount==0 .OR. numMesaVD=0
	      SetProperty('Pedido_de_Vendas', 'Timer_PedidoAtraso', 'Enabled', .F.)
	   ENDIF 
    ENDIF
	
END WINDOW
aqui no formulário não tenho referência a outros objetos ou módulos, o que uso é uma variável de um DBF que já está aberto e pode ser usado no aplicativo. Ex: ON MINIMIZE {|| IF(CFG_EMP->TEMPOPEVEN>0, Pedido_de_Vendas.Timer_PedidoAtraso.Enabled :=.f., Nil),;
IF(CFG_EMP->PedeUser, Pedido_de_Vendas.TPedVUser.Enabled :=.f., Nil)};
as outras variaveis são deste formulário. Ex: Pedido_de_Vendas.TPedVUser.Enabled :=.f.
Não expus todo o formulário porque é muito extenso mas no final dele crio as variaveis Timer_PedidoAtraso e TPedVUser como temporizadores.
Quanto a frase "Não consigo usar a tela completa" é porque se colocar no WindowType CHILD, não usar a tela toda.
o que acontecia é que a barra de status do windows não desaparecia, ficava sempre visivel. Mas eu coloquei o NOSIZE e a barra desapareceu.

Faço a chamada deste formulário desta forma:

Código: Selecionar todos

#include "hmg.ch"

declare window Pedido_de_Vendas 

Function main_button_pedidos_de_venda_action()
LOCAL LargTela :=GetDesktopRealWidth(), oSenhaMT           
LOCAL AltTela  :=GetDesktopRealHeight()
LOCAL npModulo :=ASCAN( matModAtivo , {|x|x[1]='VENDAS'} )

PRIVATE ValPrVdLn, MostraTXImp, lEncerraPedido :=.f., NmrLnGridImp, MatImpIni
PRIVATE numMesaVD :=0, StatusMesa, MatGridPed, NomeJanela, MatGridVD, mProdutos 
PRIVATE DtRefDocV, ValReadOnly :={}, OldPrVd, OldDescVd, aFont, UserConfereConta
PRIVATE FamiliaProd :=MostraUMedida :='', AlteraLnDV :=.f., hBitmap1 :=0, TPedVUser
PRIVATE numLnGridVd, fColor, BotaoPagamento, nTotLnGrid :=0, varQtExiste :=2, varQtMinima :=5

PRIVATE BackColorGP   :={ || IF( THIS.CELLROWINDEX/2==INT(THIS.CELLROWINDEX/2),;
                          { 234,244,255 },{187,213,255} ) }
     
PRIVATE bBackColor    :={|| IF( THIS.CELLROWINDEX/2==INT(THIS.CELLROWINDEX/2),;
                                {234,244,255}, {250,250,245} ) }
							                                    &&IF( SECS(TIME()) > SECS(SecToTime(SECS(AtCellCol(9, "3"))+SECS('00:02:00')))
PRIVATE BackCorPAtraso:={|| IF(AtCellCol(12, "3")==.t. .AND. SECS(AtCellCol(9, "3"))>0 .AND. AtCellCol(10, "3")==.f.,;
                               IF(This.CellColIndex==9 .OR. This.CellColIndex==10, {255,0,0}, bBackColor), bBackColor) }
 
PRIVATE ForCorPAtraso :={|| IF(AtCellCol(12, "3")==.t. .AND. SECS(AtCellCol(9, "3"))>0 .AND. AtCellCol(10, "3")==.f.,;
                               IF(This.CellColIndex==1, {255,0,0}, IF(This.CellColIndex==9 .OR. This.CellColIndex==10, {248,248,248}, fColor )),;
						       IF('OFERTA' $AtCellCol(1, "3"), {0,151,75}, fColor)) }

IF IsWindowActive("Pedido_de_Vendas")
   DoMethod("Pedido_de_Vendas","MINIMIZE")
   DoMethod("Pedido_de_Vendas","RESTORE")
   DoMethod("Pedido_de_Vendas","SETFOCUS")   
ELSE  
   Load Window Pedido_de_Vendas 
      
   ON KEY ALT+T OF Pedido_de_Vendas ACTION Nil 

   ON KEY CONTROL+F12 OF Pedido_de_Vendas ACTION IF(DesligaTela==.f., EscolheUser(Nil, 'Pedido_de_Vendas', "TPedVUser", CATS_getFormFocus()), Nil)
   
   ON KEY CONTROL+S   OF Pedido_de_Vendas ACTION {|| oSenhaMT :=Prepare_InputWindow( oSenhaMT, 1,;
                                                  IF(DesligaTela==.f., 'Desliga a proteção de Ecran', 'Ativa a proteção de ecran'),;
                                                     { 'Senha do Responsável:' }, { "" }, { "PASSWORD" }, CFG_EMP->SenhaMestr ),;
                                                     IF(!Empty(oSenhaMT), DesligaTela:=ATIVASCREEN(DesligaTela, 'Pedido_de_Vendas', 'TPedVUser'), Nil) }
   
   Pedido_de_Vendas.Grid_Pedidos.CheckBoxEnabled :=CFG_EMP->ImpCozinha     &&MATRIZ DE VERIFICAÇÃO PARA IMPRIMIR NO PONTO DE PRODUÇÃO
        
   aFont  :=ARRAY FONT "Microsoft Sans Serif" SIZE 10 BOLD //ITALIC Calibri
   UserConfereConta :=IF(UserConfereConta==Nil, Pedido_de_Vendas.Button_ConsultaVenda.Enabled, UserConfereConta)
         
   Maximize Window Pedido_de_Vendas
   Activate Window Pedido_de_Vendas
ENDIF
Return Nil
Eu acho que tenho o código disposto da maneira certa, inclusive no inicio da rotina de chamada do FMG, tenho os includes e os declares feitos, mas se houver algum erro, fico-lhe muito grato pela correção.
Peço que me informe se é melhor compilar/linkar o aplicativo com 0 -gc3 ativo.
Perguntei sobre este assunto porque julguei que tivesse alguma informação ou experiencia com este assunto e a pudesse partilhar.
ivanil
Usuário Nível 3
Usuário Nível 3
Mensagens: 166
Registrado em: 11 Set 2004 15:13
Localização: Florianópolis/SC

Errro na criação de um formulario

Mensagem por ivanil »

Olá;


Sempre que possível, dê uma olhada nos includes para compreender melhor; [i_window..ch]

Veja que a propriedade que você tentou usar não existe para uma janela modal; embora se existisse daria erro por conta da sintaxe;

Código: Selecionar todos

#command DEFINE WINDOW TEMPLATE ;
         AT <row>,<col> ;
         WIDTH <wi> ;
         HEIGHT <h> ;
         [ MINWIDTH <minWidth> ] ;
         [ MINHEIGHT <minHeight> ] ;
         [ MAXWIDTH <maxWidth> ] ;
         [ MAXHEIGHT <maxHeight> ] ;
         [ VIRTUAL WIDTH <vWidth> ] ;
         [ VIRTUAL HEIGHT <vHeight> ] ;
         [ CLIENTAREA <clientwidth>,<clientheight> ] ;
         [ TITLE <title> ] ;
         [ ICON <icon> ] ;
         MODAL ;
         [ <noshow: NOSHOW> ] ;
         [ <noautorelease: NOAUTORELEASE> ] ;
         [ <nosize: NOSIZE> ] ;
         [ <nosysmenu: NOSYSMENU> ] ;
         [ <nocaption: NOCAPTION> ] ;
         [ CURSOR <cursor> ] ;
         [ ON INIT <InitProcedure> ] ;
         [ ON RELEASE <ReleaseProcedure> ] ;
         [ ON INTERACTIVECLOSE <interactivecloseprocedure> ] ;
         [ ON MOUSECLICK <ClickProcedure> ] ;
         [ ON MOUSEDRAG <MouseDragProcedure> ] ;
         [ ON MOUSEMOVE <MouseMoveProcedure> ] ;
         [ ON MOVE <MoveProcedure> ] ;
         [ ON SIZE <SizeProcedure> ] ;
         [ ON PAINT <PaintProcedure> ] ;
         [ ON DROPFILES <DropProcedure> ] ;
         [ BACKCOLOR <backcolor> ] ;
         [ FONT <FontName> SIZE <FontSize> ] ;
         [ ON GOTFOCUS <GotFocusProcedure> ] ;
         [ ON LOSTFOCUS <LostFocusProcedure> ] ;
         [ ON SCROLLUP <scrollup> ] ;
         [ ON SCROLLDOWN <scrolldown> ] ;
         [ ON SCROLLLEFT <scrollleft> ] ;
         [ ON SCROLLRIGHT <scrollright> ] ;
         [ ON HSCROLLBOX <hScrollBox> ] ;
         [ ON VSCROLLBOX <vScrollBox> ] ;
         [ <helpbutton: HELPBUTTON> ] ;
         [ <flashexit: FLASHEXIT> ] ;

Para definir um bloco em ON Maximize tardiamente, na linha seguinte ao "Load window..." use a sintaxe:
Pedido_de_Vendas.OnMaximize := {||...}
Pedido_de_Vendas.OnMinimize := {||...}

Nota: Não adicione logica ou atribuição diretamente ao FMG para que esta informação não se perca ao ser editada por um IDE;

Na minha opinião, suas variáveis privates deveriam ser locais;
Fernando Almeida
Usuário Nível 1
Usuário Nível 1
Mensagens: 33
Registrado em: 24 Set 2016 12:53
Localização: Dourados - MS

Errro na criação de um formulario

Mensagem por Fernando Almeida »

Obrigado Sr. Ivanil. Julguei que ON MINIMIZE existesse em MODAL tambem.

Quanto as variaveis, declaro-as privadas porque são usadas no formulário e nas funções que possam ser chamadas desse mesmo formulário.
Então para serem reconhecidas em rotinas chamadas dele eu acho mais conveniente usar privadas.
Eu vou-lhe perguntar o seguinte:
Eu tenho o temporizador que ao fim de x tempo ativa a funcao de identificação de usuário.
Ele chama essa função e pede a identificação, mas para minha surpresa, estando eu num Form MODAL, identifico-me e quando fecho o Form da Venda esse mesmo Form de Identificação de Usuário aparece tambem aberto no Form MAIN. Sendo Modal não deveria acontecer.

vou colocar aqui o abaixo o código. No Form da Venda a chamada do Form de Identificação.

Código: Selecionar todos

IF (CFG_EMP->ScreenSave .OR. CFG_EMP->PedeUser)    // DEFINE A VAR TIMER PARA PEDIR O USUARIO //
       DEFINE TIMER TPedVUser OF Pedido_de_Vendas INTERVAL CFG_EMP->TpPedeUser ACTION IF( DesligaTela==.f., PublicaScreen("Pedido_de_Vendas", "TPedVUser"), Nil )
    ENDIF   
A função de Apresentação de Publicidade e Identificação:
Eu envio 2 parametros para esta função, parametros esses que são o Nome do formulário e o nome da variavel Timer desse formulário
Porque a uso nos diversos Forms.
Tambem aproveito e desligo a variavel Timer_PedidoAtraso enquanto permanece aqui e na saida ativo-a outra vez.
Com relação ao CASE, caso a Publicidade esteja ativa na Empresa ele vai apresentar um Form com imagens a corre x tempo.
A 2 opão do CASE é apresentar uma imagem a dizer CAIXA LIVRE caso a publicidade esteja desativda e o grid de vendas esteja sem linhas.
A ultima opção vai verificar a diferença entre pedir a password do usuário ou a password de Técnico de Manutenção, porque eu tenho algumas operações que são feitos só com password de técnico de manutenção.
Isto está tudo a funcionar bem mas dá-me esse problema de abrir o Form de identificação de Usuário nos 2 Forms ativos.

Código: Selecionar todos

FUNCTION PublicaScreen( [b]xForm, xControl [/b])
LOCAL nTime :=0, EstadoDaTela
LOCAL TmpPassUser, oPedidoAtraso, oTimePedAtraso
LOCAL TempForm :=CATS_getFormFocus()

PRIVATE EncerraUser :=.f.

CFG_EMP->(DbGoTop())
IF (CFG_EMP->ScreenSaVe .OR. CFG_EMP->PedeUser) .AND. DesligaTela==.f.
   nTime    :=PegaInatividade()
   IF nTime > CFG_EMP->TPPedeUser 
      SetProperty(xForm, xControl, 'Enabled', .F.)
	     	
	  IF xForm=="Pedido_de_Vendas"
	     IF GETPROPERTY("Pedido_de_Vendas", "Timer_PedidoAtraso", "Enabled")==.t.
		    oTimePedAtraso :="Timer_PedidoAtraso"
	        oPedidoAtraso  :=GETPROPERTY("Pedido_de_Vendas", "Timer_PedidoAtraso", "Enabled")
	        SetProperty("Pedido_de_Vendas", "Timer_PedidoAtraso", "Enabled", .f.)
		 ENDIF 
	  ENDIF 
	  
	  DO CASE	   
	     CASE CFG_EMP->ScreenSave
		    IF IsWindowActive("FormPublica")
               DoMethod("FormPublica", "Minimize")
               DoMethod("FormPublica", "Restore")
               DoMethod("FormPublica", "SetFocus")
         	ELSE 
               Load Window FormPublica
			   FormPublica.Maximize
               FormPublica.Activate
			ENDIF
			DoMethod(xForm, "SetFocus")
         CASE TempForm=='Pedido_de_Vendas' .AND. !CFG_EMP->ScreenSave .AND. GETPROPERTY("Pedido_de_Vendas", "Grid_Pedidos", "ItemCount")=0
		    IF IsWindowActive("FormCaixaLivre")
               DoMethod("FormCaixaLivre", "MINIMIZE")
               DoMethod("FormCaixaLivre", "RESTORE")
               DoMethod("FormCaixaLivre", "SETFocus")
         	ELSE 
               Load Window FormCaixaLivre
			   FormCaixaLivre.Center 
               FormCaixaLivre.Activate
			ENDIF 
		 OTHER 
	        IF TempForm=="CriaLicenca" .OR. TempForm=="CriaUsuario" .OR. TempForm=="FormDistribuidor"
			   IF IsWindowActive("FormSuperVisor")
			      DoMethod("FormSuperVisor", "Release") 
			   ENDIF 
               TmpPassUser :=Prepare_InputWindow( TmpPassUser, 1, GETPROPERTY(TempForm, "Title"), {'Senha do Responsável:'},;
                                            {""}, {"PASSWORD"}, m_LicEmp[10] )
               IF EMPTY(TmpPassUser)
 	              DO WHILE .t.
 	                 IF TempForm !='Main'
	                    DoMethod(TempForm, "Release")
	   	                TempForm :=xForm
		             ELSE 
			            EXIT 
		             ENDIF
	              ENDDO
               ENDIF 
            ENDIF 
	        IF EMPTY(TmpPassUser) .AND. !IsWindowActive("FormSuperVisor")
			   [b]EscolheUser(NIL, xForm, xControl)[/b]
	        ENDIF  
      ENDCASE 			
	  IF IsWindowActive("Pedido_de_Vendas") .AND. oTimePedAtraso !=Nil 
	     SetProperty("Pedido_de_Vendas", oTimePedAtraso, "Enabled", oPedidoAtraso)
	  ENDIF 

	  SetProperty(xForm, xControl, 'Enabled', .T.)
   ENDIF
ENDIF
Return Nil


A função que chama o form de Identificação do Usuário é esta:

Código: Selecionar todos

#include "hmg.ch"

declare window FormSuperVisor     

FUNCTION EscolheUser(flgVeSn, NomeJanela, xControl)

PRIVATE EncerraUser :=.f., numParam :=PCOUNT()

DoMethod(NomeJanela, "SetFocus")
IF IsWindowActive("FormSuperVisor")
   DoMethod("FormSuperVisor","Minimize")
   DoMethod("FormSuperVisor","Restore")
   DoMethod("FormSuperVisor","SetFocus")
ELSE  
   Load Window FormSuperVisor
	    
   ON KEY TAB OF FormSuperVisor ACTION FormSuperVisor.Text_IDOperador.SetFocus	
   ON KEY RETURN OF FormSuperVisor ACTION IF(flgVeSn<>Nil, VerificaIDOpera("F", @flgVeSn), VerificaIDOpera("F") )
         		
   ON KEY BACK OF FormSuperVisor ACTION ;
	              FormSuperVisor.Text_IDOperador.Value :=LEFT(FormSuperVisor.Text_IDOperador.Value, HB_ULEN(FormSuperVisor.Text_IDOperador.Value)-1)
   ON KEY ESCAPE OF FormSuperVisor ACTION IF(flgVeSn<>Nil, FechaIDOpera(.t.), IF(lEncerra, .t., SairAplic()))
   
   FormSuperVisor.Center
   FormSuperVisor.Activate 
    
ENDIF
Return( IF(flgVeSn<>Nil, flgVeSn, .t.) )
Eu faço um setfocus no form ativo e verifica se já está ativo o Form de Identificação de usuário com o nome de FormSupervisor.
O meu problema é como disse acima, aparecer este Form nos 2 lugares.
fico desde já a disposição de quaiquer esclarecimentos adicionais que possa precisar.
]
ivanil
Usuário Nível 3
Usuário Nível 3
Mensagens: 166
Registrado em: 11 Set 2004 15:13
Localização: Florianópolis/SC

Errro na criação de um formulario

Mensagem por ivanil »

Ola;

é muita coisa para alguém de fora entender por fraguimentos e ainda que mande o código completo toma muito tempo;

Sugiro usar o debug para rastrear, eu particularmente criaria um timer único em "MAIN" e a partir dele controlaria todo o sistema; muitos eventos são disparados, sendo assim pode haver vazamentos que você não perceba.
Fernando Almeida
Usuário Nível 1
Usuário Nível 1
Mensagens: 33
Registrado em: 24 Set 2016 12:53
Localização: Dourados - MS

Errro na criação de um formulario

Mensagem por Fernando Almeida »

Sr. Ivanil constatei que sempre que estou no Formulário da Venda e chamando o Form de identificação de usuário ele abre bem esse formulário e eu introduzo a senha. Até aqui tudo bem mas quando confirmo com o ENTER, ele abre esse mesmo Form de Identificação no Form principal ou MAIN e fecha-o neste segundo Form da venda. Comportamento muito estranho.
Abaixo vou colocar as rotinas de abertura do Form de Identificação e Confirmação de Usuário.

Código: Selecionar todos

#include "hmg.ch"

declare window FormSuperVisor     

FUNCTION EscolheUser(NomeJanela)
PRIVATE EncerraUser :=.f.    

DesligaTela :=.t.
IF IsWindowActive("FormSuperVisor")
   DoMethod("FormSuperVisor","Minimize")
   DoMethod("FormSuperVisor","Restore")
   DoMethod("FormSuperVisor","SetFocus")
ELSE  
   Load Window FormSuperVisor
	    
   ON KEY TAB OF FormSuperVisor ACTION FormSuperVisor.Text_IDOperador.SetFocus	
   ON KEY RETURN OF FormSuperVisor ACTION VerificaIDOpera("F")
         		
   ON KEY BACK OF FormSuperVisor ACTION ;
	              FormSuperVisor.Text_IDOperador.Value :=LEFT(FormSuperVisor.Text_IDOperador.Value, HB_ULEN(FormSuperVisor.Text_IDOperador.Value)-1)
   ON KEY ESCAPE OF FormSuperVisor ACTION IF(lEncerra, .t., SairAplic())
   
   FormSuperVisor.Center
   FormSuperVisor.Activate 
    
ENDIF
DesligaTela :=.f.
Return  
Aqui estão as rotinas de validação de Usuário e Fecho de Form:

Código: Selecionar todos

Function FechaIDOpera( FechaForm )

IF FechaForm
   IF SELECT('P_MESAS')>0
      CLOSE P_MESAS
      USE 'PLMESA'+HB_NTos(Users->Codigo) SHARED NEW ALIAS P_MESAS
      SELECT('P_MESAS')
      P_MESAS->(DbGoTop())
   ENDIF 
   RELEASE KEY RETURN OF FormSuperVisor
   Release KEY BACK OF FormSuperVisor
   Release KEY ESCAPE OF FormSuperVisor
   EncerraUser :=.t.
   FormSuperVisor.Release 
ELSE 
   IF MsgYesNo("Pretende Abandonar a aplicação ?", "Confirmação")
      EncerraUser :=.t.
      SairAplic( EncerraUser )
   ENDIF 	  
ENDIF 
Return Nil 

//========================================================================================//

FUNCTION VerificaIDOpera(flgInc)
LOCAL aUserCorrente
LOCAL vPassW, OldOrdem, OldKeyNo

STATIC nConta   :=0 
   
DO CASE 
   CASE flgInc !="F" 
      FormSuperVisor.Text_IDOperador.Value :=FormSuperVisor.Text_IDOperador.Value + ;
		                                     IF(LEN(FormSuperVisor.Text_IDOperador.Value)<8, flgInc, "")
   OTHER
	  SELECT("Users")
      OldOrdem :=OrdName()
	  OldKeyNo :=RecNo()
		   
	  vPassW   :=EncriptaPass( FormSuperVisor.Text_IDOperador.Value )
	  vPassW   :=PADR( vPassW, 8)
	  IF EMPTY(vPassW)
	     Return .f.
	  ELSE
	     IF Users->Password !=vPassW
	        nConta +=1
		    MsgExclamation({"Password de operador incorreta !" + CHR(13)+CHR(13),;
		                    PADC( IF(nConta=3,"Esgotaram-se as tentativas...",;
		       			    "Tem mais " + HB_NToS(3-nConta) + " tentativa(s)."),35)}, "Atenção")
		    FormSuperVisor.Text_IDOperador.Value :=""
        	IF nConta<3
		      Return .f.
		    ELSE
		      IF !SairAplic()
		         nConta :=0
		         Return .f.
		      ENDIF
		    ENDIF
	     ELSE 
            nConta  :=0
            IF ativoUser !=Users->Utilizador
			   ativoUser :=Users->Utilizador
			   OrdSetFocus( OldOrdem )
		       Users->(DbGoTo( OldKeyNo ))
			ENDIF 
			FechaIDOpera(.t.)
			 			  
		 ENDIF  
	  ENDIF
ENDCASE
Return Nil 
Aproveito para dizer que nesta rotina de verificação de operador tembém concateno as teclas premidas pelo usuário por isso tem o parametro de tecla primida pelo usuário.
Agora quando confirmo ele vai a rotina FechaIDOpera com o valor .T. e nessa parte ele fecha o arquivo de mesas e faz um release ao Form de Usuário.
Pergunto se estou a esquecer alguma coisa no fecho desse Formulário, porque é aqui quando confirmo que ele o abre no MAIN novamente.
ivanil
Usuário Nível 3
Usuário Nível 3
Mensagens: 166
Registrado em: 11 Set 2004 15:13
Localização: Florianópolis/SC

Errro na criação de um formulario

Mensagem por ivanil »

Caro amigo,


Não tenho a visão do sistema que você tem, olhar pequenos fragmentos não me permite ter um entendimento global; pode ser muita coisa;

dê uma olhadinha neste vídeo, talvez te ajude a entender possíveis problemas de pilha;

https://youtu.be/oSkQ4wDyW2g
Fernando Almeida
Usuário Nível 1
Usuário Nível 1
Mensagens: 33
Registrado em: 24 Set 2016 12:53
Localização: Dourados - MS

Errro na criação de um formulario

Mensagem por Fernando Almeida »

Muito obrigado, o erro não está nas rotinas de identificação do usuário. Peço desculpa por o ocupar este tempo todo quando o problema está mesmo no formulário da Venda.
Porque tudo funciona bem no resto do trabalho, só ali naquele form é que me dá aquele problema.
Vou ter que refazer o Form de Vendas de cima a baixo par encontrar o erro.
Sr. Ivanil vou-lhe perguntar se tem alguma rotina com o control Tree a funcionar, ou seja carregar esse control com os dados de um Dbf.
Se tiver alguma coisa com esse control e puder disponibilizar para eu poder estudar e adaptar as minhas necessidades eu agradecia imenso.
Um forte abraço.
ivanil
Usuário Nível 3
Usuário Nível 3
Mensagens: 166
Registrado em: 11 Set 2004 15:13
Localização: Florianópolis/SC

Errro na criação de um formulario

Mensagem por ivanil »

Ola

o controle tree é um objeto como outro qualquer, não tem como ter uma rotina especifica, você o alimenta de acordo com sua necessidade;
veja em <Minigui\SAMPLES\BASIC\> ha pelo menos 2 pastas com exemplos completos, bem detalhados e funcionais que você pode adaptar a seu gosto;
Fernando Almeida
Usuário Nível 1
Usuário Nível 1
Mensagens: 33
Registrado em: 24 Set 2016 12:53
Localização: Dourados - MS

Errro na criação de um formulario

Mensagem por Fernando Almeida »

Ok, muito obrigado pelo tempo que dispos para corrigir o problema.
Só consegui resolver o problema usando uma função da qual disse que não aprova.
Parece um paradoxo mas é verdade.
Fiz o seguinte em desespero de causa:
criei uma variavel local com essa funçã: LOCAL TempForm :=CATS_getFormFocus()
em seguida dei a instrução antes da chamado do Form do Usuário: DoMethod(TempForm, "SetFocus")
e com isso tudo funciona bem.
O Thiswindow.Name e This.Name tinham o valor de Main e por isso eu não conseguia colocar-me no Form certo.

Sr. Ivanil vou aproveitar e perguntar-lhe se já se deparou ou já veu este comportamento da HMG-IDE 1.2a Unicode, que é a que uso com o harbour Harbour 3.2.0dev (r1703241902).

É que sempre que faço a compilação/linkagem do trabalho e o executo, ele demora a abrir o aplicativo e dentro dele demora uns 4 a 5 segundos a abrir os formulários.
Depois de umas 3 ou 4 tentativas ele começa a abrir os formulários mais rápido novamente. Mas só depois de eu abrir e fecha-los umas 4 a 5 vezes.
Será que não tenho as configurações certas ou esta versão do HMG está corrumpida.
ivanil
Usuário Nível 3
Usuário Nível 3
Mensagens: 166
Registrado em: 11 Set 2004 15:13
Localização: Florianópolis/SC

Errro na criação de um formulario

Mensagem por ivanil »

Atrasos em abrir o aplicativo é geralmente o antivírus verificando;

Atrasos em abrir o formulário, pode não ser o formulário propriamente dito e sim a abertura do bd, dependendo da forma como você alimenta os controles pode ser outro fator;
Responder