Fórum TTimer - Colocando evento ontimer ?? #327209

10/08/2006

0

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

Responder

Posts

10/08/2006

Siam

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


Responder

Gostei + 0

11/08/2006

Rodc

Ué!! Mas não é só criar uma procedure com as mesmas variáveis e atribuir ao OnTimer a procedure?
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;



Responder

Gostei + 0

11/08/2006

Siam

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.


Responder

Gostei + 0

11/08/2006

Rodc

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.


Responder

Gostei + 0

11/08/2006

Siam

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.


Responder

Gostei + 0

11/08/2006

Rodc

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

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


Responder

Gostei + 0

11/08/2006

Siam

Incompatible types: ´method pointer and regular procedure´


Responder

Gostei + 0

11/08/2006

Buffering

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


Responder

Gostei + 0

11/08/2006

Rodc

Incompatible types: ´method pointer and regular procedure´

Mas este erro acontece mesmo se você fizer o exemplo abaixo?
1
Button1.Click := Button1OnClick;

E o help do Delphi, que diz deste erro?


Responder

Gostei + 0

11/08/2006

Siam

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.


Responder

Gostei + 0

11/08/2006

Rodc

[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:


Responder

Gostei + 0

11/08/2006

Siam

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.


Responder

Gostei + 0

12/08/2006

Buffering

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.


Responder

Gostei + 0

12/08/2006

Siam

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


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar