Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Cambiar color de los DBEdit al entrar en ellos (https://www.clubdelphi.com/foros/showthread.php?t=87442)

Delphitest 07-01-2015 09:30:38

Cambiar color de los DBEdit al entrar en ellos
 
Buenos días,

con ánimo de mejorar el aspecto de un formulario que tiene muchos campos me gustaría que al entrar en los DBEdit en modo edición cambiara el color de fondo para que el usuario sepa donde está el foco en ese momento.

Entiendo que con los eventos OnEnter y OnExit podría controlarlo de manera individual pero en este caso hay bastantes y me preguntaba si existe una forma más sencilla de hacerlo de manera general para todos los DBEdit sin tener que ir de uno en uno.

Muchas Gracias

newtron 07-01-2015 10:35:07

Hola.

A mi se me ocurren dos opciones. La primera es que crees un componente nuevo heredado del DBEdit y que lo personalices a tu gusto, esa es la opción más "elegante" pero también la más complicada.

Otra es que pongas el código que quieras en el OnEnter y OnExit de uno de ellos y que los demás DbEdits apunten al OnEnter y OnExit que hayas creado para el primero para no poner en cada uno de los demás el mismo código.

Saludos

Neftali [Germán.Estévez] 08-01-2015 19:20:09

Cita:

Empezado por newtron (Mensaje 487367)
Otra es que pongas el código que quieras en el OnEnter y OnExit de uno de ellos y que los demás DbEdits apunten al OnEnter y OnExit que hayas creado para el primero para no poner en cada uno de los demás el mismo código.

Para no tener que hacer eso de forma manual y poder usar los mismos formularios que tienes ahora, podrías hacer un procedimiento que llamas al iniciar el formulario (OnCreate/OnShow), que recorra los componentes del tipo que quieras (por ejemplo, TDBEdit, TEdit, TDBMemo, TMemo,...) y haga la asignación de los 2 eventos a cada uno de ellos.
Para ello tendrás que utilizar RTTI.

Como han dicho, esta segunda solución no es la más elegante, pero haciendolo así no sólo tendrás que añadir una línea a tus formualrios para que funcione.

Delphitest 08-01-2015 20:02:12

Muchas gracias a los dos por vuestra ayuda.

Creo que voy a optar por la vía simple, la de asignar al evento OnEnter y OnExit lo correspondiente. Lo demás suena bien pero creo que no está a mi alcance:(

Estoy haciendo pruebas para ver qué color encajaría mejor y me da la sensación que estoy pasando algo básico por alto, no soy capaz de hacer que el fondo cambie de color nunca.

Este es el código que estoy probando:

Código Delphi [-]
procedure TFOperaciones.DBNum1SolicitudEnter(Sender: TObject);
begin
  DBNum1Solicitud.Color := clInfoBk;
end;

procedure TFOperaciones.DBNum1SolicitudExit(Sender: TObject);
begin
   DBNum1Solicitud.Color := clWindow;
end;

Pero cuando entro en modo Edit en ese DBEdit ni se inmuta, el color sigue siendo el que viene por defecto.

¿Debo activar alguna propiedad o hacer algo especial a parte de insertar el código?

ecfisa 09-01-2015 00:43:09

Hola Delphitest.

Otra opción para detectar el cambio de foco, es usar el evento OnActiveControlChange :
Código Delphi [-]
...
type
  TForm1 = class(TForm)
    ...
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    procedure ActiveCtrlChange(Sender: TObject);
  ...
  end;

...
implementation

uses TypInfo;

const
  FOCUSEDCOLOR   = clMoneyGreen;
  UNFOCUSEDCOLOR = clWindow;

var
  PrevFocusedCtrl: TWinControl = nil;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Screen.OnActiveControlChange:= ActiveCtrlChange;
end;

procedure TForm1.ActiveCtrlChange(Sender: TObject);
begin
  if not Assigned(PrevFocusedCtrl) then
    PrevFocusedCtrl:= ActiveControl;

  if Assigned(GetPropInfo(PrevFocusedCtrl.ClassInfo, 'Color')) then
    SetOrdProp(PrevFocusedCtrl, 'Color', UNFOCUSEDCOLOR);

  if Assigned(GetPropInfo(ActiveControl.ClassInfo, 'Color')) then
  begin
    SetOrdProp(ActiveControl,'Color', FOCUSEDCOLOR);
    PrevFocusedCtrl:= ActiveControl;
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Screen.OnActiveControlChange:= nil;
end;
...
De este modo cambiará el color del control focalizado (siempre que poseea la propiedad Color)

Saludos :)

Delphitest 11-01-2015 11:24:02

Disculparme por no haber vuelto a decir nada de este tema pero estoy probando con el código que proporciona ecfisa y no salgo de ahí, me da un error de "Access Violation..." y por muchas vueltas que le estoy dando no hay manera...

Lo que me preocupa es que ni siquiera soy capaz de cambiar el color en un DBEdit, no hace caso ni al cambio de propiedad directamente desde el objeto ni si lo meto en el código en el evento OnEnter, algo debo estar pasando por alto

ecfisa 03-02-2015 12:45:09

1 Archivos Adjunto(s)
Hola Delphitest.

Lamento la demora en la respuesta, pero he estado afuera unos días.

No sé que pueda estar sucediendo ya que no puedo ver tu código, pero te adjunto los fuentes de uno funcional para que lo revises con tranquilidad.

Realizado en Delphi 7, S.O. Windows 7 (32bit)

Saludos :)

Delphitest 07-02-2015 09:29:33

Muchas gracias ecfisa,

con tu ejemplo he conseguido adaptarlo a mi código y funciona como quería

Buen fin de semana y gracias de nuevo


La franja horaria es GMT +2. Ahora son las 14:11:29.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi