PDA

Ver la Versión Completa : Un editor COOL. Al recibir el foco se "ilumina" y viceversa...


pascalutn2003
05-12-2006, 04:02:48
HOLA A TODOS: :D

A ver que les parece esto que les tiro.

Es un editor que al recibir el foco cambia de color y la apariencia de la fuente y cuando lo pierde (al foco :D) vuelve a la normalidad.

En realidad me hacia falta algo asi y comence a diseñarlo; seguramente esta para arreglarlo y mejorarlo pero a mi me sirvio a pesar de sus defectos.

Perdonen por no haberlo comentado, me parecio que no hacia falta.

EDGARDO - Córdoba - Argentina



unit CoolEdit;

interface

uses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls, Graphics, Forms;

type
TCoolEdit = class(TEdit)
private

fColor : TColor;
fColorWithFocus : TColor;
fColorWithOutFocus : TColor;

fFont : TFont;
fFontFocus : TFont;
fFontNoFocus : TFont;

FColorFont : TColor;
fFontColorFocus : TColor;
fFontColorNoFocus : TColor;

Procedure SetColor(Value:TColor);
Procedure SetFont(Value:TFont);
Procedure SetColorFont(Value:TColor);


protected

Procedure WMSetFocus(var Message:TWMSetFocus);message WM_SETFOCUS;
Procedure WMKillFocus(var Message:TWMKillFocus);Message WM_KILLFOCUS;

public

Constructor Create(AOwner:TComponent);override;
Destructor Destroy;override;

published

Procedure RePaint;Override;

Property FocusColor : TColor Read fColorWithFocus Write SetColor Default clAqua;
Property NoFocusColor : TColor Read fColorWithOutFocus Write SetColor Default clSilver;

Property FocusFont : TFont Read fFontFocus Write SetFont;
Property NoFocusFont : TFont Read fFontNoFocus Write SetFont;

Property FontColorFocus : TColor Read fFontColorFocus Write SetColorFont Default clBlue;
Property FontColorNoFocus: TColor Read fFontColorNoFocus Write SetColorFont Default clBlack;

end;

procedure Register;

implementation

Var Foco : Boolean;

Constructor TCoolEdit.Create(AOwner:TComponent);
Begin

Inherited Create(AOwner);

Color:=clSilver;
fColorWithFocus:=clAqua;
fColorWithOutFocus:=clSilver;
fFontColorFocus:=clBlue;
fFontColorNoFocus:=clBlack;


End;

Procedure TCoolEdit.WMSetFocus(var Message:TWMSetFocus);
Begin
Inherited;

Foco:=True;

Repaint;
End;

Procedure TCoolEdit.WMKillFocus(var Message:TWMKillFocus);
Begin
Inherited;

Foco:=False;

Repaint;
End;

Procedure TCoolEdit.Repaint();
Begin
If Foco Then Begin
Font.Style:=[fsBold];
Font.Color:=fFontColorFocus;
Color:=fColorWithFocus;
End
Else begin
Font.Style:=[];
Font.Color:=fFontColorNoFocus;
Color:=fColorWithOutFocus;
End;
End;

Procedure TCoolEdit.SetColor(Value:TColor);
Begin
If fColor <>Value Then Begin
fColor:=Value;
Repaint;
End;
End;

Procedure TCoolEdit.SetFont(Value:TFont);
Begin
If fFont<>Value Then Begin
fFont:=Value;
Repaint;
End;
End;

Procedure TCoolEdit.SetColorFont(Value:TColor);
Begin
If fColorFont <>Value Then Begin
fColorFont:=Value;
Repaint;
End;
End;

Destructor TCoolEdit.Destroy;
Begin
Inherited Destroy;
End;

procedure Register;
begin
RegisterComponents('Cool', [TCoolEdit]);
end;

end.

dec
05-12-2006, 04:40:20
Hola,

Pues está muy bien, hombre. Muchas gracias por compartirlo. ;)

pascalutn2003
05-12-2006, 05:15:06
¿Te anduvo?

Espero que si, pero fijate bien que si pones el efecto del cambio en el paint (donde debe ir) y no en repaint te puede funcionar mejor :rolleyes: ...

