Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-10-2004
athlontado athlontado is offline
Miembro
 
Registrado: sep 2004
Ubicación: Almázcara - León (España)
Posts: 63
Poder: 20
athlontado Va por buen camino
Método accesible desde varios controles en diferentes forms

Muy buenas.

Quisiera saber si hay alguna forma de crear un método que se pueda asignar a un evento (OnKeyPress, por ejemplo) de varios controles (TEdit, p.ej.) desperdigados por varios Formularios ó Units, ya sea creándolo en una clase para éste propósito ó como un método aislado (no sé si habré dicho alguna burrada que rompa con las reglas de la POO ).

Un saludo.
__________________
Óscar Salvador Páez
Aprendiendo a aprehender de quienes aprehenden, sin cerciorarse de sus edades, culturas, sexos, razas, creencias u orígenes, es la forma más sabia de aprehender.
Responder Con Cita
  #2  
Antiguo 27-10-2004
Avatar de defcon1_es
defcon1_es defcon1_es is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuenca - España
Posts: 533
Poder: 21
defcon1_es Va por buen camino
Hola, para esto hay 2 soluciones (o más, pero no se me ocurren )

1) Crear un descendiente de la clase del componente que quieres y sobreescribir el método en cuestión.
Código Delphi [-]
type
  tMiClaseHija = class(TClase_Padre);
  ...
  protected
  ...
    procedure DoClick; override; 
  ...
  end;
Esto implica que, si quieres asignar el mismo código al evento OnClick de objetos de distintas clases (TBitBtn y TButton), debes implementarlo en los descendientes que te crees de esas clases...
Y si tienes que modificar el código de ese evento, debes hacerlo en todas las clases descendientes que hayas creado.

2) Crear un evento "genérico" con argumentos compatibles con el evento que deseas asignar, p.ej.:
Código Delphi [-]
procedure Mi_Manejador_de_EventoClick(Sender: TObject);
begin
....
// Código que se ejecutará cuando invoque el evento.
....
end;
 
procedure TForm1.FormShow(Sender: TObject);
begin
....
  MiBoton.OnClick := Mi_Manejador_de_Evento;
....
end;
Esta 2ª opción sirve para objetos de distintas clases, p. ej., para un TBitBtn y un TButton (ambos tienen el evento OnClick con el mismo argumento).
Y si tienes que modificar el código de ese evento, lo haces en un sólo sitio.

Depende de tus necesidades

Salu2.
Responder Con Cita
  #3  
Antiguo 27-10-2004
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
Cita:
Empezado por defcon1_es
Código Delphi [-]
procedure TForm1.FormShow(Sender: TObject);
begin
....
  MiBoton.OnClick := Mi_Manejador_de_Evento;
....
end;
Aquí va a protestar el compilador. No puedes asignar un procedimiento regular a una propiedad de un objeto, sólo puedes asignarle métodos.

Lo que puede hacer en todo caso es:

Código Delphi [-]
type
TEventos = class
  class procedure EventoClick(Sender: TObject);
end;
 
...
 
MiBoton.OnClick := TEventos.EventoClick;

El uso de class procedure es para no tener que crear un objeto de la clase TEventos.

// Saludos
Responder Con Cita
  #4  
Antiguo 27-10-2004
athlontado athlontado is offline
Miembro
 
Registrado: sep 2004
Ubicación: Almázcara - León (España)
Posts: 63
Poder: 20
athlontado Va por buen camino
Gracias roman, eso es justo lo que necesitaba. Gracias también a defcon1_es por intentarlo, yo estaba parado justo donde roman nos corrigió.

Saludos.
__________________
Óscar Salvador Páez
Aprendiendo a aprehender de quienes aprehenden, sin cerciorarse de sus edades, culturas, sexos, razas, creencias u orígenes, es la forma más sabia de aprehender.
Responder Con Cita
  #5  
Antiguo 28-10-2004
Avatar de defcon1_es
defcon1_es defcon1_es is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuenca - España
Posts: 533
Poder: 21
defcon1_es Va por buen camino
Hola Roman,
se me olvidó mencionar que el procedure "genérico" es del TForm1.

Acabo de probar esto y el compilador no se queja... y funciona.

