Página 2 de 3
Temporizador no MiniGui
Enviado: 03 Mar 2014 11:39
por Toledo
Amigos, em anexo segue um exemplo.
Abraços,
Obs.: exemplo em MiniGui Extended, mas para HMG Oficial basta trocar no código fonte o minigui.ch por hmg.ch
Temporizador no MiniGui
Enviado: 03 Mar 2014 17:34
por Hasse
Boa tarde colegas.
Toledo:
Analisei o teu código, e a ideia muito simples e de fácil compreensão. Certamente vou testar, e certamente irá funcionar. Veja o parágrafo, que numerei aleatoriamente de 5)-. Muito obrigado pela atenção.
Asimoes:
Analisando as tuas ponderações e perguntas, também vejo que como está, isto fatalmente iria acontecer. Acontece que eu já uso o LIGA_TIMER() exatamente como você sugeriu em uma das mensagens acima. Como este não era o foco principal, e para encurtar o código, acabei por deletar estas linhas na postagem.
Veja se o meu raciocínio pode funcionar. Por enquanto, eu vejo que deve funcionar:
O DEFINE TIMER envia o processamento para o Temporizador() a cada 1 segundo (1000). Este retorna ao Principal.
Quando o valor dos 5 minutos (30000) zerar, o Temporizador() retorna a simulação de um RETURN.
Com a simulação de um RETURN, conforme você postou acima, o ON KEY RETURN envia o processamento para o Baixa_Prescr().
5)-Por fim, falta ainda resolver o funcionamento das LABEL's na Baixa_Prescr(), quando o foco está em outro aplicativo.
Explicando, este outro aplicativo é que fará a manutenção dos dados baixados e gravados pelo aplicativo em desenvolvimento.
Ele funciona em modo janelado e não usa a tela total, permitindo a visão constante da pequena janela windows, no topo da tela.
Por este motivo é que estou arrebentando os poucos tico-e-teco que ainda estão ativos (RS RS RS RS).
Com a ideia que o Toledo postou acima, penso que se poderia colocar todos estes LABEL's em uma única função semelhante, tipo FUNCTION Prt_Label( index ), onde o valor do index indicaria qual LABEl seria acionado.
O que me dizem desta ideia ?
Vale a pena testar ?
Será que o DO EVENTS não irá atrapalhar o andar dos diversos passos da função Baixa_Prescr() ?
Temporizador no MiniGui
Enviado: 03 Mar 2014 19:08
por Hasse
Caro Asimoes.
Como ficaria para as teclas ENTER e ESCAPE ?
Preciso criar outra função ? tipo:
Código: Selecionar todos
HB_FUNC( SIMULAESC )
{
keybd_event(
VK_ESCAPE,
0,
0,
0
);
}
#pragma ENDDUMP
No código, para simular, basta referenciar ? tipo SIMULAENTER() e SIMULAESC() ?
Temporizador no MiniGui
Enviado: 03 Mar 2014 19:23
por asimoes
Hasse,
Veja esse exemplo, a janela sempre fica ativa mesmo que você mude o foco para outra, sem perder o controle.
janela.prg
Código: Selecionar todos
/*
* Teste com janela
* Copyright 03-2014 Alexandre Simões <asimoesluz@gmail.com>
*/
#include "minigui.ch"
#include "common.ch"
#include "directry.ch"
#include "fileio.ch"
#include "hbcompat.ch"
#include "hbwin.ch"
#define PROGRAM 'Janela'
#define VERSION ' version 1.0'
#define COPYRIGHT ' Alexandre Simões, 03-2014'
STATIC hWnd := 0
DECLARE WINDOW Form_0
DECLARE WINDOW Form_1
FUNCTION Main()
LOAD WINDOW Form_0
LOAD WINDOW Form_1
ACTIVATE WINDOW Form_1, Form_0
RETURN Nil
FUNCTION BuildMenu()
ITEM 'S&air' ACTION {|| Form_1.Timer_1.Release, Form_0.Release }
RETURN Nil
form_0.fmg
Código: Selecionar todos
DEFINE WINDOW TEMPLATE ;
AT 0,0 ;
WIDTH 0 HEIGHT 0 ;
TITLE PROGRAM ;
MAIN NOSHOW ;
NOTIFYICON "ICON_A" ;
NOTIFYTOOLTIP PROGRAM ;
ON NOTIFYCLICK IF( IsWindowVisible(hWnd), Form_1.Hide, Form_1.Show )
DEFINE NOTIFY MENU OF Form_0
BuildMenu()
END MENU
END WINDOW
form_1.fmg
Código: Selecionar todos
DEFINE WINDOW TEMPLATE ;
AT 0,0 ;
WIDTH 1024 HEIGHT 768;
TITLE PROGRAM ;
CHILD ;
TOPMOST ;
ON INIT (hWnd := GetActiveWindow() ) ;
ON INTERACTIVECLOSE Form_0.Release
DEFINE LABEL Label_1
ROW 0
COL 0
VALUE Time()
WIDTH 58
HEIGHT 20
FONTNAME "Courier New"
FONTSIZE 8
BORDER .T.
TOOLTIP DtoC(Date())
BACKCOLOR WHITE
FONTCOLOR BLACK
VCENTERALIGN .T.
END LABEL
DEFINE TIMER Timer_1 INTERVAL 1000 ACTION ( Form_1.Label_1.Value := Time() )
DEFINE CONTEXT MENU
BuildMenu()
END MENU
END WINDOW
janela.rc
Código: Selecionar todos
// MANIFEST FOR CREATE 'XP-STYLE' APPLICATIONS
// O compilador gera os icones pela ordem alfabética dos nomes dados ao icone, portanto o icone da
// aplicação deve ser o primeiro da lista na ordem alfanumerica.
ICON_A ICON FILESYS2.ICO
Temporizador no MiniGui
Enviado: 03 Mar 2014 19:34
por asimoes
Funções para simular o enter e escape.
Código: Selecionar todos
#pragma BEGINDUMP
#include <windows.h>
HB_FUNC( SIMULAESCAPE )
{
keybd_event(
VK_ESCAPE,
0,
0,
0
);
}
HB_FUNC( SIMULAENTER )
{
keybd_event(
VK_RETURN,
0,
0,
0
);
}
#pragma ENDDUMP
Outros valores de VK*