En cualquier momento paso otro codigo de un editor con un boton adentro que cambia el glyph...

None vemo depue' :)

dec
05-12-2006, 05:18:17
Hola,

Bueno. En realidad me limité a leer el código fuente. Me parece curioso que quieras compartirlo, porque puede ser de utilidad a alguien.

Supongo que lo que dices del "Paint" tiene que ver conque no es del todo necesario el "Repaint", ¿verdad?

pascalutn2003
05-12-2006, 05:19:08
1.-Tambien se puede proceder del igual modo con un TDBEdit, ya lo hice y obviamente se llama TDBCoolEdit :D

2.- No te va a funcionar el cambio de color de foco porque no lo termine, solo le di un color fijo pero; en cuanto lo tenga lo paso. :cool:

pascalutn2003
05-12-2006, 05:26:31
¿Curioso? :confused:

Para nada; pasa que es una buena forma de retribuir a las ayudas que me dan las personas que andan por el foro.:o

Y sip; lo del repaint puede no ser necesario, pero pasa que por ahi pequé de necio :rolleyes: y en lugar de utilizar el Paint como corresponde quise ver que pasaba de la forma en que lo subi.

De modo alguno vas a encontrar un par de cosas que no tienen sentido; sucede que iba escribiendo y bla bla bla, pero cuando daba marcha atras en algo no borraba todo el codigo basura.:p

En fin; espero puedan disfrutarlo (y mejorarlo jejejejeje; le falta mucho) yo por mi lado lo voy a seguir desarrlollando...

EDGARDO - Córdoba - Argentina :cool:

DarKraZY
05-12-2006, 10:10:23
Hola! Muy bueno el componente. Tan sólo una objeción. La propiedad "FontColorFocus" y "FontColorNoFocus" no es necesaria, ya que podrías usar el atributo Color de "FocusFont" y "NoFocusFont".

unsaludo!

pascalutn2003
05-12-2006, 23:37:59
...por mas que quiero...

Hola a todos, anoche deje el codiguito del CoolEdit y mencione lo del Paint en lugar de RePaint.

Crei que era yo el herrado cuando le dije a David que habia sido necio al utilizar Repaint en lugar de Paint; pero resulta que Paint en el ancestro no existe:o y por muchas vueltas que le di; aun intentando con un evento personalizado agregado al que pretendi llamar Paint; no se pudo.

Pido disculpas por el error cometido.

pascalutn2003
05-12-2006, 23:40:40
Hola pibeeee:

Tenes razon sobre las cosillas de mas; no me di cuenta jejejeje :)

Ya lo corregiré :rolleyes:

AzidRain
07-12-2006, 06:06:07
DevEx Editors ya incluye este comportamiento para todos sus controles (mas de 30) con muchas otras opciones...

AzidRain
08-12-2006, 03:35:38
Este código hace un "HotTrack" con Labels y checkboxes, si lo cambian un poco sirve para cualquier control...me parece que se explica solo


{Hay que sobreescribir el procedimiento WndProc procedure}
procedure WndProc(var Message : TMessage) ; override ;

procedure TForm1.WndProc(var Mesg : TMessage) ;
begin
{Aqui vemos que componente ha cambiado.
El bit de aqui nos dice sobre que componente se encuentra el mouse }
if Mesg.LParam = Longint(Label1) then
ChangeColor(Label1, Mesg.Msg) ;
if Mesg.LParam = Longint(Label2) then
ChangeColor(Label2, Mesg.Msg) ;
if Mesg.LParam = Longint(Label3) then
ChangeColor(Label3, Mesg.Msg) ;
if Mesg.LParam = Longint(CheckBox1) then
ChangeColor(CheckBox1, Mesg.Msg) ;

inherited WndProc(Mesg) ;
end;


procedure TForm1.ChangeColor
(Sender : TObject; Msg : Integer) ;
Begin
{ Si el mouse está sobre un label tenemos que hacer esto}

if Sender IS TLabel Then
begin
if (Msg = CM_MOUSELEAVE) then
(Sender As TLabel).Font.Color:=clWindowText;
if (Msg = CM_MOUSEENTER) then
(Sender As TLabel).Font.Color:=clBlue;
end;

