Auf den Tag, den Monat und das Jahr zugreifen

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Das Datum festlegen


Das codierte Datum ist zwar für den internen Gebrauch sehr nützlich, der Anwender arbeitet aber lieber mit den üblichen Tages-, Monats- und Jahresangaben. Indem Sie Eigenschaften erzeugen, ermöglichen Sie einen alternativen Zugriff auf die codiert gespeicherten Datumswerte.

Da jedes Datumselement (Tag, Monat und Jahr) ein Integer ist und jede Zuweisung die Umwandlung des codierten Datums erfordert, wäre es sinnvoll, die entsprechenden Methoden für alle drei Eigenschaften gemeinsam zu implementieren. Sie schreiben also jeweils zwei Methoden, eine zum Lesen und eine zum Schreiben. Diese Methoden verwenden Sie dann, um die Werte aller drei Eigenschaften abzurufen bzw. zu setzen.

Gehen Sie folgendermaßen vor, um zur Entwurfszeit den Zugriff auf den Tag, den Monat und das Jahr zu ermöglichen:

  1. Deklarieren Sie drei Eigenschaften, und weisen Sie jeder für index eine Nummer zu:
    Delphi:
    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;
        // …
    
    C++:
    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. Deklarieren und schreiben Sie die Implementierungsmethoden. Weisen Sie dabei je nach Index ein bestimmtes Element zu:
    Delphi:
    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;
    
    C++:
    // 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
    }
    

Der Tag, der Monat und das Jahr können nun sowohl zur Entwurfszeit mithilfe des Objektinspektors als auch zur Laufzeit durch entsprechenden Quelltext festgelegt werden. Zwar existiert immer noch kein Quelltext zur Darstellung der Datumswerte in den Zellen, über die benötigten Daten verfügen Sie jedoch bereits.

Siehe auch