Temporizador no MiniGui
Enviado: 03 Mar 2014 21:44
por Hasse
Citando:
Funções para simular o enter e escape.
Entendido. Para cada tecla que se deseja simular necessita-se de uma função.
Também já testei as funções em C++, SIMULAENTER() e SINMULAESCAPE(). Funcionam perfeitamente.
Citando:
Outros valores de VK*
Entendido.
Agora uma pergunta que não deixa calar:
Porque será que o pessoal que desenvolveu a MiniGui (respeito e homenagens a eles !!!) resolveu alterar de forma tão radical a manipulação destes valores ?
Isto quer dizer que a tecla ESCAPE tem o valor hexadecimal 1B e ENTER 0D ?
Citando meu texto:
Com a ideia que o Toledo postou acima, penso que se poderia colocar todos estes LABEL's em uma única função semelhante, tipo FUNCTION Prt_Label( index ), onde o valor do index indicaria qual LABEl seria acionado.
Testei a minha ideia e não funcionou. O comando DO EVENTS remete o processamento diretamente para o RETURN final.
Cintando e meu texto:
Por fim, falta ainda resolver o funcionamento das LABEL's na Baixa_Prescr()
Já baixei o teu exemplo. Vou estudar e testar em seguida.
Toledo:
Já testei a tua sugestão. Funciona que é uma maravilha. Obrigado a você e ao Asimoes pela dedicação a este aprendiz que ainda tem muito a aprender.
Temporizador no MiniGui
Enviado: 04 Mar 2014 10:47
por asimoes
Hasse,
Utilizando o exemplo anteriormente postado adaptando ao exemplo do Toledo.
Boa diversão!
Código: Selecionar todos
/*
* Exemplo de Janela com temporizador
* Adicionado ao exemplo do Mestre Toledo.
*/
#include "minigui.ch"
#include "common.ch"
#include "directry.ch"
#include "fileio.ch"
#include "hbcompat.ch"
#include "hbwin.ch"
#define PROGRAM 'Demo com Temporizador'
STATIC hMainWin := 0
DECLARE WINDOW Form_0
DECLARE WINDOW Form_1
/*
*/
FUNCTION Main()
LOCAL n_Lrg:=600
PRIVATE n_Minutos:=5
PRIVATE n_Interv_5:=n_Minutos*60000
PRIVATE lAtualiza:=.T.
nWidth_:=GetDesktopWidth()
LOAD WINDOW Form_0
LOAD WINDOW Form_1
ACTIVATE WINDOW Form_1, Form_0
RETURN Nil
FUNCTION BuildMenu()
Notificar("Janela Ativada", "Demo de Temporizador")
SEPARATOR
ITEM 'S&air' ACTION {|| Form_1.Timer_1.Release, Form_0.Release }
RETURN Nil
STATIC PROCEDURE Notificar(cMensagem, cTitulo, lFim)
*--------------------------------------------------------*
LOCAL nIconIndex
LOCAL cTitle
LOCAL cMessage
HB_Default(@cTitulo,"PrintWin")
HB_Default(@lFim,.F.)
nIconIndex:=1
cTitle :=WIN_AnsiToOEM(cTitulo)
cMessage :=WIN_AnsiToOEM(cMensagem)
ShellTrayBalloonTipShow( hMainWin, nIconIndex, cTitle, cMessage )
IF lFim
HB_IdleSleep( 3 )
WIN_ShellNotifyIcon( hMainWin, , , , , , Chr(0) )
ENDIF
RETURN
*--------------------------------------------------------------------------------*
FUNCTION ShellTrayBalloonTipShow( hWnd, nIconIndex, cTitle, cMessage )
*--------------------------------------------------------------------------------*
RETURN WIN_ShellNotifyIcon( hWnd, , , , , , cMessage, 20000, cTitle, nIconIndex )
*********************************
FUNCTION Baixa_Prescr()
lAtualiza:=.F.
_SetValue( 'label_1', 'form_1', 'Conexão ATIVA' )
_SetValue( 'label_2', 'form_1', '=== Download em andamento ===' )
/* Aguarda 30 segundos, apenas para simular que está baixando algum arquivo */
millisec(30000)
n_Interv_5:=n_Minutos*60000
lAtualiza:=.T.
RETURN .T.
*********************************
FUNCTION MudaLabel(lAtualiza)
If lAtualiza
IF n_Interv_5==(n_Minutos*60000)
_SetValue( 'label_1', 'form_1', '<ESC> Encerrar <ENTER> Iniciar outra leitura' )
ENDIF
IF n_Interv_5>9000
c_Tempo := Right(SecToTime(n_Interv_5 / 1000),5)
_SetValue( 'label_2', 'form_1', 'Próxima leitura em ' + c_Tempo + ' minutos' )
ELSE
c_Tempo := Right(SecToTime(n_Interv_5 / 1000),1)
_SetValue( 'label_2', 'form_1', 'Leitura iniciando em ' + c_Tempo + ' segundos' )
ENDIF
n_Interv_5-=1000
IF n_Interv_5<=0
Baixa_Prescr()
ENDIF
DO EVENTS
ENDIF
RETURN Nil
form_0.fmg
Código: Selecionar todos
DEFINE WINDOW TEMPLATE ;
AT 0,0 ;
WIDTH 0 HEIGHT 0 ;
TITLE PROGRAM ;
MAIN NOSHOW ;
NOTIFYICON "ICON_A" ;
NOTIFYTOOLTIP PROGRAM ;
ON NOTIFYCLICK IF( IsWindowVisible(hWnd), Form_1.Hide, Form_1.Show ) ;
DEFINE NOTIFY MENU OF Form_0
BuildMenu()
END MENU
END WINDOW
hMainWin:=WIN_N2P( Application.Handle )
form_1.fmg
Código: Selecionar todos
DEFINE WINDOW TEMPLATE ;
AT 0,750 ;
WIDTH 600 HEIGHT 100;
TITLE 'Demo de Temporizador' ;
CHILD ;
ON INTERACTIVECLOSE Form_0.Release
@ 12,15 LABEL label_1 WIDTH n_Lrg-60 HEIGHT 20 ;
VALUE 'Conexão INATIVA' ;
FONT 'Times New Roman' SIZE 14 ;
FONTCOLOR RED
@ 40,15 LABEL label_2 WIDTH n_Lrg-60 HEIGHT 20 ;
VALUE '===============' ;
FONT 'Times New Roman' SIZE 14 ;
FONTCOLOR BLUE
ON KEY ESCAPE ACTION { || ThisWindow.Release }
ON KEY RETURN ACTION { || Baixa_Prescr() }
DEFINE TIMER Timer_1 INTERVAL 1000 ACTION MudaLabel(lAtualiza)
DEFINE CONTEXT MENU
BuildMenu()
END MENU
END WINDOW
FORM_1:=nWidth_-640
Temporizador no MiniGui
Enviado: 04 Mar 2014 11:35
por asimoes
Uma pequena modificação na função Baixa_Prescr
Para não dar erro na janela.
Código: Selecionar todos
FUNCTION Baixa_Prescr()
LOCAL nContador:=1
lAtualiza:=.F.
_SetValue( 'label_1', 'form_1', 'Conexão ATIVA' )
_SetValue( 'label_2', 'form_1', '=== Download em andamento ===' )
/* Aguarda 30 segundos, apenas para simular que está baixando algum arquivo */
DO WHILE nContador <= 30
HB_IdleSleep( 1 )
DO EVENTS
nContador++
ENDDO
n_Interv_5:=n_Minutos*60000
lAtualiza:=.T.
RETURN .T.
Temporizador no MiniGui
Enviado: 04 Mar 2014 12:31
por Hasse
Huuuuummmmm !!!!
Diversão é

