Property et fonction

Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 - 31 mars 2009 à 13:22
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 - 3 avril 2009 à 00:45
Bonjour ,

j'ai un petit problème avec les property , je m'explique :


1°) Exemple qui fonctionne (normal d'ailleurs )

type
TMyObject = class (TQqCh)

private
procedure SetMyVar ( AValue : single);
function GetMyVar : single;

public

property MyVar : single read GetMyVar write SetMyVar ;

.... (le reste n'est pas obligatoire ... )


mon problème , c'est le suivant :

j'aimerais bien que ma procedure SetMyVar deviennent une fonction qui me retourne true quand ma variable est bien garnie et false quand il y a eu un problème

je recommence l'opération en faisant cette fois si :

2°) Mon problème

type
TMyObject = class (TQqCh)

private
// je transforme bêtement ma procedure en fonction ...
function SetMyVar ( AValue : single):boolean;
function GetMyVar : single;

public

property MyVar : single read GetMyVar write SetMyVar ;

.... (le reste n'est pas obligatoire ... )


et ça ne compile pas ,
erreur : [Erreur] Types incompatibles

pourtant j'utilise toujours le type single dans mon SetMyVar

comment faut-il faire ? ou je m'y prends mal ?

[ Forcement ,j'aimerais faire de même avec function GetMyVar : single
mais la ça va encore poser plus de problème , vu que si je mets boolean comme type de retour , là il y aura types incompatibles ! ]


Merci

bonne journée

6 réponses

Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
31 mars 2009 à 13:26
pardon , j'ai oublié de préciser (c'est peut-être important )
je suis sous D7
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
31 mars 2009 à 14:32
type  

   TMyObject = class (TQqCh)

  
private

     FMyVar : single;
     FMyVarCheck : boolean;
     procedure SetMyVar(Value : single);

     function GetMyVar: single;

  
public

    
property MyVar : single read GetMyVar write SetMyVar;

     property MyVarCheck: boolean read FMyVarCheck;
   public
     constructor Create; override;
  
end;

constructor TMyObject.Create;
begin
  inherited Create;
  { ... }
  FMyVar := 0;
  FMyVarCheck := false;
end;

procedure TMyObject.SetMyVar(Value: single);
begin
  FMyVarCheck := false;
  if Value <> FMyVar then
  begin
    FMyVar := Value;
    FMyVarCheck := true;
  end;
end;

function TMyObject.GetMyVar: single;
begin
  result := FMyVar;
end;


<hr size="2" width="100%" />
0
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
31 mars 2009 à 15:01
Merci ok ,

donc pour tester dans le code je ferais quelque chose du genre

var
MyObject : TMyObject ;

...
MyObject := TMyObject.Create;
MyObject.MyVar := 0.25;
// on teste maintenant pour voir si la valeur a bien été affectée
if not MyObject.MyVarCheck then begin
MessageBox( blablablablabla ) ;
halt;
end;


C'est un peu fastidieux comme technique , non ?

Vaut-il mieux laisser les tomber les property dans ce cas là et garder les bon vieux gettors/settors
// bien sur dans ce cas ci , SetMyVar est une fonction avec boolean comme type //de retour ;)

if not MyObject.SetMyVar(0.25) then begin
MessageBox( blablablablabla ) ;
halt;
end;

Qui est quand même , a mes yeux , plus propre !

Surtout que j'ai une pelleté de trucs comme ca.

j'aimerais avoir ton avis , si tu veux bien ;)

(Sinon ta solution réponds bien à ma demande )
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
31 mars 2009 à 19:08
Non impossible, un setter est toujours une procédure, avec comme paramètre une variable du type de la propriété et eventuellement un ou plusieurs index.
Ce que tu peux faire, c'est une propriété "LastError" (dernière erreur), que l'utilisateur pourra vérifier après chaque appel à des getter/setter, qui eux changeront la valeur de LastError selon la réussite ou l'échec de leur opération. Un peu à la manière des API et de GetLastError, ça me semble la solution la plus propre ?

Cordialement, Bacterius !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
31 mars 2009 à 19:38
TMyObject = class(TObject);
private
  fMyVar : single;
public
  function SetMyVar(const Value : single): boolean;
end;

function TMyObject.SetMyVar(const Value: single): boolean;
begin
  result := Value <> fMyVar;
  if result then
    fMyVar := Value;
end;

<hr size="2" width="100%" />
0
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
3 avril 2009 à 00:45
bonsoir ,
désolé de la lenteur de ma réponse
la solution de bacterius est interressante mais ce n'est pas ce que je recherche ...

@foxi : pourrais tu expliquer le fonctionnement de cette fonction , j'avoue ne pas bien comprendre

et est que que la solution de générer une Exception est bonne ou pas ?
 (il y a t-il moyen en Delphi de propager une erreur ? )
0
Rejoignez-nous