TTimer - Colocando evento ontimer ??

Delphi

10/08/2006

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


Buffering

Buffering

Curtidas 0

Respostas

Siam

Siam

10/08/2006

Também já passei por isso e a solução que achei foi criar um Thread.


GOSTEI 0
Rodc

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

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

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

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

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:
Button1.Click := Button1OnClick;

Qual é a mensagem de erro que o Delphi está lhe retornando?


GOSTEI 0
Siam

Siam

10/08/2006

Incompatible types: ´method pointer and regular procedure´


GOSTEI 0
Buffering

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


GOSTEI 0
Rodc

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

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

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

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

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.


GOSTEI 0
Siam

Siam

10/08/2006

Defina sua Thread numa unit separada:
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
POSTAR