{ Si es un checkbox...}
if Sender IS TCheckBox Then
begin
if (Msg = CM_MOUSELEAVE) then
(Sender As TCheckBox).Font.Color:=clWindowText ;
if (Msg = CM_MOUSEENTER) then
(Sender As TCheckBox).Font.Color:=clRed ;
end;
end;

pascalutn2003
08-12-2006, 04:45:06
Hola AzidRain

¿Donde están esos componentes?, ¿tienen el codigo para verlo?

EDGARDO - Córdoba - Argentina :cool:

P.D.: veo que me odiaste por hacer esto tan pavo para vos; perdon. :o

rcarrillom
08-12-2006, 05:23:17
¿Donde están esos componentes?, ¿tienen el codigo para verlo?

Son de paga, la página de la suite es http://www.devexpress.com

AzidRain
09-12-2006, 16:32:09
Hola AzidRain
P.D.: veo que me odiaste por hacer esto tan pavo para vos; perdon. :o
Hombre pero por que odiar.... Que palabra tan fea, a mi tambien me ha pasado que según yo descubro algo superbuenisimo y al comentarlo en el foro o con amigos resulta que ya lo habia por otro lado y mejor...Ja..Bueno finalmente siempre sirve todo el esfuerzo para aprender.

Ahi te deje un código muy similar que hace lo mismo que quieres, solo falta cmabiarlo para que afecte cualquier componente.

Los componentes de Developer Express los encuentras en http://www.devexpress.com, hay varios demos descargables. La verdad son impresionantes y para quienes tenemos que hacer aplicaciones que "son para entregar ayer" y que además se ven bien pues es un muy buena opción.
A mi me pasó que hice un descendiente de TDBGrid con totales y ordenación en los encabezados, pensé que era lo máximo hasta que vi TcxDBGrid de las DevEx...:D

Deiv
12-12-2006, 16:16:33
Interesante tu componente, esta pregunta me hice hace 1 año atrás de cómo lograr ese efecto de selección muy diferente al predeterminado por windows y.... pregunté en otros foros, no me respondieron, luego me olvidé del asunto y no lo hice ni en el Club Delphi, sabiendo que aquí encuentro muchas respuestas.

Probando el mismo, no sé si estoy utilizando mal tu componente o no me queda claro: las propiedades = Color, FocusColor, FontColorFocus, FontColorNoFocus, por mucho que las cambio a otro Color, en tiempo de ejecución no trabajan.

Imagino ¿te falta acabarlo verdad? pregunto esto ya que con la programación de componentes no estoy muy familiarizado.
Un saludo

pascalutn2003
13-12-2006, 02:04:04
Hola Deiv: :D

Perdon por la demora; aqui tenes el código corregido : ;)

Falta darle unos retoques aun pero ahi va.

Vas a encontrar cosas como por ejemplo que conviven la propiedad Color(la que trae por defecto) y ColorNoFocus (que es la que le puse yo), traté de que el efecto de "normalización" a la hora de perder el foco se produjera con la misma propiedad Color(por defecto del componente) pero si hago eso se pone todo en negro y todavia no encuentro el porqué (que seguro es una burrada que estoy obviando por ser eso : una burrada).
Seguramente alguien le puede encontrar la vuelta y darle remedio; yo lo seguiré intentando al igual que con las fuentes que; posiblemente cambie todo a TStyleFont.

Espero te sirva y si le haces cambios avisame.

GRACIAS por comprar mi producto jajajajajaja noooo; una broma :cool:



unit CoolEdit;

interface

uses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls, Graphics, Forms;

type TCoolEdit = class(TEdit)
private

fColorWithFocus : TColor;
fColorWithOutFocus : TColor;

FColorFont : TColor;
fFontColorFocus : TColor;
fFontColorNoFocus : TColor;
Foco : Boolean;

Procedure SetColor(Value:TColor);
Procedure SetColorNoFocus(Value:TColor);
Procedure SetFontColorFocus(Value:TColor);
Procedure SetFontColorNoFocus(Value:TColor);


protected

Procedure WMSetFocus(var Message:TWMSetFocus);message WM_SETFOCUS;
Procedure WMKillFocus(var Message:TWMKillFocus);Message WM_KILLFOCUS;

