Ver Mensaje Individual
  #3  
Antiguo 29-01-2009
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Reputación: 25
Delphius Va camino a la fama
Hola noob,
Como dice Al, sería oportuno que nos dieras más detalle.
Formalmente un evento se hace aplicando punteros a métodos. Por ejemplo:

Código Delphi [-]
type
  TCambiaCadenaEvent = procedure (Cadena: string) of object;

Luego tu clase debe definir un atributo de dicho de evento:

Código Delphi [-]
TMiClase = class
...
  private
    FCadena: string; 
    FOnCambiaCadenaEvent: TCambiaCadenaEvent;
...
end;

Ahora viene lo interesante. Tenemos el tipo, más no cuando salta. Dices que se produce al cambiar una cadena. Formalmente, un método hace disparar el evento.

Pero he aquí que en realidad el evento está incompleto. Necesitamos darle una respuesta, en otro caso no debería suceder. Lo de esperar es que uno pueda implementar su rutina, pero tranquilamente uno puede definir un método que tenga la misma declaración que el tipo del evento como respuesta al mismo.

Supongamos que hacemos uso de propiedades para cambiar el texto de la cadena:
Código Delphi [-]
property Cadena: string read FCadena write SetCadena;

SetCadena es un método privado, y en el hacemos que se dispare el evento:

Código Delphi [-]
procedure TMiClase.SetCadena(Value: string);
begin
  if Value <> FCadena
     then  begin
               FCadena := Value;
               if Assigned(FOnCambiaCadenaEvent) // comprobamos que haya Rta
                  then FCambiaCadenaEvent(Value); // disparamos evento
             end;
end;

Ahora si estamos en condiciones de darte Rta al evento y asociarlo.

1) Disparará un método propio de la clase:

Para ello se necesita definir un método que tenga la misma declaración del puntero a método en la clase:

Código Delphi [-]
TMiClase = class
  private
  ...
  procedure EventoCambiarCadena(Cadena: string);
...

procedure TMiClase.EventoCambiarCadena(Cadena: string);
begin
  ShowMeesage(Cadena); // o lo que quieras que haga.
end;


Asociamos el evento a la clase, (tal vez en el constructor):

Código Delphi [-]
FOnCambiaCadenaEvent := EventoCambiarCadena;


2) Y como dije, lo normal es que la clase no sea la "dueña" de la respuesta. Por tanto el método formalmente se define fuera. Necesitamos asignarle el método de alguna manera. Por ejemplo, propiedades:

Código Delphi [-]
property OnCambiaCadenaEvent: TCambiaCadenaEvent read FOnCambiaCadenaEvent ....

Y en base a eso, podemos hacer esto:

Código Delphi [-]
MiClase.OnCambiaCadenaEvent := MiRutina;
MiClase.Cadena := 'Hola, mira como cambio';

En este caso,

La clase solita dispará el evento y aplicará las sentencias definidas en MiRutina.

MiRutina puede ser un método ajeno a la clase TMiClase, necesita ser un método, con la misma declaración más puede ser declarado en otro lado. Por ejemplo:

Código Delphi [-]
procedure TForm1.MiRutina(Cadena: string);
begin
  Label1.Caption := Cadena;
end;

En este caso, es un método definido en el Form1, y lo que hace es visualizar la cadena que cambió en un label.

Espero que se entienda,

Sugiero una leída al capítulo dedicado a los eventos del libro La Cara Oculta de Delphi 4.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita