Gracias, gracias
Al final es una combinacion de los metodos de ecfisa y y ozswizzard.
En esta procedure se produce el error
[DCC Error] UnitProveedorFactura.pas(1099): E2362 Cannot access protected symbol TWinControl.OnEnter
[DCC Error] UnitProveedorFactura.pas(1099): E2035 Not enough actual parameters
en las lineas
Obj.OnEnter := ControlEnter;
Obj.OnExit := ControlExit;
Código Delphi
[-]
procedure TFormProveedorFactura.ControlesResaltados(AOwner: TComponent);
var
i: word;
Obj: TWinControl;
begin
for i := 0 to AOwner.ComponentCount - 1 do
begin
if AOwner.Components[i] is TWinControl then
begin
Obj := (AOwner.Components[i] as TWinControl);
if not MethodAssigned(Obj, 'OnEnter') then
Obj.OnEnter := ControlEnter;
if not MethodAssigned(Obj, 'OnExit') then
Obj.OnExit := ControlExit;
end;
end;
end;
asi que de momento el mejor resultado es
Código Delphi
[-]
type TFormProveedorFactura = class(TForm)
procedure ControlesResaltados(AOwner: TComponent);
procedure ControlEnter(Sender: TObject);
procedure ControlExit(Sender: TObject);
end;
procedure TFormProveedorFactura.FormActivate(Sender: TObject);
begin
if activate = True then
Exit;
activate := True;
ControlesResaltados(Self);
IniciaGrillas;
VaciaCampos;
end;
procedure TFormProveedorFactura.ControlesResaltados(AOwner: TComponent);
var
i: word;
Obj: TWinControl;
begin
for i := 0 to AOwner.ComponentCount - 1 do
begin
if AOwner.Components[i] is TWinControl then
begin
Obj := (AOwner.Components[i] as TWinControl);
if not MethodAssigned(Obj, 'OnEnter') then
AssignMethod(AOwner.Components[i], 'OnEnter', ControlEnter);
if not MethodAssigned(Obj, 'OnExit') then
AssignMethod(AOwner.Components[i], 'OnExit', ControlExit);
end;
end;
end;
procedure TFormProveedorFactura.ControlEnter(Sender: TObject);
begin
TWinControl(Sender).Brush.Color := clSkyBlue;
end;
procedure TFormProveedorFactura.ControlExit(Sender: TObject);
begin
TWinControl(Sender).Brush.Color := clWindow;
end;
Asi que este pequeño codigo se puede trasportar al resto de formularios y con solo cambiar el formulario propietario ya esta y no se toca mas código.
Las rutinas para comprobar metodos y asignarlos ya estan en la bliblioteca general de funciones (Gracias de nuevo).

Digo esto por que si lo saco de type TForm, se queja de la siguiente linea
[DCC Error] UnitProveedorFactura.pas(1099): E2009 Incompatible types: 'method pointer and regular procedure'
en
AssignMethod(AOwner.Components[i], 'OnEnter', ControlEnter);
osea, la buena seria esta para que no hubiera que tocar nada de codigo, pero no se resolver el problema 'method pointer and regular procedure'
Código Delphi
[-]
procedure ControlesResaltados(AOwner: TComponent);
var
i: word;
Obj: TWinControl;
begin
for i := 0 to AOwner.ComponentCount - 1 do
begin
if AOwner.Components[i] is TWinControl then
begin
Obj := (AOwner.Components[i] as TWinControl);
if not MethodAssigned(Obj, 'OnEnter') then
AssignMethod(AOwner.Components[i], 'OnEnter', ControlEnter);
if not MethodAssigned(Obj, 'OnExit') then
AssignMethod(AOwner.Components[i], 'OnExit', ControlExit);
end;
end;
end;
procedure ControlEnter(Sender: TObject);
begin
TWinControl(Sender).Brush.Color := clSkyBlue;
end;
procedure ControlExit(Sender: TObject);
begin
TWinControl(Sender).Brush.Color := clWindow;
end;
Saludos