FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Componente TLabel
Hola a todos y gracias de antemano por vuestra ayuda.
Estoy tratando de incursionar en este asunto de los componentes y no logro entender el concepto. Lo que tengo: Consegui un componente label que parpadea, esta simpatico, es este: Código:
unit Blinklbl; interface uses Classes, StdCtrls, ExtCtrls; { TTimer se declara en ExtCtrls } type TBlinkLabel = class(TLabel) {TBlinkLabel deriva de TLabel} private FVelocidad : integer; {Frecuencia de parpadeo} FTimer : TTimer; {Timer para la frecuencia} procedure SetVelocidad(valor : integer); {Almacena la velocidad} protected procedure parpadea(Sender : TObject); public constructor Create(AOwner : TComponent); override; {Constructor} destructor Destroy; override; {Destructor} published property Velocidad : integer read FVelocidad write SetVelocidad default 400; end; procedure Register; implementation constructor TBlinkLabel.Create(AOwner : TComponent); begin inherited Create(AOwner); {Llama al constructor original (heredado)} FTimer := TTimer.Create(Self); {Creamos el timer} FVelocidad := 400; {Frecuencia (velocidad) por defecto} FTimer.Enabled:=True; {Activamos el timer} FTimer.OnTimer:=parpadea; {Asiganamos el método parpadea} FTimer.Interval:=FVelocidad; {Asignamos el intervalo del timer = frecuencia parpadeo} end; destructor TBlinkLabel.Destroy; begin FTimer.Free; {Liberamos el timer} inherited destroy; {Llamamos al destructor original (heredado)} end; procedure TBlinkLabel.SetVelocidad (valor : integer); begin If FVelocidad <> valor then {Sólo si el valor introducido es distinto del almacenado} begin if valor < 0 then FVelocidad:=0; FVelocidad:=Valor; {Asigna la velocidad} if FVelocidad=0 then FTimer.Enabled:=False else FTimer.Enabled:=True; {Si Fvelocidad=0 el mensaje debe estar siempre visible} FTimer.Interval:=FVelocidad; Visible:=True; end; end; procedure TBlinkLabel.parpadea(Sender : TObject); begin if FTimer.Enabled then Visible := not(Visible); {Alternativamente muestra y oculta el mensaje si el timer esta activado} end; procedure Register; {Registro del componente} begin RegisterComponents('Curso', [TBlinkLabel]); end; end. Código:
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, Buttons; type TForm1 = class(TForm) Timer1: TTimer; btnStartStop: TButton; BitBtn1: TBitBtn; lblMarquee: TLabel; edText: TEdit; Label2: TLabel; UpDown1: TUpDown; edSpeed: TEdit; Label1: TLabel; rgDirection: TRadioGroup; procedure BitBtn1Click(Sender: TObject); procedure edTextChange(Sender: TObject); procedure btnStartStopClick(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure UpDown1Changing(Sender: TObject; var AllowChange: Boolean); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.BitBtn1Click(Sender: TObject); begin Close; end; procedure TForm1.edTextChange(Sender: TObject); begin lblMarquee.Caption := edText.Text; end; procedure TForm1.btnStartStopClick(Sender: TObject); begin Timer1.Enabled := not Timer1.Enabled; end; procedure TForm1.Timer1Timer(Sender: TObject); var txt : string; begin txt:= lblMarquee.Caption; if rgDirection.ItemIndex = 0 then //left lblMarquee.Caption:= Copy(txt, 2, length(txt)-1) Copy(txt,1,1) else //right lblMarquee.Caption:= Copy(txt,length(txt)-1,1) Copy(txt, 1, length(txt)-1); end; procedure TForm1.UpDown1Changing(Sender: TObject; var AllowChange: Boolean); begin Timer1.Interval := 1000 div UpDown1.Position; end; procedure TForm1.FormCreate(Sender: TObject); begin edTextChange(Self); end; end. Quiero hacer un componente Label, que se coloque en un form y que colocando un edit en el mismo, pase la informacion de este de lado a lado, como lo hace el programa. Gracias por vuestro tiempo y ayuda. Saludos |
#2
|
||||
|
||||
Hola
Bueno, por aqui sigo pensando. Creo que la cosa podria andar por aqui: Código:
var txt : string; begin txt:= lblMarquee.Caption; if rgDirection.ItemIndex = 0 then //left lblMarquee.Caption:= Copy(txt, 2, length(txt)-1) Copy(txt,1,1) Bueno supongo que por aqui va el asunto, me ayudais. Saludos |
#3
|
||||
|
||||
Con gusto te ayudo, pero si me lo simplificas un poco en la explicacion me perdi y no logro entender que quieres hacer, hasta lo que lei :
Tienes un Label y un Edit, que hace el label que hace el edit????
__________________
...Yo naci en esta ribera del arauca vibr@d0r Soy hermano de la espuma, de la garza, de la rosa y del sol... Viva Venezuela |
#4
|
||||
|
||||
Hola amigo
Muy simple: Quiero hacer un componente TLabel. El componente tiene que hacer lo que hace en el programa (segundo codigo) que postee, osea moverse de un lado a otro. Este componente tiene que recibir el caption de un edit normal que coloque en el form, independiente del componente que quiero hacer. El componente que postee (primer codigo) lo que hace es parpadear, lo que quiero que haga es moverse, por eso puse el codigo del programa para que lo relacionarais. Vamos hombre que esta claro, ya se, es domingo. Saludos |
#5
|
||||
|
||||
Precisamente alli esta mi duda, es que es domingo y aqui en mi casa sostienen un interesante partido de domino por eso me cuesta concentrarme, segun leo el codigo que muestras toma desde un edit lo que necesita, por eso te digo si ya esta listo no entiendo que mas necesitas, o es que el codigo no funciona???
si no me equivoco el lbmarquee se actualiza desde edtext en el evento onchange
__________________
...Yo naci en esta ribera del arauca vibr@d0r Soy hermano de la espuma, de la garza, de la rosa y del sol... Viva Venezuela |
#6
|
||||
|
||||
Hola
Ya analizaste el segundo codigo, es realmente simple, solo que este no es un componente, es un programa, ya se que lo puedo convertir en un componente, pero me traeria el edit ademas de otros. Los dos codigos funcionan perfectamente, Lo que quiero es hacer una mezcla de ambos, pero que solo quede el label, no el edit (como el primer codigo), el edit lo pondra a mi antojo en algun form, no importa cual. La idea es que al poner el nuevo componente en un form pueda hacer que este se mueva y que el caption sea capturado de otro componente, edit, dbeit u otro. Gracias por tu ayuda, quien va ganando?. Saludos |
#7
|
||||
|
||||
Ok ahora si entendi perdona mi lentitud, pues a mi modo de ver las cosas hay que crear un propiedad donde se relacion el edit que quieres y en el timer actualizar el caption, algo asi
Cita:
Cita:
__________________
...Yo naci en esta ribera del arauca vibr@d0r Soy hermano de la espuma, de la garza, de la rosa y del sol... Viva Venezuela |
#8
|
||||
|
||||
Hola
Ahora el lento soy yo. La Propuesta del Property, la capto, esto iría en el componente asi: Código:
published property Velocidad : integer read FVelocidad write SetVelocidad default 400; property MyEdit: TEdit read fTexto write fTexto; end; Saludos |
#9
|
||||
|
||||
Ok la solucion esta en el codigo anterior, y lo unico que tienes es decirle al label en su propiedad nueva cual es el edit desde el que se actualizara, si te fijas en el codigo ontimer que te pase ahi una linea en negrita a mi entender esa solucionaria tu problema aunado a la configuracion de esta propiedad que hablamos
__________________
...Yo naci en esta ribera del arauca vibr@d0r Soy hermano de la espuma, de la garza, de la rosa y del sol... Viva Venezuela |
#10
|
||||
|
||||
Vamos a ver que te parece esto:
Código:
unit Blinklbl; interface uses Classes, StdCtrls, ExtCtrls; type TAnimLabel = class(TLabel) private FVelocidad: integer; FTimer: TTimer; procedure SetVelocidad(Valor: Integer); protected procedure Animar(Sender: TObject); virtual; abstract; public constructor Create(AOwner : TComponent); override; destructor Destroy; override; published property Velocidad: Integer read FVelocidad write SetVelocidad; end; TBlinkLabel = class(TAnimLabel) protected procedure Animar(Sender: TObject); override; end; TMarqueeLabel = class(TAnimLabel) private FInvertir: Boolean; protected procedure Animar(Sender: TObject); override; published property Invertir: Boolean read FInvertir write FInvertir; end; procedure Register; implementation { TAnimLabel } constructor TAnimLabel.Create(AOwner : TComponent); begin inherited Create(AOwner); FTimer := TTimer.Create(Self); FTimer.OnTimer:= Animar; FVelocidad:= 400; FTimer.Interval:= FVelocidad; FTimer.Enabled:= True; end; destructor TAnimLabel.Destroy; begin FTimer.Free; inherited destroy; end; procedure TAnimLabel.SetVelocidad(Valor: Integer); begin If FVelocidad <> Valor then begin if Valor <= 0 then begin FVelocidad:= 0; FTimer.Enabled:= FALSE; end else begin FVelocidad:= 0; FTimer.Enabled:= FALSE; end; FTimer.Interval:= FVelocidad; end; end; { TBlinkLabel } procedure TBlinkLabel.Animar(Sender: TObject); begin Visible:= not(Visible); end; { TMarqueeLabel } procedure TMarqueeLabel.Animar(Sender: TObject); begin if FInvertir then Caption:= Copy(Caption,Length(Caption),1) + Copy(Caption,1,Length(Caption)-1) else Caption:= Copy(Caption,2,MAXINT) + Copy(Caption,1,1); end; procedure Register; begin RegisterComponents('Curso', [TBlinkLabel]); RegisterComponents('Curso', [TMarqueeLabel]); end; end. |
#11
|
||||
|
||||
Hola
La verdad no lo agarro, para mi sigue siendo un codigo en el form, no en el componente, el componente deberia de hacer que se mueva la informacion del caption por medio de su timer (cerado dentro del componente), no el codigo del form. No lo capto, perdon. Saludos |
#12
|
||||
|
||||
Mas claro imposible seoane el aunto es como tomar automaticamente el texto en otro edit de un formulario y se actualize en el caption.
pero ya tenemos tu componente de base, solo hay que agregarle las modificaciones, y caral si te fijas el timer esta dentro del componente, revisa el create...
__________________
...Yo naci en esta ribera del arauca vibr@d0r Soy hermano de la espuma, de la garza, de la rosa y del sol... Viva Venezuela |
#13
|
||||
|
||||
Hola Seoane.
Impresionante Me queda una duda, estas creando dos componentes o uno solo? De todos modos lo voy a probar. Increible, maestro, a esto me referia, a que el componente hiciera su propia rutina. Saludos |
#14
|
||||
|
||||
Hola
Cita:
Saludos |
#15
|
||||
|
||||
Si no hay otra solucion podriamos tomar la que coloque al principio, me sigue pareciendo razonable
Aunque ahora que lo pienso podriamos hacer esto Cita:
Noi es lo ideal pero deberia funcionar
__________________
...Yo naci en esta ribera del arauca vibr@d0r Soy hermano de la espuma, de la garza, de la rosa y del sol... Viva Venezuela Última edición por eduarcol fecha: 05-08-2007 a las 20:19:48. |
#16
|
||||
|
||||
Bueno, no entiendo por que intentar relacionar el TEdit con el label dentro del propio código del label, lo mas lógico seria usar el caption y el método OnChange del TEdit.
Pero el cliente siempre tiene razón Código:
unit Blinklbl; interface uses Classes, StdCtrls, ExtCtrls; type TAnimLabel = class(TLabel) private FVelocidad: integer; FTimer: TTimer; procedure SetVelocidad(Valor: Integer); protected procedure Animar(Sender: TObject); virtual; abstract; public constructor Create(AOwner : TComponent); override; destructor Destroy; override; published property Velocidad: Integer read FVelocidad write SetVelocidad; end; TBlinkLabel = class(TAnimLabel) protected procedure Animar(Sender: TObject); override; end; TMarqueeLabel = class(TAnimLabel) private FEdit: TEdit; FIndice: Integer; protected procedure Animar(Sender: TObject); override; published property Edit: TEdit read FEdit write FEdit default nil; end; procedure Register; implementation { TAnimLabel } constructor TAnimLabel.Create(AOwner : TComponent); begin inherited Create(AOwner); FTimer := TTimer.Create(Self); FTimer.OnTimer:= Animar; FVelocidad:= 100; FTimer.Interval:= FVelocidad; FTimer.Enabled:= True; end; destructor TAnimLabel.Destroy; begin FTimer.Free; inherited destroy; end; procedure TAnimLabel.SetVelocidad(Valor: Integer); begin If FVelocidad <> Valor then begin if Valor <= 0 then begin FVelocidad:= 0; FTimer.Enabled:= FALSE; end else begin FVelocidad:= 0; FTimer.Enabled:= FALSE; end; FTimer.Interval:= FVelocidad; end; end; { TBlinkLabel } procedure TBlinkLabel.Animar(Sender: TObject); begin Visible:= not(Visible); end; { TMarqueeLabel } procedure TMarqueeLabel.Animar(Sender: TObject); var Str: String; begin if Assigned(FEdit) then Str:= FEdit.Text else Str:= ''; if Length(Str) > 0 then begin FIndice:= ((FIndice + 1) mod Length(Str)) + 1; Caption:= Copy(Str,FIndice,MAXINT) + Copy(Str,1,FIndice - 1); end else Caption:= ''; end; procedure Register; begin RegisterComponents('Curso', [TBlinkLabel]); RegisterComponents('Curso', [TMarqueeLabel]); end; end. ¿Que te parece ahora? Última edición por seoane fecha: 05-08-2007 a las 20:48:04. |
#17
|
||||
|
||||
Magnifico amigo, a eso me referia tal como lo habia pensado
__________________
...Yo naci en esta ribera del arauca vibr@d0r Soy hermano de la espuma, de la garza, de la rosa y del sol... Viva Venezuela |
#18
|
||||
|
||||
Hola
No se por que no lo puedo compilar, me da este error: Cita:
Explico lo que hice, lo mas facil, crear un unit y tratar de instalarlo. Que hago mal, aparte de no saber. Saludos |
#19
|
||||
|
||||
abre una unidad nueva, copia el codigo excepto la primera linea (unit)
grabalo, y deberia funcionar
__________________
...Yo naci en esta ribera del arauca vibr@d0r Soy hermano de la espuma, de la garza, de la rosa y del sol... Viva Venezuela |
#20
|
||||
|
||||
Hola a todos, llevo unos minutos declarando ese componente. Lo tengo igual a seoane, el problema, que no se como resolver, es que cuando uno cambia el contenido del edit, deja de funcionar el efecto de animación.
La diferencia con respecto a lo que tiene seoane es esta: Código:
unit Blinklbl2; interface uses Blinklbl, StdCtrls, Classes; type TMarqueeLabelEdit = class(TMarqueeLabel) private FMyEdit: TEdit; FInvertir: boolean; procedure SetMyEdit(Value: TEdit); protected procedure Animar(Sender: TObject); override; published property MyEdit: TEdit read FmyEdit write SetMyEdit; property Invertir: boolean read FInvertir write FInvertir; end; procedure Register; implementation procedure TMarqueeLabelEdit.Animar(Sender: TObject); begin if Assigned(MyEdit) then if FInvertir then Caption:= Copy(Caption,Length(MyEdit.Text),1) + Copy(Caption,1,Length(MyEdit.Text)-1) else Caption:= Copy(MyEdit.Text,2,MAXINT) + Copy(MyEdit.Text,1,1); end; procedure TMarqueeLabelEdit.SetMyEdit(Value: TEdit); begin FMyEdit := Value; if Value <> nil then Value.FreeNotification(self); end; procedure Register; begin RegisterComponents('Curso', [TMarqueeLabelEdit]); end; end. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
tlabel enabled | anubis | Varios | 12 | 10-05-2007 08:32:50 |
un TLabel como Hipervínculo | zuriel_zrf | Internet | 9 | 06-01-2006 22:11:49 |
tlabel como Centrar ? | Pascual Montes | Varios | 4 | 11-06-2005 02:53:33 |
un TLabel para ir a pagina web | zuriel_zrf | Internet | 1 | 19-02-2004 11:16:29 |
Tlabel enlazado a un TDBedit | CORBATIN | OOP | 2 | 15-09-2003 00:29:10 |
|