Hola, leyendo los ultimos mensajes sobre componentes he intentado hacer uno sobreescribiendo los eventos onenter y onexit. Se trata tansolo de un edit el cual coje un color si esta focused y vuelve al original si no.
Código Delphi
[-]
unit ColorEdit;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TColorEdit = class(TEdit)
private
original_color : TColor;
FFocusColor : TColor;
Assigned_exit : TNotifyEvent;
Assigned_enter : TNotifyEvent;
procedure SetFocusColor(cl : TColor);
procedure SetOnEnter(n : TNotifyEvent);
procedure SetOnExit (n : TNotifyEvent);
procedure Execute_Enter(sender : TObject);
procedure Execute_Exit(sender : TObject);
protected
public
constructor Create(AOwner: TComponent); override;
published
property FocusColor : TColor read FFocusColor write SetFocusColor default clWhite;
property OnEnter : TNotifyEvent read Assigned_enter write SetOnEnter;
property OnExit : TNotifyEvent read Assigned_exit write SetOnExit;
end;
procedure Register;
implementation
constructor TColorEdit.Create(AOwner: TComponent);
begin
inherited;
color := clSilver;
parentctl3d := false;
Ctl3D := false;
OnEnter := Execute_enter;
OnExit := Execute_exit;
end;
procedure TColorEdit.SetOnEnter(n : TNotifyEvent);
begin
Assigned_enter := n;
end;
procedure TColorEdit.SetOnExit(n : TNotifyEvent);
begin
Assigned_exit := n;
end;
procedure TColorEdit.Execute_enter(sender : TObject);
begin
original_color := color;
color := FFocusColor;
repaint;
Assigned_enter(sender);
end;
procedure TColorEdit.Execute_exit(sender : TObject);
begin
color := original_color;
repaint;
Assigned_exit(sender);
end;
procedure TColorEdit.SetFocusColor(cl : TColor);
begin
FFocusColor := cl;
end;
procedure Register;
begin
RegisterComponents('Samples', [TColorEdit]);
end;
end.
Lo que hace es asignar a OnExit y OnEnter un procedure que ejecuta el codigo de cambio de color y un supuesto procedure (assigned_enter, assigned_exit) que se le haya asignado, lo que ocurre es que no salta en el momento de salir o entrar de dicho componente

supongo que se tiene que programar a nivel de mensajes, cosa que no he hecho nunca. Si alguien me echa un mano...Por otra parte, tambien pense en sobreescribir el metodo repaint, y escoger el color alla, pero tampoco me funcionaba ¿hay alguna manera de detectar cuando se esta pintando un TEdit? Gracias por adelantado.