??? Brincadeira....
Só pergunta:
qual a finalidade da função "HB_IdleSleep( 1 )" ?
o que ela faz ?
Temporizador no MiniGui
Enviado: 04 Mar 2014 12:50
por asimoes
A função HB_IdleSleep() é utilizada para não sobrecarregar o processador. O parâmetro passado é em segundos.
Ex. HB_IdleSleep(30) para o processamento por 30 seg.
Temporizador no MiniGui
Enviado: 04 Mar 2014 13:25
por Hasse
Entendido.
Agora percebi que é uma função nativa do xHarbour.
Obrigado pelos exemplos, ajuda e orientação.
Um abração.
Temporizador no MiniGui
Enviado: 04 Mar 2014 14:41
por asimoes
Consegui simular o enter no exemplo anterior mesmo que o foco esteja em outra janela:
Funções novas:
SetForeGroundWindow( GetFormHandle('form_1') ) //Este aqui é muito importante o foco deve voltar para que a simulação do enter funcione corretamente.
Código: Selecionar todos
FUNCTION TesteEnter
SimulaEnter()
RETURN ""
FUNCTION MudaLabel(lAtualiza)
IF lAtualiza
IF n_Interv_5==(n_Minutos*60000)
_SetValue( 'label_1', 'form_1', '<ESC> Encerrar <ENTER> Iniciar outra leitura' )
DO EVENTS
ENDIF
IF n_Interv_5 == 270000 // Inclui para testar: nos 4:30 simula o enter
SetForeGroundWindow( GetFormHandle('form_1') ) muda o foco para cá.
form_1.Button_11.caption:=TesteEnter() //O enter entra no caption do botão invisivel.
ENDIF
IF n_Interv_5>9000
c_Tempo := Right(SecToTime(n_Interv_5 / 1000),5)
_SetValue( 'label_2', 'form_1', 'Próxima leitura em ' + c_Tempo + ' minutos' )
ELSE
c_Tempo := Right(SecToTime(n_Interv_5 / 1000),1)
_SetValue( 'label_2', 'form_1', 'Leitura iniciando em ' + c_Tempo + ' segundos' )
ENDIF
n_Interv_5-=1000
IF n_Interv_5<=0
Baixa_Prescr()
ENDIF
DO EVENTS
ENDIF
RETURN Nil
form_1.fmg
Código: Selecionar todos
DEFINE WINDOW TEMPLATE ;
AT 0,750 ;
WIDTH 600 HEIGHT 100;
TITLE 'Demo com Temporizador' ;
CHILD NOSIZE;
ON INTERACTIVECLOSE Form_0.Release
@ 12,15 LABEL label_1 WIDTH n_Lrg-60 HEIGHT 20 ;
VALUE 'Conexão INATIVA' ;
FONT 'Times New Roman' SIZE 14 ;
FONTCOLOR RED
@ 40,15 LABEL label_2 WIDTH n_Lrg-60 HEIGHT 20 ;
VALUE '===============' ;
FONT 'Times New Roman' SIZE 14 ;
FONTCOLOR BLUE
@ 40,300 BUTTON Button_11 CAPTION 'Ok' INVISIBLE //O botão fica invisivel no form
ON KEY ESCAPE ACTION { || ThisWindow.Release }
ON KEY RETURN ACTION { || Baixa_Prescr() }
DEFINE TIMER Timer_1 INTERVAL 1000 ACTION MudaLabel(lAtualiza)
DEFINE CONTEXT MENU
BuildMenu()
END MENU
END WINDOW
FORM_1:=nWidth_-640
Temporizador no MiniGui
Enviado: 04 Mar 2014 15:12
por asimoes
Se a janela for minimizada não vai funcionar, tem que restaurar primeiro com SENDMESSAGE
Incluir esses defines no inicio do programa.
Código: Selecionar todos
#define WM_SYSCOMMAND 274
#define SC_MAXIMIZE 61488 // 0xF030
#define SC_RESTORE 61728
Código: Selecionar todos
IF n_Interv_5 == 270000
SetForeGroundWindow( GetFormHandle('form_1') )
SENDMESSAGE(GetFormHandle('form_1'),WM_SYSCOMMAND,SC_RESTORE,0) //Tem que restaurar a janela primeiro!
form_1.Button_11.caption:=TesteEnter()
ENDIF
Temporizador no MiniGui
Enviado: 04 Mar 2014 15:59
por Hasse
Muito boa esta opção de voltar o foco ao aplicativo DL_Prescricao.
Para evitar que alguém minimize o aplicativo podemos desativar a opção minimizar. Eu sei que é possível, pois já li a respeito, só não lembro aonde e nem como.
Mas também podemos usar o SENDMESSAGE
Mesmo que faça sentido maximizar a tela, já que a tela será ocupada pelo aplicativo principal de manutenção), preciso usar o #define SC_MAXIMIZE ?
#define SC_RESTORE, pelo que entendi é o valopr para voltar o foco para o aplicativo DL_Prescricao, correto ?
Desta forma este é importante.
form_1.Button_11.caption:=TesteEnter() - Isto é para criar inserir um texto no botão, correto ? Eu não uso botões neste aplicativo, então certamente não preciso dele, correto ?
Pelo andar da carruagem, este aplicativo vai ficar "supimpa", como se dizia nos meus tempos de moleque.... "muito massa", hoje.
Valeu Asimoes !!!
Temporizador no MiniGui
Enviado: 04 Mar 2014 17:50
por Hasse
Asimoes:
Rodei o teste postado. Ficou MUUIITTTOOO BBBOOOMMM !!!!!
Funciona muito bem. :-Y

) :-Y

)
Agora é só incorporar estes códigos no aplicativo, ou vice-versa, e partir "pro abraço".
Sem a valiosíssima orientação dos amigos eu não teria obtido o êxito já alcançado. :{ :-Y
Obrigado a você, Mestre Asimoes, e também ao Mestre Toledo.