Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Trucos (https://www.clubdelphi.com/foros/forumdisplay.php?f=52)
-   -   Resaltar TEdit, TDBEdit, TComboBox al recibir foco (https://www.clubdelphi.com/foros/showthread.php?t=80777)

casacham 30-11-2006 06:35:41

Resaltar TEdit, TDBEdit, TComboBox al recibir foco
 
El código que propongo aquí es para dar un efecto visual agradable a los objetos de entrada de datos de los formularios que nuestros usuarios utilizan para cargar las tablas.
Utilizo el viejo y no tan recordado operador as y el objetivo del codigo es hacer que algunos de estos objetos (TEdit, TDBEdit, TComboBox, etc.) cambie su propiedad color al recibir foco y retorne a la original al perderlo. El punto es que uno podria hacerlo de muchas maneras, es decir escribiendo arduo código o bien simplificarlo en solo una linea. Aquí la variable Sender es fundamental. No solo contiene el nombre de nuestro objeto, sino que puede transformarse en el. Veamos el ejemplo.
Para hacer que nuestro objeto muestre un color al recibir foco y retorne al original debemos captar dos eventos, para el primero es “OnEnter” y el segundo (al perder el foco) “OnExit”. Así podríamos escribir para cada objeto que tengamos un evento similar a este:
Código Delphi [-]
procedure TForm1.Edit1Enter(Sender: TObject);
begin
  Edit1.Color := clYellow;
end;

procedure TForm1.Edit1Exit(Sender: TObject);
begin
  Edit1.Color := clWindow;
end;

De esta forma, si tenemos 10 TDBEdit habrá 20 procedimientos para simplemente cambiar el color. Desde ya esto no es aceptable en programación.
Otra forma seria crear un solo evento y testar el parámetro Sender. Esto seria algo asi como lo que sigue:

Código Delphi [-]
procedure TForm1.Edit1Enter(Sender: TObject);
begin
  IF Sender=Edit1 Then Edit1.Color := clYellow;
  IF Sender=Edit2 Then Edit2.Color := clYellow;
  IF Sender=Edit3 Then Edit3.Color := clYellow;
  IF Sender=Edit4 Then Edit4.Color := clYellow;
end;
No tan engorroso, pero si tedioso. Pues es aquí donde viene la solución que propongo, y esto, creo que muchos de los programadores avanzado lo deben conocer, pero para los noveles es un misterio como lo fue para mi cuando buscaba una solución y no tenia donde consultar. Utilizaremos el operador as y la variable Sender de la siguiente manera.
1) Haremos doble click en el evento OnEnter del primer o el TDBedit que elijan
2) Escribiremos el siguiente codigo para tal evento
Código Delphi [-]
procedure TForm1.DBEdit1Enter(Sender: TObject);
begin
  (Sender as TDBEdit).Color:= clYellow;
end;

3) Luego, ampliaremos la aplicación haciendo que todos los demás objetos TDBEdit compartan el mismo evento, copiando con ctrl.+insert y shifht+insert el nombre del evento en los OnEnter de los demas TDBEdit de nuestro formulario.
4) Luego debemos escribir el código para el evento de perdida de foco. No es ni mas ni menos que similar a este.
Código Delphi [-]
procedure TForm1.DBEdit1Exit(Sender: TObject);
begin
   (Sender as TDBEdit).Color:= clWindow;
end;

Conclusión: Esto hace que cuando el objeto este funcionando o el usuario escribiendo en el este se encuentre de color amarillo, resaltado de los demás de color blanco. Luego al perder foco recupera su color normal. Ademas deseo que vean el potencial que da la combinacion de la variable sender con el operador as para escribir procedimientos comunes a muchas acciones de nuestro programa.
Un ultimo ejemplo nos aclara el poder real de estos comandos. Para el evento OnDblClick de TGraphic escribimos la siguiente linea de comando a compartir con todos los TGraphic de nuestro proyecto. Donde Abrir es un TOpenDialog.

Código:

begin
  IF Abrir.Execute THEN (Sender As TGraphic).SaveToFile(Abrir.FileName);
end;

Agradecería aquel que utilice este codigo comentara si le ha resultado beneficioso y si le ha resuelto algunos problemas, desde ya muchisimas gracias

gluglu 30-11-2006 12:29:43

Con

Código Delphi [-]
(Sender as TWinControl).Color := clWindow;

no haría falta crear un evento propio para cada tipo de Edit (TEdit, TDBEdit, etc.)

Sirve para todas las clases descendientes de TWinControl.

gluglu 30-11-2006 12:31:43

Con
Código:

(Sender as TWinControl).Color := clWindow;
no haría falta un evento diferente para cada tipo de Edit (TEdit, TDBEdit, etc).

Sirve para toda clase descendiente de TWinControl.

gluglu 30-11-2006 12:33:41

Con (Sender as TWinControl).Color := clWindow; no haría falta un evento diferente para cada tipo de Edit (TEdit, TDBEdit, etc).

Sirve para cualquier clase descendiente de TWinControl.

(Disculpas por haber insertado 3 veces el comentario) pero al paracer no me pone correctamente las etiquetas de Código o Delphi)