Código Delphi [-]
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
procedure Mi_Manejador_de_EventoClick(Sender: TObject);
end;
var
Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.FormShow(Sender: TObject);
begin
Button1.OnClick := Mi_Manejador_de_EventoClick;
end;
 
procedure TForm1.Mi_Manejador_de_EventoClick(Sender: TObject);
begin
ShowMessage('Hola');
end;
Responder Con Cita
  #6  
Antiguo 28-10-2004
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Si es de TForm1, entonces para referenciarlo sería algo así:
Código Delphi [-]
   Form2.button1.OnClick := Form1.Mi_Manejador_de_Evento;
Lo que implica que form1 deberá estar instanciado para poder acceder a ese método. Si form1 es la forma Principal de la aplicación, sin problemas; pero si no lo es, empiezan los problemas.

Saludos
Responder Con Cita
  #7  
Antiguo 28-10-2004
Avatar de ruina
ruina ruina is offline
Miembro
 
Registrado: jun 2004
Posts: 196
Poder: 20
ruina Va por buen camino
una vuelta mas de tuerca:

dado que lo único que necesitamos para asignar el evento es que le pasemos un "procedure of object" esto es, un método de un objeto en lugar de una función clásica, podemos hacer una clase dummy (que no haga nada) y para ahorrarnos la creación destrucción etc, hacer que el método sea un método de clase:

Código Delphi [-]
  Tdummy = class
      class procedure MiEventoClick(sender:tobject);
  end;

no pongo private ni public ni na porque los métodos de clase siempre son publicos.
__________________
todo el mundo debe creer en algo... yo creo que voy a tomarme otra copa.
Responder Con Cita
  #8  
Antiguo 28-10-2004
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
Cita:
Empezado por def_con
Acabo de probar esto y el compilador no se queja... y funciona
Claro, una vez corregido

Cita:
Empezado por ruina
Código Delphi [-]
Tdummy = class
  class procedure MiEventoClick(Sender: tObject);
end;
¿Qué no es lo mismo que puse arriba?

Cita:
Empezado por roman
Código Delphi [-]
TEventos = class
  class procedure EventoClick(Sender: tObject);
end;
Cita:
Empezado por ruina
no pongo private ni public ni na porque los métodos de clase siempre son publicos
Esto no es cierto. Los métodos de clase, como cualquier otro método pueden ser privados, públicos o protegidos.

// Saludos
Responder Con Cita
  #9  
Antiguo 29-10-2004
Avatar de ruina
ruina ruina is offline
Miembro
 
Registrado: jun 2004
Posts: 196
Poder: 20
ruina Va por buen camino
!_! dios santo, estoy ciego!
xD

que desastre soy, supongo que tanto leer entre lineas me ha producido el efecto inverso, osea, leer menos de lo que dice.
Mil perdones.


y respecto a lo de los métodos de clase ... me has hecho dudar y todo, quizas en otros lenguajes tipo java deje hacerlo pero en delphi la visibilidad de los métodos de clase es public siempre.
ej.:
Código Delphi [-]
  tdummy  = class
  private
      class procedure feo(sender:tobject);
  end;

no solo no se queja el compilador, sino que se ejecuta sin problemas.
__________________
todo el mundo debe creer en algo... yo creo que voy a tomarme otra copa.
Responder Con Cita
  #10  
Antiguo 29-10-2004
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
Cita:
Empezado por ruina
y respecto a lo de los métodos de clase ... me has hecho dudar y todo, quizas en otros lenguajes tipo java deje hacerlo pero en delphi la visibilidad de los métodos de clase es public siempre.

Código Delphi [-]
tdummy = class
private
class procedure feo(sender:tobject);
end;

no solo no se queja el compilador, sino que se ejecuta sin problemas.
El compilador no tiene por qué quejarse de una declaración como ésta, pero el hecho es que no todos los métodos de clase son públicos. Si declaras un método de clase en la sección private sólo podrás acceder a él desde la misma unidad y si lo declaras en la sección protected sólo podrás acceder a él desde descendientes. Ante la duda que yo mismo tuve ayer lo probé y es como te digo.

// Saludos
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 21:50:06.


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