Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Problemas con la creación de TTimer es tiempo de ejecución (https://www.clubdelphi.com/foros/showthread.php?t=55330)

vejerf 14-04-2008 12:41:09

Problemas con la creación de TTimer es tiempo de ejecución
 
Muy buenas a todos.
Estoy desarrollando una aplicación en el que una serie de elementos que vamos dando de alta hacen uso de los componentes TTimer. Mi problema es que a medida que voy dando de alta esos elementos necesito crearme un TTimer propio para ese elemento. Apriori parece que lo hace y le asigna una dirección de memoria al componente TTimer correspondiente y cambio la propiedad TTimer.Interval sin problemas, pero cuando lo habilito TTimer.enable:= true me da una excepción y me dice lo siguiente: 'Not enough timers available'.
Esto sólo ocurre durante esa ejecución. Cuando vuelvo a ejecutar la aplicación y ese elemento que ya había sido dado de alta antes se carga en memoria, ya tiene reservado su timer y no me da problemas.
Después de toda esta historia mi pregunta es: ¿Es que no se pueden crear timer en tiempo de ejecución?
Espero vuestra ayuda. Muchas gracias!!!

vejerf 14-04-2008 14:09:38

Me sigo respondiendo un poco yo mismo y aunque sigo con dudas puede que le ayude a alguien mis conclusiones, aunque no soy un programador experto.

En la ayuda de Delphi viene que se puede crear los timer en tiempo de ejecución así que mi pregunta anterior ya está contestadas... pero ahora la pregunta es en qué estaba fallando antes...
Pues bien sugiero una cosa a ver q responden los expertos.
Al dar de alta un elemento como decía en mi primer mensaje hago lo siguiente:
Código Delphi [-]
with TAgregarUnidadForm.create(nil) do
try
    if ShowModal = mrOk then
    begin
       //Aqui se dan de alta las unidades y sus timers
    end;
  finally
    free;
end;

En el form que he llamado TAgregarUnidadForm hago:
Código Delphi [-]
    Medios[N].Timer := TTimer.Create(self);

Nunca he sabido bien para q sirve el self que inserto en el Create. La verdad es que cuando comencé a programar lo vi en un ejemplo, lo usé y como funcionaba siempre lo hacía igual, pero ahora creo q sé para qué es.
Si no me equivoco asocia el Timer creado con ese formulario y yo al liberarlo con el free pierdo el timer.
¿Algún experto me puede decir si lo q digo tiene sentido y es así?

Creo q me servirá a mí y a muchos otros. Gracias...

grandmasterdari 14-04-2008 14:25:48

Intento de solucion
 
yo soy de c++, pero creo que igual puede ayudar esto.
Hice un TTimer en tiempo de ejecucion de esta forma

en la definicion de la clase de TForm1 en la parte public deberas definir

Código:

    TTimer *Timer1;

y en la implementacion (por ej: en button1click) colocar
Código:

Timer1=new TTimer(this);
Timer1->Interval=1;
Timer1->OnTimer=Timer1Timer;

donde en la primer linea instanciamos lo que definimos arriba y decimos que el padre es el componente que lo contiene
la segunda linea colocamos el intervalo, si colocas en 1 teoricamente tendras un llamado a
"void __fastcall Form1::Timer1Timer(TObject *Sender)"
cada 1 milisegundo, y si colocas 1000 tendras por cada segundo
la tercera linea asignas el evento para este componente, este evento debe tener la forma de TNotifyEvent y sera llamado cada vez que se cumpla el tiempo definido en "Timer1->Interval" (Timer1.Interval en delphi)

Caro 14-04-2008 16:26:14

Hola vejerf, sobre la palabra clave Self, nos sirve para hacer referencia al objeto actual que en tu caso sería tu formulario. Cuando creas un componente en tiempo de ejecución debes asignarle el propietario de dicho componente en su constructor. Así como lo hiciste, donde el propietario de tu Timer sera tu formulario y con Seft haces referencia a dicho formulario

Código Delphi [-]
 Medios[N].Timer := TTimer.Create(self);

Sobre la liberación, cada vez que se crea un objeto es necesario liberar, pero como hemos creado un componente y le hemos asignado un padre, que en tu caso es el formulario, este formulario es el que se encarga de liberar todos sus componentes, por lo que ya no necesitas liberar tu Timer.

Si estoy mal, ya nos corregiran.

Saluditos


La franja horaria es GMT +2. Ahora son las 07:20:47.

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