PDA

Ver la Versión Completa : Evento con valores de retorno...


craven
09-06-2003, 18:29:53
Hola de nuevo a todos. Quisiera saber cómo puedo lanzar un evento proporcionando al que lo capture un determinado valor. Es decir, supongamos que el evento se lanza cuando una propiedad de una determinada clase creada por mi mismo tome un cierto valor. Al lanzarse el evento, me gustaria proporcinar dicho valor de forma automática a quien decida capturarlo. Todo esto es un estilo a los eventos del ratón que proporcionan los valores X, Y de la posición, el botón pulsado y si el estado del Shift. Gracias de antemano. Un saludo a todos.

Bacterion
09-06-2003, 18:53:52
A ver si esto te vale:

Defines el tipo de evento que necesitas (ejemplo, todo parecido con la realidad es algo, no me acuerdo)

TMiEventoDeLaMuerte = procedure (Sender: TObject; const ValorQueTeDoy Integer; var ValorQueTeDejoModificar Integer);

Defines la propiedad en tu objeto para que los demás enganchen el evento (como pasa con el onclik)

TMiObjetoTerrible = (partes omitidas para proteger a Sadam)
private
FOnCambioEnorme: TMiEventoDeLaMuerte;
public
property OnCambioEnorme: TMiEventoDeLaMuerte read FOnCambioEnorme write FOnCambioEnorme;
end;

Y solo queda que en el método que hace de set de tu propiedad haga algo parecido a :

procedure TMiObjetoTerrible.SetMiPropiedadMutante(Value: Integer);
var
NuevoValor: Integer;
begin
NuevoValor := Value;
if Assigned(OnCambioEnorme) then
OnCambioEnorme(Self, Value, NuevoValor);
FMiPropiedadMutante := NuevoValor;
// por ejemplo. Esto lo que hace es dejar al que recibe el evento que pueda cambiar el valor (un poner que dicen por ahí)
end;

craven
09-06-2003, 21:41:26
Ante todo, gracias... Pero, si creo un objeto del tipo TMiObjetoTerrible, ¿cómo capturo el evento? Gracias.

andres1569
10-06-2003, 00:06:00
El componente TMyObjetoTerrible no tiene que interceptar el evento, sino solamente lanzarlo cuando lo estime conveniente.

En el ejemplo que te ofrece Bacterion se lanza al cambiar la propiedad, es decir, dentro del método SetMiPropiedadMutante, y si te fijas primero se comprueba que FOnCambioEnorme (el evento en sí) esté asignado por el usuario, si es nil no se dispara tal evento.

craven
10-06-2003, 01:24:19
No quiero que sea el componente quien intercepte el evento, sino el padre de dicho componente... ¿Cómo lo hago?

delphi.com.ar
10-06-2003, 01:46:02
interface

type
TMiEventoDeLaMuerte = procedure (Sender: TObject; const ValorQueTeDoy Integer; var ValorQueTeDejoModificar Integer) of object;

TMiObjetoTerrible = class
private
FOnCambioEnorme: TMiEventoDeLaMuerte;
public
property OnCambioEnorme: TMiEventoDeLaMuerte read FOnCambioEnorme write FOnCambioEnorme;
end;

TPadre = class(TComponent)
private
FMiObjetoTerrible : TMiObjetoTerrible;
procedure MiObjetoTerribleEvento(Sender: TObject; const ValorQueTeDoy : Integer; var ValorQueTeDejoModificar : Integer);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;

implementation

constructor TPadre.Create(AOwner: TComponent);
begin
inherited;
FMiObjetoTerrible := TMiObjetoTerrible.Create;
FMiObjetoTerrible.OnCambioEnorme := MiObjetoTerribleEvento;
end;

destructor TPadre.Destroy;
begin
FMiObjetoTerrible.Free;
inherited;
end;

procedure TPadre.MiObjetoTerribleEvento(Sender: TObject;
const ValorQueTeDoy: Integer; var ValorQueTeDejoModificar: Integer);
begin
// Aquí accedo al evento!!
end;