public

Constructor Create(AOwner:TComponent);override;
Destructor Destroy;override;

published

Procedure RePaint;Override;

Property ColorFocus : TColor Read fColorWithFocus Write SetColor Default clAqua;
Property ColorNoFocus : TColor Read fColorWithOutFocus Write SetColorNoFocus Default clSilver;

Property FontColorFocus : TColor Read fFontColorFocus Write SetFontColorFocus Default clBlue;
Property FontColorNoFocus: TColor Read fFontColorNoFocus Write SetFontColorNoFocus Default clBlack;

end;


Procedure Register;

implementation

Procedure TCoolEdit.SetFontColorFocus(Value:TColor);
Begin

fFontColorFocus:=Value;

Repaint;

End;

Procedure TCoolEdit.SetFontColorNoFocus(Value:TColor);
Begin

fFontColorNoFocus:=Value;

Repaint;

End;

Constructor TCoolEdit.Create(AOwner:TComponent);
Begin

Inherited Create(AOwner);

Color:=clSilver;
fColorWithFocus:=clAqua;
fColorWithOutFocus:=clSilver;
fFontColorFocus:=clBlue;
fFontColorNoFocus:=clBlack;

End;

Procedure TCoolEdit.WMSetFocus(var Message:TWMSetFocus);
Begin
Inherited;

Foco:=True;

Repaint;
End;

Procedure TCoolEdit.WMKillFocus(var Message:TWMKillFocus);
Begin
Inherited;

Foco:=False;

Repaint;
End;

Procedure TCoolEdit.Repaint();
Begin
If Foco Then Begin
Font.Style:=[fsBold];
Font.Color:=fFontColorFocus;
Color:=fColorWithFocus;
End
Else begin
Font.Style:=[];
Font.Color:=fFontColorNoFocus;
Color:=fColorWithOutFocus;
End;
End;

Procedure TCoolEdit.SetColor(Value:TColor);
Begin
If fColorWithFocus <>Value Then Begin
fColorWithFocus:=Value;
Repaint;
End;
End;

Procedure TCoolEdit.SetColorNoFocus(Value:TColor);
Begin
If fColorWithOutFocus <>Value Then Begin
fColorWithOutFocus:=Value;
Repaint;
End;
End;

Destructor TCoolEdit.Destroy;
Begin

Inherited Destroy;

End;

procedure Register;
begin
RegisterComponents('Cool', [TCoolEdit]);
end;

end.

pascalutn2003
13-12-2006, 02:11:02
¿Como hacen para que el codigo que uno mete en el hilo les salga realmente como codigo (encuadrado y con formato Delphi) dentro del foro?, ¿que hay que tocar? o ¿lo hacen los moderadores?

EDGARDO - Córdoba - Argentina

Héctor Randolph
13-12-2006, 02:17:26
Hola pascalutn2003!

Puedes hacerlo tu mismo, solamente tienes que encerrar el código entre etiquetas

[ delphi ] [ /delphi]

(pero sin espacios)

Más información aquí

http://www.clubdelphi.com/foros/showthread.php?t=10004

Saludos

pascalutn2003
13-12-2006, 02:22:42
Gracias hector :

Actuo como si entendiera y todo

jejeje:cool:

Delar
13-12-2006, 19:14:31
Que hace el inherited?

Lepe
13-12-2006, 19:49:19
type TCoolEdit = class(TEdit)

Inherited ejecuta el método que se llama igual en su ancestro. Puesto que el TCoolEdit deriva de un TEdit, lo que hace es ejecutar el método con el mismo nombre en la clase TEdit.

En plata: Lo que se hace es un puente, para que todo el código escrito en la clase TEdit, sirva para el TCoolEdit.

En este caso:
Inherited Create(AOwner);
se le ha de pasar el parámetro AOwner al Tedit, por eso se le añade el nombre del método (Create) y el parámetro AOwner.

Saludos

pascalutn2003
14-12-2006, 00:56:38
Hola Delar : :D

