Cita:
Empezado por elrayo76
Lo que intento es hacer algo como identificar a todos los componentes que sean del tipo ingreso de datos y cuando se ingresa a uno de ellos que se le cambie el color del fondo y cuando se salga se le ponga el color original.
|
Hola elrayo.
De este modo, cambiará el color del control que posee el foco y lo restaurará al perderlo siempre que el mismo posea la propiedad
Color:
Código Delphi
[-]
...
const
WM_AFTER_CREATE = WM_USER + 300;
type
TForm1 = class(TForm)
....
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FPrevFocusedCtrl : TWinControl;
FPrevFocusedColor: TColor;
FFocusedColor : TColor;
procedure WmAfterCreate(var Msg: TMessage); message WM_AFTER_CREATE;
procedure ActiveCtrlChange(Sender: TObject) ;
public
end;
var
Form1: TForm1;
implementation
uses TypInfo;
procedure TForm1.WmAfterCreate(var Msg: TMessage);
begin
Screen.OnActiveControlChange := ActiveCtrlChange;
FPrevFocusedCtrl := Screen.ActiveControl;
if Assigned(GetPropInfo(FPrevFocusedCtrl.ClassInfo,'Color')) then
begin
FPrevFocusedColor := TColor(GetOrdProp(Screen.ActiveControl,'Color'));
SetOrdProp(Screen.ActiveControl, 'Color', FFocusedColor);
end;
end;
procedure TForm1.ActiveCtrlChange(Sender: TObject);
begin
if Assigned(GetPropInfo(FPrevFocusedCtrl.ClassInfo, 'Color')) then
SetOrdProp(FPrevFocusedCtrl, 'Color', FPrevFocusedColor);
if Assigned(GetPropInfo(Screen.ActiveControl.ClassInfo,'Color')) then
begin
FPrevFocusedColor:= TColor(GetOrdProp(Screen.ActiveControl,'Color'));
SetOrdProp(Screen.ActiveControl, 'Color', FFocusedColor);
end;
FPrevFocusedCtrl:= Screen.ActiveControl;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
...
FFocusedColor := clLime;
PostMessage(Handle, WM_AFTER_CREATE, 0, 0);
end;
...
procedure TForm1.FormDestroy(Sender: TObject);
begin
Screen.OnActiveControlChange := nil;
end;
Saludos
