Ver Mensaje Individual
  #5  
Antiguo 11-09-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por elrayo76 Ver Mensaje
En lengua española seria como decir simplemente lo siguiente: todos los componentes que son editables cambiale el color cuando ingresas o cuando salis del mismo.
Mi estimado elrayo76, me temo que eso es mas simple de decir que de implementar...

La cuestión es: ¿ Que factor común se debería tomaría para identificar a un control como editable ?

A primera vista se podría pensar que todos aquellos que posean la propiedad Text, aunque no todos los que la poseen permiten ingresar datos...

Hasta Delphi 2010, mediante RTTI , sólo son accesibles las propiedades publicadas. (creo que luego existe la unit RTTI.PAS que permite acceder a las públicas)

Pero mi Delphi 7 no puede ; dejaría inmerecidamente fuera de la lista por ejemplo al TDateTimePicker, al TMemo y al TRichEdit que no publican la propiedad Text y sin embargo tan generosamente nos permiten escribir en ellos.


Entonces, si tuviera que darle una solución con la herramienta con que dispongo haría:
Código Delphi [-]
unit PaintEditCtrl;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Mask, Grids, ComCtrls, DBCtrls,DBGrids;

const
  WM_AFTER_CREATE = WM_USER + 300;

type
  TForm = class(Forms.TForm)
  private
    FPrevFocusedCtrl : TWinControl;
    FPrevFocusedColor: TColor;
    FFocusedColor    : TColor;
    function IsEditable(WC: TWinControl): Boolean;
    procedure WmAfterCreate(var Msg: TMessage); message WM_AFTER_CREATE;
    procedure ActiveCtrlChange(Sender: TObject);
  public
    constructor Create(AOWner: TComponent); override;
    destructor Destroy; override;
    property FocusedColor : TColor read FFocusedColor write FFocusedColor;
  end;

implementation

uses TypInfo;

var
 WCArray : array of TWinControlClass;

// Create
constructor TForm.Create(AOWner: TComponent);
begin
  inherited;
  FFocusedColor := clActiveCaption;

  // Componentes sobre los que se puede editar
  SetLength(WCArray, 9);
  WCArray[0] := TEdit;
  WCArray[1] := TMemo;
  WCArray[2] := TComboBox;
  WCArray[3] := TMaskEdit;
  WCArray[4] := TStringGrid;
  WCArray[5] := TLabeledEdit;
  WCArray[6] := TRichEdit;
  WCArray[7] := TDateTimePicker;
  WCArray[8] := TDBEdit;
  //...

  PostMessage(Handle, WM_AFTER_CREATE, 0, 0);
end;

// Devuelve True si la clase debe pintarse
function TForm.IsEditable(WC: TWinControl): Boolean;
var
  i: Integer;
begin
  Result := False;
  for i := Low(WCArray) to High(WCArray) do
    if (WC is WCArray[i]) and  Assigned(GetPropInfo(WC.ClassInfo,'Color')) then
      Result := True;
end;

// After Create
procedure TForm.WmAfterCreate(var Msg: TMessage);
begin
  Screen.OnActiveControlChange := ActiveCtrlChange;
  FPrevFocusedCtrl := Screen.ActiveControl;
  if IsEditable(FPrevFocusedCtrl) then
  begin
    FPrevFocusedColor := TColor(GetOrdProp(Screen.ActiveControl,'Color'));
    if IsEditable(FPrevFocusedCtrl) then
      SetOrdProp(FPrevFocusedCtrl,'Color',FFocusedColor);
  end;
end;

// Cambia control activo
procedure TForm.ActiveCtrlChange(Sender: TObject);
begin
  if IsEditable(FPrevFocusedCtrl) then
    SetOrdProp(FPrevFocusedCtrl, 'Color', FPrevFocusedColor);
  if IsEditable(Screen.ActiveControl) then
  begin
    FPrevFocusedColor := TColor(GetOrdProp(Screen.ActiveControl, 'Color'));
    SetOrdProp(Screen.ActiveControl, 'Color', FFocusedColor);
  end;
  FPrevFocusedCtrl := Screen.ActiveControl;
end;

// Destroy
destructor TForm.Destroy;
begin
  Screen.OnActiveControlChange := nil;
  Finalize(WCArray);
  inherited;
end;

end.

Uso:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,  StdCtrls, ExtCtrls, Grids, Mask, Buttons, ComCtrls, DBCtrls,DBGrids,
  PaintEditCtrl; (* Importante: Inclusión de PaintEditCtrl en la sección de interface *)

type
  TForm1 = class(TForm)
  private
    ...
  public
  end;

var
  Form1: TForm1;

implementation {$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FocusedColor := clActiveCaption;
end;

end.
De ese modo mi trabajo sería: Incluir la unidad, declarar el color del foco y de vez en cuando, agregar al arreglo los nuevos componentes que vaya incorporando.... Todo esto sin salirme de los que están basados en la VCL.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 11-09-2013 a las 21:15:48.
Responder Con Cita