C++ Builder 10.2 Tokyo > 派生クラス + オーバライド > TCalendarクラスを派生して、DrawCell()をオーバライドする

```txt:動作環境
RAD Studio 10.2 Tokyo Update 3 
```

### 概要

- TCalendarクラスを派生してDrawCell()をオーバライドできるようにする

### 関連

- [初期値の変更](http://docwiki.embarcadero.com/RADStudio/Rio/ja/%E5%88%9D%E6%9C%9F%E5%80%A4%E3%81%AE%E5%A4%89%E6%9B%B4)

コードは10.2 Tokyoではそのまま動かないため、こちらの環境に合わせて変更した。

### 実装

```CalendarUnit.h
//---------------------------------------------------------------------------

#ifndef CalendarUnitH
#define CalendarUnitH
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.Grids.hpp>
#include <Vcl.Samples.Calendar.hpp>
#include <Vcl.WinXCalendars.hpp>
//---------------------------------------------------------------------------

// 追加した派生クラス
class PACKAGE TSampleCalendar : public TCalendar
{
protected:
	virtual void __fastcall DrawCell(int ACol, int ARow, const TRect &Rect, TGridDrawState AState);
public:
	__fastcall TSampleCalendar(TComponent *Owner);
};
//---------------------------------------------------------------------------

class TFormCalendar : public TForm
{
__published:	// IDE で管理されるコンポーネント
private:	// ユーザー宣言
	TSampleCalendar *m_sampCal;
public:		// ユーザー宣言
	__fastcall TFormCalendar(TComponent* Owner);
	__fastcall ~TFormCalendar();
};

//---------------------------------------------------------------------------
extern PACKAGE TFormCalendar *FormCalendar;
//---------------------------------------------------------------------------
#endif
```

```CalendarUnit.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "CalendarUnit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFormCalendar *FormCalendar;
//---------------------------------------------------------------------------
__fastcall TFormCalendar::TFormCalendar(TComponent* Owner)
	: TForm(Owner)
{
	m_sampCal = new TSampleCalendar(this);
	m_sampCal->Name = L"SampleCalendar1";
	m_sampCal->Height = 300;
	m_sampCal->Width = 300;
	m_sampCal->Top = 10;
	m_sampCal->Left = 10;
	m_sampCal->Visible = true;
	m_sampCal->Parent = this;
	m_sampCal->Year = 2019;
	m_sampCal->Month = 7;
	m_sampCal->Day = 18;
}

__fastcall TFormCalendar::~TFormCalendar()
{
	delete m_sampCal;
}

//---------------------------------------------------------------------------

__fastcall TSampleCalendar::TSampleCalendar(TComponent *Owner) : TCalendar(Owner)
{
	ColCount = 7;
	RowCount = 7;
	FixedCols = 0;
	FixedRows = 1;
	ScrollBars = ssNone;
	Options = (Options >> goRangeSelect) << goDrawFocusSelected;
}
void __fastcall TSampleCalendar::DrawCell(int ACol, int ARow, const TRect &ARect, TGridDrawState AState)
{
	// ベースクラスの実行
	TCalendar::DrawCell(ACol, ARow, ARect, AState);

	// 以下に追加の処理を加える
}
```

### 実行結果


![2019-07-18_17h38_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/c4deb19e-83f2-e068-99f7-5a774081939f.png)

TSampleCalendar::DrawCell()にてブレークポイントを設定すると、きちんと停止した。

これでDrawCellをカスタマイズできるだろう。


### 検索用キーワード

- override
- inherite


### オーバーライドの例 > 背景色を変える

3行目の背景色を変える実装例

```cpp
void __fastcall TSampleCalendar::DrawCell(int ACol, int ARow, const TRect &ARect, TGridDrawState AState)
{
	// 以下に追加の処理を加える
	if (ARow == 3) {
		this->Canvas->Brush->Color = clRed;
		this->Canvas->FillRect(ARect);
	}

	// ベースクラスの実行
	TCalendar::DrawCell(ACol, ARow, ARect, AState);
}
```

![2019-07-18_17h50_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/e3e074df-1948-4483-2aa6-645145182475.png)