TTimer - Colocando evento ontimer ??
Olá Programadores, aqui estou denovo com problemas,
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
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
Curtidas 0
Respostas
Siam
10/08/2006
Também já passei por isso e a solução que achei foi criar um Thread.
GOSTEI 0
Rodc
10/08/2006
Ué!! Mas não é só criar uma procedure com as mesmas variáveis e atribuir ao OnTimer a procedure?
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
Siam
10/08/2006
Acho que dará erro de compilação pq o evento onTimer é um TNotifyEvent que é um método de um objeto e a atribuição em .onTimer está para um método simples.
GOSTEI 0
Rodc
10/08/2006
Bom na aplicação normal funciona sem problema algum, agora, na DLL talvêz dê problema. Outra coisa, na criação do timer tente declarar o Owner como ´self´ e não como nil.
GOSTEI 0
Siam
10/08/2006
Bom na aplicação normal funciona sem problema algum ...
Como assim funciona ?Em qual versão do Delphi ?
No Delphi 6 dá erro de compilação pq a atribuição está errada.
GOSTEI 0
Rodc
10/08/2006
Na verdade eu estou testando em C++ Builder, pois não tenho Delphi aqui, mas a idéia é a mesma. É a mesma coisa que você fazer o código abaixo:
Qual é a mensagem de erro que o Delphi está lhe retornando?
Button1.Click := Button1OnClick;
Qual é a mensagem de erro que o Delphi está lhe retornando?
GOSTEI 0
Siam
10/08/2006
Incompatible types: ´method pointer and regular procedure´
GOSTEI 0
Buffering
10/08/2006
Isso Mesmo rodc ao compilar no Delphi 2005 aparece
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
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
Rodc
10/08/2006
Incompatible types: ´method pointer and regular procedure´
Mas este erro acontece mesmo se você fizer o exemplo abaixo?
Button1.Click := Button1OnClick;
E o help do Delphi, que diz deste erro?
GOSTEI 0
Siam
10/08/2006
Mas este erro acontece mesmo se você fizer o exemplo abaixo?
Código:
Button1.Click := Button1OnClick;
E o help do Delphi, que diz deste erro?
Depende, se Button1OnClick for um TNotifyEvent, aí funciona.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.
siam vc disse q já passou c vc puder escrever a solução por Thread
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
Rodc
10/08/2006
[b:95fdbc8717]of object[/b:95fdbc8717] quer dizer que o método tem de estar dentro de uma classe.
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
Siam
10/08/2006
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.
Vc pode definir na dll uma classe que descenda de TTimer e escrever seu evento onTimer, só que comigo não funcionou, ou seja, ele nunca executa o onTimer.A Thread que fiz não utiliza TTimer e sim fica em looping no método execute, comparando o tempo decorrido.
GOSTEI 0
Buffering
10/08/2006
Teria como Você escrever o fonte da thread pra fazer essa função pois sou iniciante e naum consegui fazer com uns exemplos q achei na net
c vc puder ficarei grato.
c vc puder ficarei grato.
GOSTEI 0
Siam
10/08/2006
Defina sua Thread numa unit separada:
Na unit do seu Form adicione no [b:a74293093c]uses[/b:a74293093c]:uTempo_Thread e defina na seção [b:a74293093c]private[/b:a74293093c]:
Na [b:a74293093c]implementation[/b:a74293093c] defina:
Para instanciar a Thread:
Obs: GetTickCount volta a zero depois de 49.7 dias que a máquina estiver ligada; por isso é sempre bom comparar: (GetTickCount >= Tempo_Ini)
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]:
procedure onTimer(var Msg:TMessage); message WM_User+1;
Na [b:a74293093c]implementation[/b:a74293093c] defina:
procedure TForm1.onTimer(var Msg:TMessage);
begin
{ Coloque o que vc faria no evento onTimer }
end;
Para instanciar a Thread:
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