Setter + heritage + evenement

[Résolu]
Signaler
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
-
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
-
Salut a tous,
j'ai une question un peu complexe melangeant propriete, heritage et evenements.
Voila en gros ce que je voudrai faire :

type
    TMonEvent = procedure( var MaValeur: integer) of object;

    TPere = class
    protected
       procedure SetVal(const Value: integer); virtual;
    public
       property OnEvent: TMonEvent ... ;
       property Val: integer read FVal write SetVal;
    end;

    TFils = class
    protected
       procedure SetVal(const Value: integer); override;

    end;

implementation

procedure TPere.SetVal(const Value: integer);
begin
    if Assigned(OnEvent) then
        OnEvent(Value); // (oui oui, je sais que value est const, c'est juste pour l'exemple)
    //ici, Value peut etre modifie par l'evenement
    ...
end;

procedure TFils.SetVal(const Value: integer);

begin
    inherited SetVal(Value);

    //ici, je voudrai pouvoir recuperer la valeur eventuellement modifiée dans l'evenement de la procedure de TPere
    ...

end;

à vos aspirines ...

4 réponses

Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
7
heu je crois qu'on s'est mal compris foxi !!!

ma fonction SetVal est le setter d'une property ... donc impossible de lui donner un parametre var !

et c'est gentil mais je connais quand meme la difference entre const et var (et meme out !)

j'ai resolu le probleme en faisant une fonction intermediaire, mais j'aimerai quand meme trouver une autre solution car ca me semble pas tres propre. j'ai fait ainsi :

type
    TChangeEvent = procedure( var Val: integer) of object;

    TPadre = class
    protected
       procedure SetPropriedad(const Value: integer); virtual; abstract;
       procedure TrySetPropriedad(const Value: integer);
       function GetPropriedad: integer; virtual; abstract;
    public
       property Propriedad: integer read GetPropriedad write TrySetPropriedad;
       property OnChange: TChangeEvent ...;
    end;

    THijo = class(TPadre)
    protected

       procedure SetPropriedad(const Value: integer); override;
       function GetPropriedad: integer; override;
    end;

procedure TPadre.TrySetPropriedad(const Value: integer);
var
    v: integer;
begin
    v := Value;
    OnChange(v); // modif eventuelle de v
    SetPropriedad(v); // appel de la fonction heritee avec la nouvelle valeur
end;

procedure THijo.SetPropriedad(const Value: integer);
begin
    //La value a ete modifiee par le TrySetPropriedad
end;
...

si tu as une autre idée (ou quelqun d'autre) ...
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
type
  TPapa = class(TObject)
  public
    procedure TestA(var V : integer); virtual;
    function TestB(const V : integer) : integer; virtual;
  end;

  TFiston = class(TPapa)
  public
    procedure TestA(var V : integer); override;
    function TestB(const V : integer) : integer; override;
  end;

{ TPapa }

procedure TPapa.TestA(var V: integer);
begin
  V := not V;
end;

function TPapa.TestB(const V: integer): integer;
begin
  result := not V;
end;

{ TFiston }

procedure TFiston.TestA(var V: integer);
var VOld : integer;
begin
  VOld := V;
  inherited TestA(V);
  MessageDlg(format('TESTA : Ancienne : %.8x // Nouvelle :%.8x',[VOld, V]),mtInformation,[mbOk],0);
end;

function TFiston.TestB(const V: integer): integer;
var VNew : integer;
begin
  VNew := inherited TestB(V);
  MessageDlg(format('TEST B : Ancienne : %.8x // Nouvelle :%.8x',[V, VNew]),mtInformation,[mbOk],0);
end;
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
type
  TChangeEvent = procedure(Sender : TObject; var Val : integer) of object;

  TPere = class(TObject)
  private
     fVal : integer;
     fOnBeforeChange : TChangeEvent;
     procedure SetVal(Value : integer);
  protected
    function DoBeforeChange(const Value : integer) : integer; virtual;
    property OnBeforeChange : TChangeEvent read fOnBeforeChange write fOnBeforeChange;
  public
    property Value : integer read fVal write SetVal;
  end;

  TFils = class(TPere)
  private
    function DoBeforeChange(const Value : integer) : integer; override;
  public
    property OnBeforeChange;
  end;

{ TPere }

function TPere.DoBeforeChange(const Value : integer) : integer;
begin
  result := value;
  if Assigned(fOnBeforeChange) then
    fOnBeforeChange(self, result);
end;

procedure TPere.SetVal(Value: integer);
begin
  fVal := DoBeforeChange(Value);
end;

{ TFils }

function TFils.DoBeforeChange(const Value : integer) : integer;
begin
  result := inherited DoBeforeChange(Value);
end;
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
7
non plus

cette property ne lit pas un champ de l'objet pere, mais c'est un getter qui change selon la classe de l'objet fils.

c'est pas grave, je crois qu'il n'y a pas vraiment d'autre solution que celle que j'ai utilisé