Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ttimer en un Unit (https://www.clubdelphi.com/foros/showthread.php?t=23405)

douguiehm 15-07-2005 17:39:34

Ttimer en un Unit
 
Que tal.

Estoy haciendo una aplicación que lee el puerto com1 para verificar si hay mensajes nuevos en un modem GSM.

Todo va bien, pero cuando pongo un Timer para que haga esta operación cada X segundos, el programa se alenta terriblemente, con lo cual llegué a la conclusion de que necesito separar el programa en dos partes:
  • Una visual donde se lean los mensajes y se escriban los mensajes nuevos.
  • Una no visual que solo haga el procesamiento de los mismos.
Todo va muy bien, pero en la parte no visual no logro configurar el Timer para que cada X segundos haga el procedimiento que necesito. En pocas palabras, no se como asignarle al Evento OnTimer un procedimiento.

Espero que me puedan ayudar.

Gracias

delphi.com.ar 15-07-2005 17:49:20

El OnTimer es un procedure of object, así que no puedes apuntarlo a un regular procedure. Si tel código que escribiste es una clase, no tendrás problema alguno:
Código Delphi [-]
  TMiClase = class
  private
    FTimer: TTimer;
    procedure OnTimer(Sender: TObject);
  public
    constructor Create;
    destructor Destroy; override;
  end;

implementation

{ TMiClase }

constructor TMiClase.Create;
begin
  FTimer := TTimer.Create(nil);
  FTimer.OnTimer := OnTimer;
  ...
end;

destructor TMiClase.Destroy;
begin
  FTimer.Free;
end;

procedure TMiClase.OnTimer(Sender: TObject);
begin
  { Tu código }
end;

douguiehm 15-07-2005 17:59:34

Problema Resuelto
 
Mil gracias por tu respuesta no rápida sino inmediata.

El problema era exactamente que lo estaba apuntando a un regular procedure.

Puedo seguir.

delphi.com.ar 15-07-2005 18:24:15

No me agrada mucho, pero te escribí esto:
Código Delphi [-]
unit TimerRegularProcedure;

interface

uses
  ExtCtrls;

type
  TRegularProcedure = procedure;

  THackTimer = class
  private
    FTimer: TTimer;
    procedure OnTimer(Sender: TObject);
  public
    FRegularProcedure: TRegularProcedure;
    constructor Create;
    destructor Destroy; override;
  end;


var
  HackTimer: THackTimer;

implementation

uses
  Dialogs;

{ THackTimer }

constructor THackTimer.Create;
begin
  FRegularProcedure := nil;

  FTimer := TTimer.Create(nil);
  FTimer.OnTimer := OnTimer;
  FTimer.Interval := 5000;
  FTimer.Enabled := True;
  {...}
end;

destructor THackTimer.Destroy;
begin
  FTimer.Free;
end;

procedure THackTimer.OnTimer(Sender: TObject);
begin
  if Assigned(FRegularProcedure) then
    FRegularProcedure;
end;

procedure TimerEventos;
begin
  { Tu código}
  ShowMessage('Hola Mundo!');
end;


initialization
  HackTimer := THackTimer.Create;
  HackTimer.FRegularProcedure := TimerEventos;

finalization
  HackTimer.Free;

end.

douguiehm 22-07-2005 18:16:04

Muchas gracias por tus respuestas, pero ahora el programa tiene comportamiento raros:

Como ya comenté este programa lee datos del puerto com1 para verificar mensajes nuevos, el problema es que después de leerlos los decodifica de cierta manera, al final de la decodificación, ingreso esos datos en una base de datos, pero el programa no llega a esta parte, simplemente se la brinca o no se que pasa pero le pongo break points y ni siquiera los toca, se brinca al final del programa y el timer vuelve a empezar.

¿Será que se cumple el tiempo del Timer y este corta el procedimiento que estaba haciendo?

Por favor, ayudenme porque esto es lo último que me falta para poder empezar a hacer pruebas al sistema.


La franja horaria es GMT +2. Ahora son las 03:08:26.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi