Surcharge d'operateur de classe et enregistrements (exemple TSplitedTime)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 943 fois - Téléchargée 6 fois

Contenu du snippet

voici un exemple concret de surcharge d'operateur dans un enregistrement (Delphi 2009)
cette surcharge permet :
convertir TDateTime vers TSplitedTime et inversement :
SplitedTime := Now;
DateTime := SplitedTime;
faire des comparaisons sur le type TSplitedTime :
if SplitedTimeA = SplitedTimeB then ...
if SplitedTimeA <> SplitedTimeB then ...
on peut bien sur aller plus loin en surchargeant d'autres operateurs, cela peut s'appliquer egalement aux classes.
on beneficie donc d'enregistrements puissants ne nécessitant plus d'appel a des fonctions de manipulation externe pour les actions les plus basiques.
cette methode tant attendue permet de reduire encore l'ecart entre delphi et c++ ce qui le rend plus RAD que jamais. 

type
  TSplitedTime = record
    {$IF RTLVersion >= 18.0}
    class operator Implicit(a: TSplitedTime): TDateTime;
    class operator Implicit(a: TDateTime): TSplitedTime;
    class operator Equal(a, b: TSplitedTime): Boolean;
    class operator NotEqual(a, b: TSplitedTime): Boolean;
    class operator GreaterThan(a, b: TSplitedTime) : boolean;
    class operator LessThan(a, b: TSplitedTime): Boolean;
    class operator GreaterThanOrEqual(a, b: TSplitedTime) : boolean;
    class operator LessThanOrEqual(a, b: TSplitedTime): Boolean;
    {$IFEND}
    case integer of
      0: (Hours, Minutes, Seconds, MilliSeconds : word);
      1: (HMSZ : UInt64);
  end;
{$IF RTLVersion >= 18.0}
class operator TSplitedTime.Implicit(a: TSplitedTime): TDateTime;
begin
  result := EncodeTime(A.Hours, A.Minutes, A.Seconds, A.MilliSeconds);
end;
class operator TSplitedTime.Implicit(a: TDateTime): TSplitedTime;
begin
  DecodeTime(a, result.Hours, result.Minutes, result.Seconds, result.MilliSeconds);
end;
class operator TSplitedTime.Equal(a, b: TSplitedTime): Boolean;
begin
  result := a.HMSZ = b.HMSZ;
end;
class operator TSplitedTime.NotEqual(a, b: TSplitedTime): Boolean;
begin
  result := a.HMSZ <> b.HMSZ;
end;
class operator TSplitedTime.GreaterThan(a, b: TSplitedTime) : Boolean;
begin
  result := a.HMSZ > b.HMSZ;
end;
class operator TSplitedTime.LessThan(a, b: TSplitedTime): boolean;
begin
  result := a.HMSZ < b.HMSZ;
end;
class operator TSplitedTime.GreaterThanOrEqual(a, b: TSplitedTime) : Boolean;
begin
  result := A.HMSZ >= B.HMSZ;
end;
class operator TSplitedTime.LessThanOrEqual(a, b: TSplitedTime): boolean;
begin
  result := A.HMSZ <= B.HMSZ;
end;
{$IFEND}


Compatibilité : Delphi 5

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.