![]() |
Un componente dentro de otro.
Tengo un componente que tiene la opción de poner color en un botón. Funciona.
Ahora quiero que cuando una propiedad que le he agregado sea true, ese componente cambie de color, dos colores alternativos, es decir que haga el efecto de parpadear. Con una función sencillita, en un Form aparte, hago ese parpadeo, con un TTimer, pero ¿como hago para que ese timer me funcione dentro del componente del botón?. He probado create de dos formas, siempre copiando, y no doy con ello. No doy para más. Si hay algún componente que haga el parpadeo también me sirve. Un saludo. Antonio. |
Crealo por código, cuando lo necesites....
Código:
FTimer := TTimer.Create(Self); Saludos! |
Gracias por la respuesta delphi.com.ar, ya te debo varias.
Estoy haciendo pruebas, pero no me sale. Pongo este codigo: procedure TForm1.SpeedButton1Click(Sender: TObject); var FTimer : TTimer; begin FTimer := TTimer.Create(Self); FTimer.Enabled := True; FTimer.Interval := 400; FTimer.OnTimer(Sender: TObject); begin {Lo que deseo se haga y no se haga, cambio de color} Pero me dice que espera un paréntesis y se encuentra con dos puntos. Me pide un TNotifyEvent como parámetro, pero como lo pongo. Así que desde 'Interval' no se como seguir. end; end; Perdonar si es una bobada, pero a los torpes les pasa esto. Un saludo. Tonio. |
Mira este ejemplo a ver si con esto te sirve:
Código:
unit Unit1; |
Genial. Gracias.
Lo he probado fuera del componente, espero que dentro de él funcione igual, estupendamente. Un saludo. |
Aquí estoy otra vez.
¿El interval de un TTime, autocreado, es 1000 por defecto? He probado tu código dentro del componente, funciona, pero poniendo allí los parámetros o propiedades que necesita, pero como hago para, desde mi aplicación, decirle que enabled es 'True', que el Interval es '500', y cuando sea necesario, decirle que Enabled es 'False'. Pregunto lo de 1000, porque, sin darle ningún dato sobre el Interval, me dice que Interval es 1000. ¿Cuando 'lee' el componente las propiedades?, porque he probado darle los 'datos' con ellas y no los recibe. En el procedure de las propiedades del componente si lo recibe, pero fuera de él dice que es desconocido. Pido disculpas, pero no se más. Un saludo. Tonio. |
La valor de esa propiedad el 1000 porque el valor por defecto ha sido definido de esta manera. Si tu desde tu componente le asignas otro valor, el TTimer lo tomará sin problemas.
Esta es una forma de definir un valor por defecto: Código:
type Cita:
Saludos! |
Este es parte del código del componente.
Marcoszorrilla verá la similitud con su ejemplo. Gracias. type TBtnBlink = class(TButton) Procedure MiEvento(Sender:TObject); private FTimer : TTimer; FIntervalo : Integer; ........................... procedure SetIntervalo(Value: integer); .................... published property Intervalo: integer read FIntervalo write SetIntervalo default 0; ................ implementation ............. procedure TBtnBlink.SetIntervalo(Value: integer); begin if FIntervalo <> Value then begin FIntervalo:= Value; Invalidate; end; Aquí es donde cuadra el texto: 'En el procedure de las propiedades del componente si lo recibe, ' Si pongo ShowMessage(IntToStr(FIntervalo)); Me muestra el de la propiedad. end; ...... FTimer := TTimer.Create(Self); FTimer.OnTimer:=MiEvento; ........ Procedure TBtnBlink.MiEvento(Sender:TObject); begin Aquí es donde lo necesito pero 'pero fuera de él dice que es desconocido' Si pongo ShowMessage(IntToStr(FIntervalo)); Me dice desconocido if FParpadeo then begin ColorBoton := clRed; end else begin ColorBoton := clYellow; end; fParpadeo := not FParpadeo; end; Así que lo que yo quiero saber es: Yo pongo este botón en mi aplicación y cuando quiera que parpadee, porque ha recibido el foco o quiero resaltarlo: ¿Como ejecuto desde mi aplicación el procedure MiEvento, pasándole tanto Intervalo como Parpadeo, es decir a que velocidad y si lo debe hacer o no. Perdonad, puede parecer sencillo, para mi no lo es, pero la idea es aprender. Un saludo. Tonio |
A simple vista, parece que no usas para nada el valor que de FIntervalo. Te falta asignárselo a la propiedad del TTimer.
Si creas el TTimer en el create de tu componente, entonces puedes asignarlo en el SetIntervalo, si el timer lo creas solo cuando lo necesitas, inmediatamente creado este, asígnale FIntervalo. Código:
FTimer := TTimer.Create(Self); |
Gracias a los dos.
Efectivamente esa era una de las cosas que me fallaba y otra que al poner showmessage('') dentro del componente, me daba unas respuestas extrañas cuando se mostraba, lo cerraba el Timer funcionaba, pero como se volvia a mostrar..., ya os podéis imaginar. Luego la propiedad parpadeo, la tenía True en un sitio, False en otro, vamos un desastre. Así que ya me funciona, gracias a vosotros. Hasta la proxima. Tonio. |
La franja horaria es GMT +2. Ahora son las 00:24:34. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi