PDA

Ver la Versión Completa : Abstraer eventos comunes a varios objetos (forms, dbgrids, etc)


arieliten
23-06-2007, 00:38:07
Hola amigos del foro. Recurro a ustedes para que me orienten a resolver el problema que tengo a la hora de tratar de modularizar o abstraer métodos (procedures) comunes.
En mi aplicación se me ha presentado el caso donde tengo en varios forms una grilla (DBGrid) asociada a un dataset y el cual al hacerle click en el título ordeno la grilla (dataSet) por el campo clickeado.
Como este método siempre es igual, lo que yo quiero hacer es hacerlo una sola vez y luego en cada grilla que quiera que tenga este evento, asignarle al evento 'OnTitleClick' el método genérico mío.

Pero no sé dónde ubicar este método o donde definirlo para que lo pueda ver desde cualquier Form y poder asignarlo a cualquier DBGrid.

De más está decir que la definición de mi método es exactamente igual (tiene la misma estructura de parámetros) a la que te define solo Delphi al hacerle doble click al evento 'OnTitleClick'.

He probado a definir este método en una Unit global que uso para almacenar métodos, funciones y variables globales o comunes a toda mi aplicación; pero no hay caso :confused:. Desde los otros forms no me permiten asignar este método desde el Object Inspector de una DBGrid cualquiera.

Donde debo definirlo entonces??

Creo que este problema es bastante común y puede presentarse en cualquier caso (métodos comunes a todos los 'OnShow' de un Form por ejemplo, etc, etc).

Espero me puedan orientar un poco. Desde ya muchas gracias.
Saludos,

Ariel

roman
23-06-2007, 01:04:35
Quizá lo más adecuado sería derivar una nueva componente a partir del DBGrid y redefinir su método TitleClick:


type
TExtendedDBGrid = class(TDBGrid)
protected
procedure TitleClick(Column: TColumn); override;
end;

implementation

procedure TExtendedDBGrid .TitleClick(Column: TColumn);
begin
// .. aquí pones tu código genérico
end;


Pero tiene el "inconveniente" de tener que instalar la nueva componente si es que quieres usarla desde la paleta de componentes.

Otra opción, muy sencilla, es hacer uso de un frame (File|New|Frame) en donde colocas un DBGrid y programas su evento OnTitleClick como ya sabes. Luego, basta que insertes el frame en cualquier formulario donde lo necesites.

Y una tercera opción que se me ocurre, para estar acorde con tu unidad global, es usar una clase de eventos:


type
TGlobalEvents = class
public
class procedure TitleClick(Column: TColumn);
end;

implementation

{ TGlobalEvents }

class procedure TGlobalEvents.TitleClick(Column: TColumn);
begin
// .. aquí pones tu código genérico
end;


Lo único malo con esto, es que no puedes asignar el evento desde el inspector de objetos, pero puedes hacerlo por código:


DBGrid1.OnTitleClick := TGlobalEvents.TitleClick;


Nota que no es necesario crear una clase de tipo TGlobalEvents; basta usar la clase en sí.

// Saludos

arieliten
25-06-2007, 05:24:47
Hola Roman, muchas gracias por tu pronta respuesta.
La verdad que me ha sido de gran utilidad y he usado la tercer opción que mencionas para mantener la estructura que vengo desarrollando.
Muchas gracias nuevamente.
Saludos,

Ariel