Fórum TTimer - Colocando evento ontimer ?? #327209
10/08/2006
0
Num projeto q estou fazendo q a maior parte das funções fica em uma dll, me surgiu um problema. Como colocar o evento ontimer em tempo de execução tipo assim
Procedure TTimer; StdCall;
Var
Tempo : TTimer;
Begin
Tempo := TTimer.Create(Nil);
Try
With Tempo Do
Begin
Enabled := TRUE;
Interval := 1000;
Ontimer := ´O Q Eu Coloco Aqui Pra Fazer no Ontimer ???´;
Finally;
End;
End;
Isso q eu gostaria de saber:
Ontimer := ´O Q Eu Coloco Aqui Pra Fazer no Ontimer ???´;
Não Consegui Fazer Tipo Uma Procedure Dizendo o q ele deve fazer no Evento Ontimer.
Lembrando q estou fazendo isso em uma DLL.
Desde Já Agradeço

Buffering
Curtir tópico
+ 0Posts
10/08/2006
Siam
Gostei + 0
11/08/2006
Rodc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | Procedure TTimer; StdCall; Var Tempo : TTimer; Begin Tempo := TTimer.Create(Nil); Try With Tempo Do Begin Enabled := TRUE; Interval := 1000; Ontimer := MeuTimerOnTimer; Finally; End; End; Procedure MeuTimerOnTimer(Sender: TObject); begin // Código do OnTimer end; |
Gostei + 0
11/08/2006
Siam
Gostei + 0
11/08/2006
Rodc
Gostei + 0
11/08/2006
Siam
Em qual versão do Delphi ?
No Delphi 6 dá erro de compilação pq a atribuição está errada.
Gostei + 0
11/08/2006
Rodc
1 | Button1.Click := Button1OnClick; |
Qual é a mensagem de erro que o Delphi está lhe retornando?
Gostei + 0
11/08/2006
Siam
Gostei + 0
11/08/2006
Buffering
Incompatible types: ´method pointer and regular procedure´
siam vc disse q já passou c vc puder escrever a solução por Thread
Vou Continuar No Aguarde
Gostei + 0
11/08/2006
Rodc
Mas este erro acontece mesmo se você fizer o exemplo abaixo?
1 | Button1.Click := Button1OnClick; |
E o help do Delphi, que diz deste erro?
Gostei + 0
11/08/2006
Siam
Não ví o Help do Delphi, mas dá para deduzir que um TNotifyEvent é um método de um objeto e não um método regular, por isso que dá tipos incompatíveis:
type TNotifyEvent = procedure(Sender:TObject) [b:714ea00bc4]of object[/b:714ea00bc4];
[b:714ea00bc4]of object[/b:714ea00bc4] quer dizer que o método tem de estar dentro de uma classe.
Defina uma Thread e em seu método execute marque o tempo decorrido pela função GetTickCount. Quando o tempo vencer é o evento onTimer.
Gostei + 0
11/08/2006
Rodc
Ah sim!!! Agora lembrei qual é o problema. É bem isto que você comentou!! O evento tem que pertencer a alguma classe. Por isto que na DLL não funciona, pq na DLL você tem eventos que não pertencem à classe nenhuma, e é por isso que na thread funciona, pq a função passa a fazer parte da classe da Thread.
Sugiro então criar uma classe que tenha apenas a variável do tipo TTimer e a função que ela irá executar, daí no Create da classe você atribui ao OnTimer do Timer a função que está na mesma classe que o componente.
Será que eu fui claro!? :shock:
Gostei + 0
11/08/2006
Siam
A Thread que fiz não utiliza TTimer e sim fica em looping no método execute, comparando o tempo decorrido.
Gostei + 0
12/08/2006
Buffering
c vc puder ficarei grato.
Gostei + 0
12/08/2006
Siam
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | unit uTempo_Thread; interface uses Windows, Classes, Messages; type TTempo_Thread = class(TThread) private Handle_Form :DWord; Tempo :DWord; public constructor Create(aHandle,aTempo:DWord); procedure Execute; override; end; implementation constructor TTempo_Thread.Create(aHandle,aTempo:DWord); begin inherited Create(false); FreeOnTerminate := true; Handle_Form := aHandle; Tempo := aTempo; end; procedure TTempo_Thread.Execute; var Tempo_Ini:DWord; begin while not Terminated do begin Tempo_Ini := GetTickCount; While (GetTickCount >= Tempo_Ini) and ((GetTickCount - Tempo_Ini) < Tempo) do Sleep(1); SendMessage(Handle_Form, WM_User+1, 0, 0); end; end; end. |
Na unit do seu Form adicione no [b:a74293093c]uses[/b:a74293093c]:uTempo_Thread e defina na seção [b:a74293093c]private[/b:a74293093c]:
1 | procedure onTimer(var Msg:TMessage); message WM_User+1; |
Na [b:a74293093c]implementation[/b:a74293093c] defina:
1 2 3 4 | procedure TForm1.onTimer(var Msg:TMessage); begin { Coloque o que vc faria no evento onTimer } end; |
Para instanciar a Thread:
1 2 3 4 | var TH:TTempo_Thread; begin TH := TTempo_Thread.Create(Form1.Handle, 5000); // 5000 = 5 segs end; |
Obs: GetTickCount volta a zero depois de 49.7 dias que a máquina estiver ligada; por isso é sempre bom comparar: (GetTickCount >= Tempo_Ini)
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)