Respondiendo a tu pregunta, Inherited es la palabra reservada que implica la herencia. :)
En el caso de SetFocus y KillFocus (que es a los Inherited que creo estas refiriendote) heredan el comportamiento del metodo del ancestro; a seguir le agregué lo que me interesaba que hiciera, pero fijate que si no lo pones (al inherited) cuando el componente reciba el foco no vas a ver el cursor y no se pintará el texto que haya adentro si es que lo hay.
Hacele pruebas y mirá que resultados te dá. ;)
Aunque de todos modos capaz que alguien atine a que haga lo que debe hacer sin la palabra reservada Inherited :rolleyes:
De todos modos; como estoy trabajando con RePaint, tal vez sea esa la causa de verme obligado a utilizar Inherited.
Como te decía antes, hace pruebas y fijate si encontras alguna otra forma.:o

Espero que te aclare el panorama y suerte.

EDGARDO - Córdoba - Argentina :cool:

Deiv
15-12-2006, 15:03:09
Hola pascalutn2003,

He recopiado tu último código y he vuelto a instalar el mismo, si bien ahora cambia el color, lo hace en tiempo de diseño pero no así en tiempo de ejecución. Sería bueno quienes entienden sobre la programación de componentes te echen una mano para seguir adelante y finalizar tu componente.

pascalutn2003
15-12-2006, 23:25:29
Hola Deiv:

Fijate que he estado revisando el codigo, lo he desinstalado y vuelto a instalar y funciona bien.:confused:

Las propiedades son:

ColorFocus : Color de fondo con el foco
ColorNoFocus : Color de fondo sin el foco
FontColorFocus : Color de la fuente con el foco
FontColorNoFocus : Color de la fuente sin el foco

Por defecto y siempre al recibir el foco la letra se pone en negrita.

Fijate nuevamente por favor y si no te funciona no se que pueda ser, seria bueno que otros amigos del club lo probaran y me dijeran si les pasa lo mismo.:o

Nuevamente el codigo que acabo de compilar y que tengo funcionando en mi maquina :)


unit CoolEdit;

interface

uses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls, Graphics, Forms;

type TCoolEdit = class(TEdit)
private

fColorWithFocus : TColor;
fColorWithOutFocus : TColor;

FColorFont : TColor;
fFontColorFocus : TColor;
fFontColorNoFocus : TColor;
Foco : Boolean;

Procedure SetColor(Value:TColor);
Procedure SetColorNoFocus(Value:TColor);
Procedure SetFontColorFocus(Value:TColor);
Procedure SetFontColorNoFocus(Value:TColor);


protected

Procedure WMSetFocus(var Message:TWMSetFocus);message WM_SETFOCUS;
Procedure WMKillFocus(var Message:TWMKillFocus);Message WM_KILLFOCUS;

public

Constructor Create(AOwner:TComponent);override;
Destructor Destroy;override;

published

Procedure RePaint;Override;

Property ColorFocus : TColor Read fColorWithFocus Write SetColor Default clAqua;
Property ColorNoFocus : TColor Read fColorWithOutFocus Write SetColorNoFocus Default clSilver;

Property FontColorFocus : TColor Read fFontColorFocus Write SetFontColorFocus Default clBlue;
Property FontColorNoFocus: TColor Read fFontColorNoFocus Write SetFontColorNoFocus Default clBlack;

end;


Procedure Register;

implementation

Procedure TCoolEdit.SetFontColorFocus(Value:TColor);
Begin

fFontColorFocus:=Value;

Repaint;

End;

Procedure TCoolEdit.SetFontColorNoFocus(Value:TColor);
Begin

fFontColorNoFocus:=Value;

Repaint;

End;

Constructor TCoolEdit.Create(AOwner:TComponent);
Begin

Inherited Create(AOwner);

Color:=clSilver;
fColorWithFocus:=clAqua;
fColorWithOutFocus:=clSilver;
fFontColorFocus:=clBlue;
fFontColorNoFocus:=clBlack;

End;

Procedure TCoolEdit.WMSetFocus(var Message:TWMSetFocus);
Begin
Inherited;

Foco:=True;

Repaint;
End;

Procedure TCoolEdit.WMKillFocus(var Message:TWMKillFocus);
Begin
Inherited;

Foco:=False;

Repaint;
End;

