Cita:
Empezado por elrayo76
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;
constructor TForm.Create(AOWner: TComponent);
begin
inherited;
FFocusedColor := clActiveCaption;
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;
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;
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;
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;
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;
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
