shoulder,
Siguiendo la idea de ecfisa del uso de RTTI, revisa este código:
Código Delphi
[-]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, TypInfo, Grids;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Memo1: TMemo;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ActiveControlChanged(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ActiveControlChanged(Sender: TObject);
var
PropInfo: PPropInfo;
i: Integer;
begin
for i := 0 to ControlCount - 1 do
begin
if TWinControl(Controls[i]).Focused then
begin
PropInfo := GetPropInfo(Self.Controls[i].ClassInfo,'Color');
if Assigned(PropInfo) then
SetOrdProp(Controls[i], PropInfo, ord(clYellow));
end
else
begin
PropInfo := GetPropInfo(Self.Controls[i].ClassInfo,'Color');
if Assigned(PropInfo) then
SetOrdProp(Controls[i], PropInfo, ord(clWindow));
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Screen.OnActiveControlChange := ActiveControlChanged;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Screen.OnActiveControlChange := nil;
end;
end.
El código anterior cambia el color de cualquier control que tenga el focus activo si y solo si este tiene implementada la propiedad color. Esto lo hace de forma genérica por medio de
RTTI (Run-Time Type Information) y la propiedad
OnActiveControlChange que permite definir un manejador de evento para controlar el cambio de focus en un form.
El código anterior se encuentra implementado en el siguiente link:
http://terawiki.clubdelphi.com/Delph...e+con+RTTI.rar
Espero sea útil
Nelson.