Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Evento con valores de retorno... (https://www.clubdelphi.com/foros/showthread.php?t=1261)

craven 09-06-2003 18:29:53

Evento con valores de retorno...
 
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

Código:

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;



La franja horaria es GMT +2. Ahora son las 03:06:02.

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