Procedure TCoolEdit.Repaint();
Begin
If Foco Then Begin
Font.Style:=[fsBold];
Font.Color:=fFontColorFocus;
Color:=fColorWithFocus;
End
Else begin
Font.Style:=[];
Font.Color:=fFontColorNoFocus;
Color:=fColorWithOutFocus;
End;
End;

Procedure TCoolEdit.SetColor(Value:TColor);
Begin
If fColorWithFocus <>Value Then Begin
fColorWithFocus:=Value;
Repaint;
End;
End;

Procedure TCoolEdit.SetColorNoFocus(Value:TColor);
Begin
If fColorWithOutFocus <>Value Then Begin
fColorWithOutFocus:=Value;
Repaint;
End;
End;

Destructor TCoolEdit.Destroy;
Begin

Inherited Destroy;

End;

procedure Register;
begin
RegisterComponents('Cool', [TCoolEdit]);
end;

end.

Héctor Randolph
15-12-2006, 23:46:04
Pues yo lo acabo de instalar y aparentemente funciona, es decir, tengo varios CoolEdit en una forma y al navegar entre ellos con la tecla Tab cambian su color al recibir el foco. Bueno fue una prueba muy superficial pero al menos no me pasa los mismo que indica Deiv.

Saludos

Deiv
16-12-2006, 00:09:30
Bueno no sé como explicar, pero lo que sucede es que para desinstalarlo, primero que me fuí a Install Packages y busqué COOL, y no había, luego entonces reinstalé, ahí ya me salió un mensaje que ya existía duplicado, entonces en esa ventana que aparece Compile, Install, etc, ahi le dí Remove, si bien ya no veia al componente COOL en dicha ventana, pero seguía la pestaña de COOL entonces no se desinstaló, cosa mas rara, y cuando comprobé el componente, evidentemente trabajaba en tiempo de diseño pero no en tiempo de ejecución, algo debió truncarse imagino en mi máquina ya que si le funcionó a Randolph, entonces sí funca!

pascalutn2003
16-12-2006, 02:13:51
Hola Deiv:

El problema que podes llegar a tener es que cuando instalaste el componente lo hayas hecho en un paquete que ya existia.

Te recomiendo hacer lo siguiente :

1.- Click en Component en el menu principal de Delphi
2.- Click en Configure Palette
3.- Una vez dentro del cuadro de propiedades de la paleta de componentes "Palette Properties", vas a ver dos listados (uno al lado del otro)
4.- En el listado de la izquierda anda hasta el final del listado y Click sobre [All] para que te liste los componentes en su totalidad sin importar a quien pertenecen
5.- En el listado de la derecha vas a ver dos titulo (Name y Package); Click sobre Name para ordenar alfabeticamente los componentes
6.- Busca el componente Cool
7.- Si lo encontraste, fijate en la columna mas a la derecha a que paquete pertenece.
8.- Una vez localizado el componente, cerrá todo
9.- Buscá y abrí el paquete en cuestion haciendo doble click sobre dicho paquete
10.- En el cuadro de Edicion del paquete vas a ver una serie de botones (Compile, Add, Remove, Install y Options)
11.- Click sobre Remove
12.- En el cuadro de dialogo Remove From Project Click sobre el componente que quieras eliminar, darle a Ok y listo; no hay mas componente. Ojo guardá los cambios en el paquete.
13.- Reinstala el componente en un paquete nuevo (dale vos un nombre) y compilalo.
14.- Suerte y cuidado con lo que eliminas del paquete

Si tenes duda sobre algo avisame y te doy una mano

EDGARDO - Córdoba - Argentina

hector.roma
16-12-2006, 03:14:29
En su momento también necesite un código parecido, en mi caso no cambio el tipo de letra cuando el control está activo pero si el color del mismo permitiendo su selección desde el inspector de objetos.
Por otro lado, cómo la aplicación era de tamaño físicamente reducido decidí cargarme las etiquetas de cada TEdit y para que se supiera que era cada componente, decidí añadir una propiedad más DefaultValue que sirve para mostrar un texto por defecto en el caso que el usuario al salir del TEdit lo deje vacío (previamente tengo que decir que al entrar en el TEdit el text por defecto se borra para permitir al usuario introducir el valor que el quiera o no en función de la propiedad ClearOnEnter).

