セルのサイズ変更
グリッドのカスタマイズ:インデックス への移動
メモ: ユーザーやアプリケーションがウィンドウやコントロールのサイズを変更した場合には,Windows はサイズ変更されたウィンドウやコントロールに対して WM_SIZE というメッセージを送信し,ウィンドウやコントロールが新しいサイズでイメージを描画するために必要な情報を通知します。VCL コンポーネント側では,このメッセージに応答して,すべてのセルがコントロールの境界内に収まるようにセルのサイズを変更します。WM_SIZE メッセージに応答するには,コンポーネントにメッセージ処理メソッドを追加します。
メッセージ処理メソッドの作成の詳細は,「新しいメッセージハンドラの作成」を参照してください。
このサンプルのカレンダーコントロールで WM_SIZE に応答するため,WMSize という名前のプロテクトメソッドを追加して WM_SIZE に結び付けます。このメソッドでは,すべてのセルが表示できるようにセルサイズを計算します。次にそのコードを示します。
type
TSampleCalendar = class(TCustomGrid)
protected
procedure WMSize(var Message: TWMSize); message WM_SIZE;
.
.
.
end;
.
.
.
procedure TSampleCalendar.WMSize(var Message: TWMSize);
var
GridLines: Integer; { 一時ローカル変数 }
begin
GridLines := 6 * GridLineWidth; { すべての線を結合した長さの計算結果 }
DefaultColWidth := (Message.Width - GridLines) div 7; { 新しいデフォルトのセル幅を設定 }
DefaultRowHeight := (Message.Height - GridLines) div 7; { 同様にセルの高さも設定 }
end;
//ヘッダーファイル
class PACKAGE TSampleCalendar : public TCustomGrid
{
.
.
.
protected:
void __fastcall WMSize(TWMSize &Message);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize)
END_MESSAGE_MAP(TCustomGrid)
};
//実装ファイル
void __fastcall TSampleCalendar::WMSize(TWMSize &Message)
{
int GridLines; // 一時ローカル変数
GridLines = 6 * GridLineWidth; // すべての線を結合した長さの計算結果
DefaultColWidth = (Message.Width - GridLines) / 7; // 新しいデフォルトのセル幅を設定
DefaultRowHeight = (Message.Height - GridLines) / 7; // 同様にセルの高さも設定
}
これでカレンダーのサイズが変更されたので,すべてのセルはコントロールに合った最大のサイズで表示されます。
このサンプルでは,変更後のサイズですべてのセルが表示される適切なセルサイズを計算するように,カレンダーコントロールが BoundsChanged をオーバーライドする必要があります。
type
TSampleCalendar = class(TCustomGrid)
protected
procedure BoundsChanged; override;
.
.
.
end;
.
.
.
procedure TSampleCalendar.BoundsChanged;
var
GridLines: Integer; { 一時ローカル変数 }
begin
GridLines := 6 * GridLineWidth; { すべての線を結合した長さの計算結果 }
DefaultColWidth := (Width - GridLines) div 7; { 新しいデフォルトのセル幅を設定 }
DefaultRowHeight := (Height - GridLines) div 7; { 同様にセルの高さも設定 }
inherited; {ここで継承メソッドを呼び出す }
end;
//ヘッダーファイル
class PACKAGE TSampleCalendar : public TCustomGrid
{
.
.
.
protected:
void __fastcall BoundsChanged(void);
};
//実装ファイル
void __fastcall TSampleCalendar::BoundsChanged(void)
{
int GridLines; // 一時ローカル変数
GridLines = 6 * GridLineWidth; // すべての線を結合した長さの計算結果
DefaultColWidth = (Width - GridLines) / 7; // 新しいデフォルトのセル幅を設定
DefaultRowHeight = (Height - GridLines) / 7; // 同様にセルの高さも設定
TCustomGrid::BoundsChanged(); // ここで継承メソッドを呼び出す
}