Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-01-2005
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
Funciones comunes a varios Forms

Hola Amigos !

Quiero utilizar algunas funciones de las que hago uso a lo largo de todo el programa sin tener que definirlas en cada uno de los Forms que las utiliza.

Por ejemplo, tengo una función que me cambia el color de edición de un DBEdit cada vez que le doy enfoque :

Código Delphi [-]
procedure TMain.GetFocus(Sender: TObject);
begin
  ActiveControl.Color      := clWindow;
  ActiveControl.Font.Color := clMaroon;
end;
Cual es la mejor manera de hacerlo ? Gracias.
Responder Con Cita
  #2  
Antiguo 05-01-2005
jymy788 jymy788 is offline
Miembro
 
Registrado: jun 2004
Posts: 120
Poder: 20
jymy788 Va por buen camino
hay varias formas de hacer esto, pero la más sencilla, para mi gusto, es crearte una unidad, sin formulario, donde te definas estas funciones, y lo único que tendrás que hacer es incluir en tus formularios, en las uses, la unidad (.pas) donde te hayas definido esas funciones.

Espero haberte solucionado las dudas.

Un saludo
Responder Con Cita
  #3  
Antiguo 05-01-2005
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
Gracias,
Así pensaba yo también. Pero mi duda adicional es cómo implemento las funciones? Cómo las defino en el apartado "interface" ?

Tengo que incluir en esa nueva Unit todas las "uses" a las que hace referencia la función que voy a definir?
Responder Con Cita
  #4  
Antiguo 05-01-2005
jymy788 jymy788 is offline
Miembro
 
Registrado: jun 2004
Posts: 120
Poder: 20
jymy788 Va por buen camino
Wink

tu solito te has contestado, jejeje
Responder Con Cita
  #5  
Antiguo 05-01-2005
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
Gracias, voy a intentarlo !
Responder Con Cita
  #6  
Antiguo 05-01-2005
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
Una última ayudita, por favor.

He creado este código en una nueva Unit.pas :
Código Delphi [-]
unit GeneralFunctions;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, System.ComponentModel, Borland.Vcl.Grids, Borland.Vcl.DBGrids,
  Borland.Vcl.ExtCtrls, Borland.Vcl.StdCtrls, Borland.Vcl.Mask,
  Borland.Vcl.DBCtrls;
implementation
procedure GetFocus2(Sender: TObject);
begin
  (Sender as TWinControl).Color      := clWindow;
  (Sender as TWinControl).Font.Color := clMaroon;
end;
procedure LoseFocus2(Sender: TObject);
begin
   (Sender as TWinControl).Color      := cl3DLight;
   (Sender as TWinControl).Font.Color := clNavy;
end;
end.
En uno de los forms añado "uses GeneralFunctions". Pero no me permite hacer llamadas a las funciones definidas en GeneralFunctions.pas

Algo debo de estar haciendo mal en la implementación de las funciones a la unit adicional, no?

Gracias de nuevo.
Responder Con Cita
  #7  
Antiguo 05-01-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Tienes que declarar las funciones en la sección interface:


Código Delphi [-]
unit GeneralFunctions;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, System.ComponentModel, Borland.Vcl.Grids, Borland.Vcl.DBGrids,
  Borland.Vcl.ExtCtrls, Borland.Vcl.StdCtrls, Borland.Vcl.Mask,
  Borland.Vcl.DBCtrls;

procedure GetFocus2(Sender: TObject);
procedure LoseFocus2(Sender: TObject);

implementation

procedure GetFocus2(Sender: TObject);
begin
  (Sender as TWinControl).Color      := clWindow;
  (Sender as TWinControl).Font.Color := clMaroon;
end;

procedure LoseFocus2(Sender: TObject);
begin
   (Sender as TWinControl).Color      := cl3DLight;
   (Sender as TWinControl).Font.Color := clNavy;
end;

end.

// Saludos
Responder Con Cita
  #8  