Os dejo mi código:

unit AdvEdit;

interface

uses
SysUtils, Classes, Controls, StdCtrls, Graphics;

type
TAdvEdit = class(TEdit)
private
{ Private declarations }
FDefault : string;
FChanged : boolean;
FColor : TColor;
FOldColor : TColor;
FClear: boolean;
protected
{ Protected declarations }
function getDefault : string; virtual;
procedure setDefault(AValue:string); virtual;
//function getChanged : boolean; virtual;
procedure DoEnter; override;
procedure DoExit; override;
public
{ Public declarations }
procedure Cls;
function getChanges : boolean;
published
{ Published declarations }
property DefaultValue : string read getDefault write setDefault;
property ActiveColor : TColor read FColor write FColor;
property ClearOnEnter : boolean read FClear write FClear;
end;

procedure Register;

implementation

uses MaskUtils;

procedure Register;
begin
RegisterComponents('Meus', [TAdvEdit]);
end;

{ TAdvEdit }

//Método para restaurar el componente de forma rápida
procedure TAdvEdit.Cls;
begin
Text := DefaultValue;
FChanged := FALSE;
Change
end;


procedure TAdvEdit.DoEnter;
begin
//Guardamos el color original
FOldColor := Color;
//Establecemos nuestro color
Color := ActiveColor;
//Solo borramos el contenido del cuadro de texto en el caso que
//1. ClearOnEnter = TRUE y
//2. El usuario no haya introducido un valor antes.
if ((Text = DefaultValue) AND (FClear)) then Text := '';
inherited;
end;

procedure TAdvEdit.DoExit;
begin
// Al salir, si el usuario deja el cuadro en blanco o bien vuelve a escribir
//el contenido original... por asi decirlo retornamos al estado por defecto
if ((Text = '') OR (Text = Self.DefaultValue)) then begin
Self.Text := Self.DefaultValue;
Self.FChanged := FALSE;
end
else
Self.FChanged := TRUE;
// En cualquier caso, restauramos el Color original del cuadro
Color := FOldColor;
inherited;
end;

function TAdvEdit.getChanges: boolean;
begin
//Para evitar comparaciones en el codigo tipo if Text = DefaultText...
//uso este "flag" para saber si el usuario hizo cambios en el cuadro o no.
getChanges := FChanged;
end;

function TAdvEdit.getDefault: string;
begin
//Por probar a usar metodos con las propiedades
getDefault := FDefault;
end;


procedure TAdvEdit.setDefault(AValue: string);
begin
//Por probar a usar metodos con las propiedades
FDefault := AValue;
end;

end.


Espero que alguien más a parte de mi pueda encontrar utilidad este "componente".

Un saludo y gracias a todos.

hector.roma
16-12-2006, 03:19:00
Acabo de darme cuenta que el "uses MaskUtils;" no tiene mucho sentido o si, no lo sé en cualquier caso seguro que está ahi por algún intento de "evolución" y que puede ser eliminado sin problema.

pascalutn2003
16-12-2006, 17:37:07
Hola master:

Acabo de instalarlo y probarlo. :)

Sinceramente me gustó como lo encaraste, me habia olvidado de DoEnter y DoExit asi que voy a utilizar esa parte de tu codigo en el mio (me gusto mas:D).

Ahora sigo con el problema de como realizar el cambio de fuente en activo y no activo usando los tipo TFontStyle.

Tu codigo esta mejor porque contempla la propiedad Color para cuando esta inactivo, en cambio yo queria sacarmela de encima y no sabia como. :cool:

En otros terminos, me gusto mas el tuyo. :rolleyes:

GRACIAS :)

EDGARDO - Córdoba - Argentina

Deiv
17-12-2006, 22:51:07
6.- Busca el componente Cool
7.- Si lo encontraste, fijate en la columna mas a la derecha a que paquete pertenece.
8.- Una vez localizado el componente, cerrá todo
9.- Buscá y abrí el paquete en cuestion haciendo doble click sobre dicho paquete
10.- En el cuadro de Edicion del paquete vas a ver una serie de botones (Compile, Add, Remove, Install y Options)
11.- Click sobre Remove
12.- En el cuadro de dialogo Remove From Project Click sobre el componente que quieras eliminar, darle a Ok y listo; no hay mas componente. Ojo guardá los cambios en el paquete.

