Hola.
Yo estoy de acuerdo con
nlsgarcia, aunque aparentemente se teclea un poco más, el modo es mas contemplativo. Algo similar se planteó
aquí hace unos meses, pero está limitado a determinados controles, o a realizar la evaluacion del control activo mediante una larga serie de
if - then.
Usando
RTTI se puede reducir y flexibilizar el código para que contemple cualquier control que posea la propiedad
TColor:
Código Delphi
[-]
...
const
WM_AFTER_CREATE = WM_USER + 300;
type
TForm1 = class(TForm)
...
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FPrevFocusedCtrl: TControl;
FPrevColor: TColor;
procedure WmAfterCreate(var Msg: TMessage); message WM_AFTER_CREATE;
procedure ActiveCtrlChange(Sender: TObject);
public
end;
...
implementation
uses TypInfo;
procedure TForm1.ActiveCtrlChange(Sender: TObject);
begin
if Assigned(GetPropInfo(FPrevFocusedCtrl.ClassInfo, 'Color')) then
SetOrdProp(FPrevFocusedCtrl, 'Color', FPrevColor);
if Assigned(GetPropInfo(Screen.ActiveControl.ClassType,'Color')) then
begin
FPrevColor:= TColor(GetOrdProp(Screen.ActiveControl,'Color'));
SetOrdProp(Screen.ActiveControl, 'Color', clGradientActiveCaption); end;
FPrevFocusedCtrl:= Screen.ActiveControl;
end;
procedure TForm1.WmAfterCreate(var Msg: TMessage);
begin
Screen.OnActiveControlChange := ActiveCtrlChange;
FPrevFocusedCtrl:= Screen.ActiveControl;
if Assigned(GetPropInfo(FPrevFocusedCtrl.ClassInfo,'Color')) then
FPrevColor:= TColor(GetOrdProp(Screen.ActiveControl,'Color'));
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
PostMessage(Self.Handle, WM_AFTER_CREATE,0,0);
end;
...
procedure TForm1.FormDestroy(Sender: TObject);
begin
Screen.OnActiveControlChange := nil;
end;
De esta manera destacará tanto un Edit como un CheckBox, RadioButton, StringGrid, RichEdit,..., etc.
Saludos