Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Un componente dentro de otro. (https://www.clubdelphi.com/foros/showthread.php?t=5091)

Tonio 08-11-2003 00:39:34

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.

delphi.com.ar 08-11-2003 01:07:36

Crealo por código, cuando lo necesites....
Código:

FTimer := TTimer.Create(Self);
O puedes crear un timer directamente con la WinApi..

Saludos!

Tonio 09-11-2003 18:50:08

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.

marcoszorrilla 09-11-2003 19:53:15

Mira este ejemplo a ver si con esto te sirve:

Código:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
 
    Procedure MiEvento(Sender:TObject);
  private
    { Private declarations }
  public
    { Public declarations }

  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
FTimer : TTimer;
begin
FTimer := TTimer.Create(Self);
FTimer.Enabled := True;
FTimer.Interval := 5000;
FTimer.OnTimer:=MiEvento;
end;

Procedure TForm1.MiEvento(Sender:TObject);
begin
ShowMessage('Ya está Tonio');
end;


end.

Un Saludo.

Tonio 09-11-2003 20:12:49

Genial. Gracias.
Lo he probado fuera del componente, espero que dentro de él funcione igual, estupendamente.
Un saludo.

Tonio 10-11-2003 16:53:01

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.

delphi.com.ar 10-11-2003 17:06:53

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
  TEjemplo = class(TComponent)
  private
    FMiPropiedad: Integer;
  public
    constructor Create(AOwner: TComponent); override;
  published
    property MiPropiedad: Integer read FMiPropiedad write FMiPropiedad default 1000;
    {El default sirve para que cuando el valor de la propiedad sea 1000,
    no se guarde en el DFM }
  end;

implementation

constructor TEjemplo.Create(AOwner: TComponent);
begin
  inherited;
  FMiPropiedad := 1000;
end;

Cita:

Tonio comentó:
En el procedure de las propiedades del componente si lo recibe, pero fuera de él dice que es desconocido.
¿Qué quieres decir con esto?... disculpa pero no te entiendo.

Saludos!

Tonio 10-11-2003 17:42:24

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

delphi.com.ar 10-11-2003 18:50:17

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);
..
FTimer.OnTimer := MiEvento;
FTimer.Interval := FIntervalo;

Saludos!

Tonio 11-11-2003 23:44:12

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:39: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