Ver Mensaje Individual
  #11  
Antiguo 15-06-2012
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Reputación: 20
cesarsoftware Va por buen camino
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

Última edición por cesarsoftware fecha: 15-06-2012 a las 11:06:35.
Responder Con Cita