Antiguo 05-01-2005
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
Hasta aquí todo perfecto, muchas gracias.

Puedo llamar desde un form cualquiera a la función GeneralFunctions.GetFocus2, pero una última pregunta : Puedo directamente en un "evento" poner la función de la unit GeneralFunctions ?

Por ejemplo, en uno de los forms dentro del evento "OnEnter" de un DBEdit, podría poner directamente GeneralFunctions.GetFocus2?. Esto no me funciona. Me parece una lata si tuviera que seguir llamando en un evento "OnEnter" de un DBEdit a una función de ese form que a su vez llame a la función que está contenida en el unit común.

Saludos.
Responder Con Cita
  #9  
Antiguo 05-01-2005
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Por supuesto que puedes llamar a esa función desde un evento. Sino te funciona nos tendrás que mostrar el código y el error que te da pra poderte ayudar.


Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #10  
Antiguo 06-01-2005
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
No es que me dé ningún error.

En el programa que quiero que llame a esas funciones he declarado :
Código Delphi [-]
implementation
 
uses MastDataModule, GeneralFunctions;
 
{$R *.nfm}
 
....
Las funciones en "GeneralFunctions.pas" están declaradas como se indica más arriba en este hilo.

Cuando voy a asignar un evento en el programa principal, sólo me aparecen las funciones declaradas en ese mismo form, y no las que hemos definido en "GeneralFunctions.pas". Por lo tanto tampoco las puedo elegir. Si fuerzo la situación y escribo manualmente en el evento (en este caso el evento OnEnter de un DBEdit) "GeneralFunctions.GetFocus2", entonces sí me sale el error : "'GeneralFunctions.GetFocus2' is not a valid identifier"

Gracias de nuevo por vuestra ayuda. ... y espero que los Reyes os hayan traido cosas bonitas a todos !!
Responder Con Cita
  #11  
Antiguo 06-01-2005
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡Buen día a todos!

Hola Gluglu.

La solución que se ha planteado es válida y ciertamente, como lo comentas, tendrías que llamar a la función GetFocus2 desde cada manejador de evento «GetFocus»/Enter (evento OnEnter).

Antes de continuar, hago un paréntesis para precisar que no siempre es necesaria la calificación de una función. Es decir, puedes escribir simplemente «GetFocus2» en lugar de «GeneralFunctions.GetFocus2».

Ahora, entiendo que la solución propuesta no satisface por completo tu necesidad de ahorro de código. Existen otras dos alternativas que puedes implementar:

1. Usar una plantilla de forma.
2. Crear un componente derivado de TDBEdit.

En algunos casos, la opción 1 resulta la más práctica. Consiste en crear una forma padre con los manejadores de eventos que comunmente se requieren (y el código necesario dentro de ellos). Una vez que la forma pertenece al proyecto, puedes crear tantas formas derivadas (clases hijas) de ella como desees; y con el inspector de objetos puedes enlazar eventos de sus componentes a los manejadores de eventos de la clase padre. De esta manera centralizas en la unidad de la forma padre (la plantilla) el código que es común para varios componentes de las formas derivadas.

La opción 2 se recomienda cuando deseas que un componente tenga una característica específica y bien definida. En este caso, buscas que los TDBEdit cambien de color al ser enfocados. Afortunadamente TDBEdit y todas las demás clases derivadas de TWinControl cuentan con un método virtual llamado DoEnter. Puedes crear una nueva clase de componente, derivada de TDBEdit, que redefina (Override) el método DoEnter para incluir en esa redefinición (el nuevo DoEnter) sentencias que cambien el color del control.

Personalmente, optaría por la opción 2 si ya tengo identificados los tipos de componentes que deben cambiar de color. Usaría la opción 1, cuando el cambio de color pueda darse sobre una amplia variedad de controles o de clases no claramente identificadas.

Espero esto sea de utilidad, seguimos en contacto.

Al González .
Responder Con Cita
Respuesta



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 17:56:40.


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