7.- ¿A que te refeieres con Paquete? ¿Quisiste decir pestaña de la PageControl?
8.- Bien cierro todas las ventanas.
9.- Busco en la pestaña del TabSheet de la PageControl donde estaba ubicado, pero ¿Donde doy doble click?? Le dí doble click a la pestaña, le dí doble click al componente y no sucede nada no aparece esa ventana que la conozco muy bien y se cómo utilizarla.
10.- Bueno finalmente he tratado de reinstalar el componente, así me salga el mensaje que existe un duplicado, y ahí aprovecho en REMOVErlo (11.-) cuando me aparece esa ventana(10.-)
12.- lo regrabo, pero cuando voy a la pestaña donde se encontraba el componente, por mucho que le haya dado Remove, por mucho que reinicio, SIGUE AHÍ y sigue trabajando!
Bueno finalmente intenté por otro lado, he instalado un componente que no me hacía falta solo por abrir esa ventana, lo Remuevo, reinicio y evidentemente ya no está el COOL component. Para asegurarme he editado el código para que me aparezca en otra pestaña:

procedure Register;
begin
RegisterComponents('NuevoCoolEdit', [TCoolEdit]);
end;
Reinstalo el componente......
Y lo mas interesante es que se vuelve a instalar en la ANTIGUA PESTAÑA (Paquete) que estaba la última vez y no así en esta nueva de arriba, compruebo el código y ahora si trabaja muy bien.

No sé si mi Delphi 7 está funcionando mal o el Componente hace algo en reinstalaciones. Pero de trabajar ahora trabaja muy bien.

hector.roma
18-12-2006, 02:46:19
Siguiendo la forma de este componente lo lógico sería pensar en esta aproximación:

...
published
...
property ActiveFont:TFont read FFont write FFont;
...

pero cuando fueras al Inspector de objetos y le dieras al botón [...] para asignar los valores correspondiente a tu fuente te llevarás una pequeña sorpresa; por así decirlo Delphi no sabe que hacer para asignar de forma correcta los diferentes campos del TFont, para que funcione correctamente creo que vas a tener que jugar con la unit DesignEditors para definir un Property Editor para la asignación del TFont desde el inspector de objetos.

En cualquier caso y siendo un poco chapuzas, puedes poner algo del tipo:


private
...
FFontName : string;
FOldFontName:string;
...
published
...
property ActiveFontName:string read FFontName write FFontName;
...
{En el código DoEnter}
...
FOldFontName := Font.Name;
Font.Name := FFontName;
...
{En el código DoExit}
...
Font.Name := FOldFontName;
...


Así lograrías poder cambiar el tipo de letra en tiempo de diseño para cada uno de los componentes de forma individual desde el propio inspector de objetos, y de este modo cada componente podría tener su tipo de letra diferente si eso tiene alguna utilidad...

Este cutre-procedimiento lo puedes extender también para el resto de propiedades del TFont que quieras modificar... si así lo haces te recomiendo empezar todas esas propiedades por alguna palabra común por ejemplo: FuenteActivaNombre, FuenteActivaTamaño, FuenteActivaEstilo, ... así lo que lograrías es que todas las propiedades aparezcan en el inspector de objetos agrupadas.

hector.roma
18-12-2006, 03:01:31
Por si acaso estás tentado a preguntarme sobre esa unit y los editores de propiedades te recomiendo tanto la búsqueda por este foro de esos conceptos; como también, por ejemplo, la búsqueda en el google de: TPropertyEditor TFont Delphi el primer enlace trae ejemplos y te da dos referencias más para buscar: TFontNameProperty y TFontProperty... espero que te gusten las pruebas de ensayo y error como técnica de aprendizaje (http://es.wikipedia.org/wiki/Tipos_de_aprendizaje)

Supongo que por mi parte ésta es toda la ayuda que te puedo ofrecer, pues poco he trabajado con los editores de propiedades.