Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Duda con un array de Timers (https://www.clubdelphi.com/foros/showthread.php?t=60823)

vejerf 15-10-2008 11:55:12

Duda con un array de Timers
 
Buenas a todos,

Tengo la siguiente pregunta: ¿es posible averiguar en un array de Timers qué elemento del array me ha generado el evento, es decir, si es el Timer que ocupa la posición 1 o el de la posición 2...?

Esto lo necesito sin usar el Tag del Timer ya que lo usaría para otra cosa.

Gracias...

Neftali [Germán.Estévez] 15-10-2008 12:21:07

Si todos llaman al mismo evento, basta con utilizar el parámetro Sender para saber qué Timer está haciendo la llamada.
PREGUNTA ¿Seguro que necesitas un array de Timers?

No te bastaría con un único Timer y diferentes Intervalos de tiempo para hacer diferentes cosas?

vejerf 15-10-2008 12:23:31

Gracias por tu respuesta Neftali, pero yo lo que necesito es saber la posición que ocupa en el array.

Necesito diferentes Timer y como mucho uno por cada elemento q tenga. Necesito actualizar una serie de elementos en función de un tiempo que me controlará estos Timer. No los tendré creado de inicio, sino que los crearé y liberaré conforme se vayan usando.

Neftali [Germán.Estévez] 15-10-2008 13:26:45

Para la posición del array sólo se me ocurre que busques por TAG, porque la búsqueda secuencia, siempre será peor.

duilioisola 15-10-2008 13:55:29

Se me ocurre que al momento de crearlos le des un nombre significativo, por ejemplo Timer+PosiciónenArray.

Código Delphi [-]
   ...
   ArrayTimer[Posicion] := TTimer.Create()
   TTimer(ArrayTimer[Posicion]).Name := 'Timer'+IntToStr(Posicion);
   ...


Luego en el evento OnTimer:

Código Delphi [-]
begin
   {Name = TimerNNN - PosicionEnArray = NNN}
   posicionEnArray := StrToInt(copy(TTimer(Sender).Name,6,length(TTimer(Sender).Name-5)));
   ...
end;

Caro 15-10-2008 14:12:57

Hoal vejerf, yo también utilizaría la propiedad Tag, le asignas la misma posición en la que estas creando tu timer y en su evento OnTimer preguntar por su Tag que sería la posición.

Código Delphi [-]
   ArrayTimer[Posicion] := TTimer.Create(Self);
   ArrayTimer[Posicion].Tag := Posicion;
   .........
   ArrayTimer[Posicion].OnTimer := TimerE1;
 
procedure TForm1.TimerE1(Sender: TObject);
begin
 showmessage(IntToStr(TTimer(Sender).Tag));
end;

Saluditos

vejerf 15-10-2008 14:18:33

Muchas gracias por vuestras sugerencias...

Me ha gustado tu solución duilioisola aunque debo probarla.

Caro, el problema es que yo ya uso la propiedad tag para otra cosa.

La cosa es que tengo un array de elementos que debo actualizar según el tiempo que tengan definidos. Entonces, lo que se me ocurrió es crearme un array de Timer y colocarlos en la misma posición que su elemento correspondiente, de forma que encontrando la posición del timer que genera el evento tengo el elemento asociado. El tag lo uso para hacer referencia a otro elemento.

Otra solución a mis problemas sería crearme un componente nuevo descendiente de TTimer y con las propiedades que yo necesito, pero es q no sé bien como hacerlo. Lo mismo investigo por ahí...

Muchas gracias de nuevo!!!

roman 15-10-2008 16:02:07

Yo usaría la opción de Caro, es la más prolija. Ahora, el que uses el Tag para otra cosa no es realmente un impedimento, basta añadirle un poco de imaginación al asunto :). La propiedad Tag es un entero y, como tal, puede hacer las veces de apuntador, de manera que puedes definirte una estructura de datos con toda la información que requieras asociar al timer:

Código Delphi [-]
type
  PTimerInfo = ^TTimerInfo;
  TTimerInfo = record
    Indice: Integer;
    {
      aquí un campo por cada dato o referencia
      extra que requieras guardar
    }
  end;

Para asociar una de estas estructuras al timer:

Código Delphi [-]
var
  P: PTimerInfo;

begin
  New(P);
  P.Indice := 84;
  Timer84.Tag := Integer(P);
end;

Para usar la información contenida en el tag:

Código Delphi [-]
var
  P: PTimerInfo;

begin
  P := PTimerInfo(Timer84.Tag);
  ShowMessage(IntToStr(P.Indice));
end;

Y para liberar la memoria:

Código Delphi [-]
Dispose(PTimerInfo(Timer84.Tag));

Si te fijas, de hecho, en TTimerInfo puedes incluso guardar directamente la referencia al elemento que quieres actualizar, sin necesidad del índice.

// Saludos


La franja horaria es GMT +2. Ahora son las 18:51:09.

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