SoloCodigo

Programación General => C/C++ => C++ Builder => Mensaje iniciado por: Ithilien en Martes 10 de Julio de 2007, 19:38

Título: Cambiar Funcionalidad Ontimer Dinámicamente
Publicado por: Ithilien en Martes 10 de Julio de 2007, 19:38
Hola, llevo atascado un par de días con el siguiente problema:

Tengo que implementar, para un conjunto de TTimers que creo dinámicamente, una función OnTimer diferente. El caso es que he probado a crear una función e intentar asignársela, pero no acepta parámetros y al hacer
Código: Text
  1. Timer[i]->OnTimer = (TNotiryEvent) &NuevoOnTimer(cadena);
  2.  
, con "cadena" como char *, da error de tipos. El error que da concretamente es el siguiente:
Código: Text
  1. [C++ Error] Supervisor.cpp(65): E2109 Not an allowed type
  2.  
Por lo tanto, no sé como hacerlo. Si alguien lo sabe, lo agradecería muchísimo.
Título: Re: Cambiar Funcionalidad Ontimer Dinámicamente
Publicado por: Enko en Martes 10 de Julio de 2007, 21:30
Esto te deberia servir.
http://www.angelzeitoune.com.ar/cpp/eventos.html (http://www.angelzeitoune.com.ar/cpp/eventos.html)

Por sierto, tienes una falta de letra, Es TNotifyEvent, no TNotiryEvent  (en el casing).
Título: Re: Cambiar Funcionalidad Ontimer Dinámicamente
Publicado por: Ithilien en Martes 10 de Julio de 2007, 21:34
perfect! me sirve!!!! Muchísimas gracias. Tu también tienes una falta  :lol: : es casting, no casing  :whistling:
Título: Re: Cambiar Funcionalidad Ontimer Dinámicamente
Publicado por: Ithilien en Miércoles 11 de Julio de 2007, 20:21
Hola de nuevo Enko. He estado mirando eso bien, y trabajando me di cuenta de que realmente no sirve esto, no? Lo digo porque estamos definiendo eventos para una clase ( en el ejemplo ) potencia, que construimos nosotros. Lo que ocurre es que yo uso los TTimers que ya estan definidos, y que, tienen su evento OnTimer que es del tipo TNotifyEvent, que solo acepta un parámetro que es el Sender. Y necesito pasarle otro parámetro, entiendes?

¿Se puede solucionar el problema? gracias!
Título: Re: Cambiar Funcionalidad Ontimer Dinámicamente
Publicado por: Enko en Miércoles 11 de Julio de 2007, 21:27
Lo que ocurre es que no vas a poder pasarle otro parametro que no sea el Sender. Es así como funciona la VCL.
Lo que podes hacer es usar una variable global, o bien, una variable miembro de TForm1.

Citar
casting, no casing
Si, tenia esa duda, no me acordaba bien el nombre y dudé entre las dos. Me decidí por la que estaba mal.
Título: Re: Cambiar Funcionalidad Ontimer Dinámicamente
Publicado por: Ithilien en Miércoles 11 de Julio de 2007, 21:32
Se me ocurre como solucion hacerle que la propiedad Name de cada TTimer sea un indice, y luego, en el propio método, que se acceda al vector global, haciendole el casting de AnsiString a int y ala...pero qué limitación más grande!!!!!

En cualquier caso, habría que investigar, pero la propiedad insertComponent no podría funcionar? No sé, esque intuitivamente me parecio que se podían agregar cosas a la clase...

Saludos y gracias!
Título: Re: Cambiar Funcionalidad Ontimer Dinámicamente
Publicado por: Ithilien en Jueves 12 de Julio de 2007, 19:59
Sigo atascado...alguna solución??
Título: Re: Cambiar Funcionalidad Ontimer Dinámicamente
Publicado por: Enko en Jueves 12 de Julio de 2007, 21:38
No conozco C++, pero te puedo pasar el codigo como sería con Delphi.
No es mas complicado que esto:
Código: Text
  1.  
  2.   TForm1 =  class(TForm)
  3.    public
  4.        Timer1 : TTimer;
  5.        MyVar: Integer;
  6.        procedure MyTimer(Sender: TObject);
  7.    end;
  8.    .............
  9. procedure MyTimer(Sender: TObject);
  10. begin
  11.    if Sender is TTimer then //esta condicion por lo general no hace falta.
  12.    begin
  13.         //aca va lo que necesites.
  14.         MyVar := X + Y + Z;
  15.    end;
  16. end;
  17.    .............
  18.    Timer1.OnTime := MyTimer;
  19.  
  20.