Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros temas > Trucos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Los mejores trucos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-11-2006
Avatar de casacham
casacham casacham is offline
Miembro
 
Registrado: abr 2006
Ubicación: Cordoba->Argentina. Arboleas->Almeria->España
Posts: 184
Poder: 18
casacham Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 30-11-2006
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 30-11-2006
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 30-11-2006
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
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)
Responder Con Cita
  #5  
Antiguo 01-12-2006
Avatar de casacham
casacham casacham is offline
Miembro
 
Registrado: abr 2006
Ubicación: Cordoba->Argentina. Arboleas->Almeria->España
Posts: 184
Poder: 18
casacham Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 04-01-2007
vinicc vinicc is offline
Miembro
 
Registrado: ago 2006
Posts: 31
Poder: 0
vinicc Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 09-01-2007
wsilvius wsilvius is offline
Registrado
 
Registrado: ago 2003
Posts: 9
Poder: 0
wsilvius Va por buen camino
Excelentísmo aporte, le agradezco sobremanera su investigación al respecto, lo pondré en práctica en el acto..!
Responder Con Cita
  #8  
Antiguo 09-01-2007
wsilvius wsilvius is offline
Registrado
 
Registrado: ago 2003
Posts: 9
Poder: 0
wsilvius Va por buen camino
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.
Responder Con Cita
  #9  
Antiguo 11-01-2007
suseLinux suseLinux is offline
Miembro
 
Registrado: dic 2006
Posts: 18
Poder: 0
suseLinux Va por buen camino
BAKANISIMO.... POR deje eso de crear el evento por cada control.... TE PASASTE HERMANO...!!!

muy buen aporte
Responder Con Cita
  #10  
Antiguo 11-01-2007
suseLinux suseLinux is offline
Miembro
 
Registrado: dic 2006
Posts: 18
Poder: 0
suseLinux Va por buen camino
BAKANISIMO.... POR deje eso de crear el evento por cada control.... TE PASASTE HERMANO...!!!

muy buen aporte
Responder Con Cita
  #11  
Antiguo 15-01-2007
Avatar de casacham
casacham casacham is offline
Miembro
 
Registrado: abr 2006
Ubicación: Cordoba->Argentina. Arboleas->Almeria->España
Posts: 184
Poder: 18
casacham Va por buen camino
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
Responder Con Cita
  #12  
Antiguo 21-02-2007
Avatar de nuk3zito
nuk3zito nuk3zito is offline
Miembro
 
Registrado: ago 2003
Ubicación: "Z" Land
Posts: 244
Poder: 21
nuk3zito Va por buen camino
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


Responder Con Cita
  #13  
Antiguo 21-02-2007
Avatar de nuk3zito
nuk3zito nuk3zito is offline
Miembro
 
Registrado: ago 2003
Ubicación: "Z" Land
Posts: 244
Poder: 21
nuk3zito Va por buen camino
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
Responder Con Cita
  #14  
Antiguo 21-04-2007
Avatar de casacham
casacham casacham is offline
Miembro
 
Registrado: abr 2006
Ubicación: Cordoba->Argentina. Arboleas->Almeria->España
Posts: 184
Poder: 18
casacham Va por buen camino
Definitivamente TWinControl No funciona, prove de todas maneras y no funciona
Responder Con Cita
  #15  
Antiguo 16-09-2007
karlosgaviria karlosgaviria is offline
Registrado
 
Registrado: sep 2007
Ubicación: medellin colombia
Posts: 2
Poder: 0
karlosgaviria Va por buen camino
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]
Responder Con Cita
  #16  
Antiguo 16-09-2007
karlosgaviria karlosgaviria is offline
Registrado
 
Registrado: sep 2007
Ubicación: medellin colombia
Posts: 2
Poder: 0
karlosgaviria Va por buen camino
TWinControl si funciona de esta manera:


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


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 10:24: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
Copyright 1996-2007 Club Delphi