Accès au jour, au mois et à l'année

De RAD Studio
Aller à : navigation, rechercher

Remonter à Suivi de la date


Une date encodée numériquement est adaptée aux applications, mais l'utilisateur préférera manipuler jour, mois et année. En créant des propriétés, vous offrez un accès aux dates stockées et encodées numériquement.

Les éléments d'une date (jour, mois, année) sont des entiers. La modification de chacun d'entre eux nécessite l'encodage de la date. Vous pouvez éviter la duplication du code en partageant les méthodes d'implémentation entre les trois propriétés. Autrement dit, vous pouvez écrire deux méthodes, l'une pour lire un élément et l'autre pour l'écrire, et utiliser ces méthodes pour lire et écrire les trois propriétés.

Pour fournir un accès lors de la conception aux éléments jour, mois et année, procédez de la façon suivante :

  1. Déclarez les trois propriétés, en attribuant à chacune un numéro unique d'index
    :
    type
      TSampleCalendar = class(TCustomGrid)
      public
        property Day: Integer index 3 read GetDateElement write SetDateElement;
        property Month: Integer index 2 read GetDateElement write SetDateElement;
        property Year: Integer index 1 read GetDateElement write SetDateElement;
        // …
    
    class PACKAGE TSampleCalendar : public TCustomGrid
    {
        // …
    public:
        __property int Day = {read=GetDateElement, write=SetDateElement, index=3,
          nodefault};
        __property int Month = {read=GetDateElement, write=SetDateElement, index=2,       nodefault};
        __property int Year = {read=GetDateElement, write=SetDateElement, index=1,       nodefault};
    };
    
  2. Déclarez et écrivez les méthodes d'implémentation, définissant les différents éléments pour chaque valeur d'index
    :
    type
      TSampleCalendar = class(TCustomGrid)
      private
        function GetDateElement(Index: Integer): Integer;         { note the Index parameter }
        procedure SetDateElement(Index: Integer; Value: Integer);
        // …
    function TSampleCalendar.GetDateElement(Index: Integer): Integer;
    var
      AYear, AMonth, ADay: Word;
    begin
      DecodeDate(FDate, AYear, AMonth, ADay);             { break encoded date into elements }
      case Index of
        1: Result := AYear;
        2: Result := AMonth;
        3: Result := ADay;
        else Result := -1;
      end;
    end;
    procedure TSampleCalendar.SetDateElement(Index: Integer; Value: Integer);
    var
      AYear, AMonth, ADay: Word;
    begin
      if Value > 0 then                                      { all elements must be positive }
      begin
        DecodeDate(FDate, AYear, AMonth, ADay);                  { get current date elements }
        case Index of                                   { set new element depending on Index }
          1: AYear := Value;
          2: AMonth := Value;
          3: ADay := Value;
          else Exit;
        end;
        FDate := EncodeDate(AYear, AMonth, ADay);                 { encode the modified date }
        Refresh;                                               { update the visible calendar }
      end;
    end;
    
    // header file
    class PACKAGE TSampleCalendar : public TCustomGrid
    {
    private:
        int __fastcall GetDateElement(int Index);           // note the Index parameter
        void __fastcall SetDateElement(int Index, int Value);
        // …
     };
    
    // implementation file
    int __fastcall TSampleCalendar::GetDateElement(int Index)
    {
      unsigned short AYear, AMonth, ADay;
      int result;
      FDate.DecodeDate(&AYear, &AMonth, &ADay);            // break encoded date into elements
      switch (Index)
      {
        case 1: result = AYear;  break;
        case 2: result = AMonth; break;
        case 3: result = ADay;   break;
        default: result = -1;
      }
      return result;
    }
    void __fastcall TSampleCalendar::SetDateElement(int Index, int Value)
    {
      unsigned short AYear, AMonth, ADay;
      if (Value > 0)                                   // all elements must be positive
      {
        FDate.DecodeDate(&AYear, &AMonth, &ADay);     // get current date elements
        switch (Index)
        {
          case 1: AYear = Value;     break;
          case 2: AMonth = Value;    break;
          case 3: ADay = Value;      break;
          default: return;
        }
      }
      FDate = TDateTime(AYear, AMonth, ADay);         // encode the modified date
      Refresh();                                      // update the visible calendar
    }
    

Vous pouvez maintenant définir le jour, le mois et l'année du calendrier lors de la conception à partir de l'inspecteur d'objets, ou à l'exécution à partir du code. Bien que vous n'ayez pas encore ajouté le code pour dessiner les dates dans les cellules, vous disposez maintenant de toutes les données nécessaires.

Voir aussi