casacham 30-11-2006 23:00:19

Gracias GluGlu por tu nueva informacion. De hecho que TWinControl encierra muchas porpiedades generales a muchos objetos y la verdad es que pense que no la podia utilizar, asi esto me da nuevas ideas

vinicc 04-01-2007 20:51:27

Si no mal recuerdo en la versión 1,2 y talves 3 en el cuadro de propiedades de los TBEdit existía esta característica que te permitía definir el color al entrar y al salir, sin tener que evaluar el evento OnEnter/OnExit. Sin embargo hace un año que retome la actividad de programador con Delphi 7, y no sabía cómo hacerlo con un TDBLookupComboBox, así que gracias por el dato, me será de mucha utilidad.

wsilvius 09-01-2007 22:04:40

Excelentísmo aporte, le agradezco sobremanera su investigación al respecto, lo pondré en práctica en el acto..!

wsilvius 09-01-2007 22:18:55

Con (Sender as TWinControl).Color := clWindow; no funciona, saca un error que no reconoce "Color", la unidad Controls está asignada (obviamente) y aún así no reconoce la propiedad, según la ayuda el TWinControl no tiene tal "Color" aunque es hija de TControl que si la tiene, cambié por TControl y nada.
Utilicé la opción inicial de la propuesta.

suseLinux 11-01-2007 04:26:11

BAKANISIMO.... POR deje eso de crear el evento por cada control.... TE PASASTE HERMANO...!!!

muy buen aporte

suseLinux 11-01-2007 04:27:33

BAKANISIMO.... POR deje eso de crear el evento por cada control.... TE PASASTE HERMANO...!!!

muy buen aporte

casacham 15-01-2007 15:09:44

He estado leyendo sus comentarios y realmente le agradezco la buena critica. Esper poder seleccionar mas trucos de mi galeria y enseñarselos. A veces el tiempo es lo que limita. Este codigo sigue siendo util aun cuando los tiempos de programacion son acotados, en DELPHI 7 los objetos de la biblioteca Dev Express y Quantum Grid que no vienen originalmente con la instalacion de lengaje, sino que hay que bajar los paquetes por E_Mule (por ejemplo) y luego instalarlos desde Delphi tienen propiedades en el inspector de objetos que permiten setear la apariencia al ganar y perder foco, pero seria igual de tedioso hacerlo para cada objeto aunque no implique codigo. El punto en programacion es hacer lo mas eficiente con la menor cantidad de codigo. Eso es ingenieria aplicada al procesamiento de datos y lo que hace divertido programar.
Gracias

nuk3zito 21-02-2007 21:45:49

Para el que dice que el clWindow no existe, basta con agregar en el uses la unit "Graphics"

Y con ese código que pones se puede hacer mucho más... por ejemplo:

En la declaración del objeto de la forma...
Código Delphi [-]
   procedure EnterControl(Sender: TObject);
   procedure ExitControl(Sender: TObject);

Código Delphi [-]
procedure TForm1.EnterControl(Sender: TObject);
begin
  if Sender is TWinControl then
     TWinControl(Sender).Color := clYellow;
end;

Código Delphi [-]
procedure TForm1.ExitControl(Sender: TObject);
begin
  if Sender is TWinControl then
     TWinControl(Sender).Color := clWindow;
end;


y en el OnCreate de la Forma...
Código Delphi [-]
   for i:= 0 to ComponentCount - 1 do
   begin
      // Pongo de Clase por clase porque ninguna clase
      // genérica puede asegurarnos que tengamos los 
      // métodos OnEnter u OnExit
      if (Components[i] is TEdit) then
       begin
         TEdit(Components[i]).OnEnter:= EnterControl;
         TEdit(Components[i]).OnExit:= ExitControl;
       end
      else if (Components[i] is TDBEdit) then
       begin
         TDBEdit(Components[i]).OnEnter:= EnterControl;
         TDBEdit(Components[i]).OnExit:= ExitControl;
       end;
   end;


Sorry... es que ando aburrido y necesitaba escribir...

Saludos



nuk3zito 21-02-2007 21:48:42

O sea... me faltó decir que con eso último que envié ya no es necesario asignar por medio de diseño los eventos OnExit u OnEnter y podemos agregar cuantos controles queramos a nuestra forma y no preocuparnos de asignarle esos eventos, ya que el sistema lo hará por nosotros en tiempo de ejecución.

Saludos

casacham 21-04-2007 18:58:19

Definitivamente TWinControl No funciona, prove de todas maneras y no funciona

karlosgaviria 15-09-2007 23:41:07

TWinControl [b]si[b] funciona de esta manera:

[delphi]
procedure TNuevoLib.isbnEnter(Sender: TObject);
begin
(Sender as TWinControl).Brush.Color := clCream;
(Sender as TWinControl).Repaint;
end;
[delphi]

karlosgaviria 15-09-2007 23:42:05

TWinControl si funciona de esta manera:


procedure TNuevoLib.isbnEnter(Sender: TObject);
begin
(Sender as TWinControl).Brush.Color := clCream;
(Sender as TWinControl).Repaint;
end;


La franja horaria es GMT +2. Ahora son las 22:28:44.

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