FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
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:
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: 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
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.
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; |
#3
|
||||
|
||||
Con
Código:
(Sender as TWinControl).Color := clWindow; Sirve para toda clase descendiente de TWinControl. |
#4
|
||||
|
||||
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) |
#5
|
||||
|
||||
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
|
#6
|
|||
|
|||
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.
|
#7
|
|||
|
|||
Excelentísmo aporte, le agradezco sobremanera su investigación al respecto, lo pondré en práctica en el acto..!
|
#8
|
|||
|
|||
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. |
#9
|
|||
|
|||
BAKANISIMO.... POR deje eso de crear el evento por cada control.... TE PASASTE HERMANO...!!!
muy buen aporte |
#10
|
|||
|
|||
BAKANISIMO.... POR deje eso de crear el evento por cada control.... TE PASASTE HERMANO...!!!
muy buen aporte |
#11
|
||||
|
||||
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 |
#12
|
||||
|
||||
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...
y en el OnCreate de la Forma...
Sorry... es que ando aburrido y necesitaba escribir... Saludos |
#13
|
||||
|
||||
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 |
#14
|
||||
|
||||
Definitivamente TWinControl No funciona, prove de todas maneras y no funciona
|
#15
|
|||
|
|||
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] |
#16
|
|||
|
|||
TWinControl si funciona de esta manera:
procedure TNuevoLib.isbnEnter(Sender: TObject); begin (Sender as TWinControl).Brush.Color := clCream; (Sender as TWinControl).Repaint; end; |
|
|
|