Ver Mensaje Individual
  #28  
Antiguo 16-12-2006
Avatar de hector.roma
hector.roma hector.roma is offline
Miembro
 
Registrado: jul 2005
Ubicación: a caballo entre Galicia y Portugal
Posts: 58
Reputación: 19
hector.roma Va por buen camino
Otro código parecido...

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:
Código Delphi [-]
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.
Responder Con Cita