表示: Delphi C++
表示設定

年,月,日へのアクセス

提供:RAD Studio XE2
移動: 案内, 検索

グリッドのカスタマイズ:インデックス への移動

コード化された数値はプログラムにとっては扱いやすいものですが,人間が操作しやすいのは年,月,日の個別の値です。そこで,コード化された日付の各要素へアクセスするためのプロパティを作成します。

日付の各要素(年,月,日)はすべて整数であり,またどの要素も設定や取得にはコード化された日付との変換が必要です。そこで,3 つのプロパティに共通の実装メソッドを指定して,コードの重複を回避します。つまり,要素を読み出すメソッドと要素を書き込むメソッドの 2 つのメソッドを記述するだけで,3 つのプロパティの取得と設定を実現します。

設計時に年,月,日へアクセスできるようにする手順は次のとおりです。

  1. 3 つのプロパティを宣言し,それぞれに一意のインデックス番号を割り当てます。
 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};
 };
  1. 実装メソッドを宣言して記述し,各インデックス値に対応する要素を設定します。
 type
   TSampleCalendar = class(TCustomGrid)
   private
     function GetDateElement(Index: Integer): Integer;         { Index パラメータに注意 }
     procedure SetDateElement(Index: Integer; Value: Integer);
   .
   .
   .
 function TSampleCalendar.GetDateElement(Index: Integer): Integer;
 var
   AYear, AMonth, ADay: Word;
 begin
   DecodeDate(FDate, AYear, AMonth, ADay);             { コード化された日付から要素を抽出 }
   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                                      { 要素はすべて正の値でなくてはならない }
   begin
     DecodeDate(FDate, AYear, AMonth, ADay);                  { 現在の日付要素を取得 }
     case Index of                                   { Index に基づいて新しい要素を設定 }
       1: AYear := Value;
       2: AMonth := Value;
       3: ADay := Value;
       else Exit;
     end;
     FDate := EncodeDate(AYear, AMonth, ADay);                 { 変更された日付をコード化 }
     Refresh;                                               { カレンダーの表示を更新 }
   end;
 end;
 // ヘッダーファイル
 class PACKAGE TSampleCalendar : public TCustomGrid
 {
 private:
     int __fastcall GetDateElement(int Index);           // Index パラメータに注意
     void __fastcall SetDateElement(int Index, int Value);
     .
     .
     .
 };
 // 実装ファイル
 int __fastcall TSampleCalendar::GetDateElement(int Index)
 {
   unsigned short AYear, AMonth, ADay;
   int result;
   FDate.DecodeDate(&AYear, &AMonth, &ADay);            // コード化された日付から要素を抽出
   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)                                   // 要素はすべて正の値でなくてはならない
   {
     FDate.DecodeDate(&AYear, &AMonth, &ADay);     // 現在の日付要素を取得
     switch (Index)
     {
       case 1: AYear = Value;     break;
       case 2: AMonth = Value;    break;
       case 3: ADay = Value;      break;
       default: return;
     }
   }
   FDate = TDateTime(AYear, AMonth, ADay);         // 変更された日付をコード化
   Refresh();                                      // カレンダーの表示を更新
 }


これで,カレンダーの年,月,日を設定できるようになりました。年,月,日の設定は,設計時にオブジェクトインスペクタを使って行うか,実行時にコードで行います。セルに日付を描画するコードはまだ記述していませんが,必要なデータは揃いました。

以前のバージョン
他言語版