|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"HeaderControl - Owner Draw"
※Delphiのコンポーネントの中ではあんまり使い道がない(^^; HeaderControlを
使ってDBGridと組み合わせたサンプルです。
※使い道としては、DBGridでタイトルがクリックされたらそのフィールドで
データをソートする... というのを想定してます。
※HeaderControl はクリックするとそのセクションが凹んで表示されますので、
それらしく見えますからついでにソート基準を表すBitmapの矢印を OwnerDraw
しようというものです。
こういう仕様のDBGridコンポを作成するのはとっても大変なので... (;^^)/
※DBGridの Optionsに dgColumnResize が入っている場合は別途コーディングが
必要です。
※あんまりクールなコードではないですがご参考まで(^^a
================
1. フォームにパネルを配置して BevelOuter/BevelInner := bvNone に、
BorderStyle := bsSingle にする.
2. そのパネルに HeaderControlを配置. (Align := alTop)
3. そのパネルに DBGrid を Align := alClient で配置し、Optionsから
dgTitles を外し BorderStyle := bsNone にする.
4. HeaderControl1.Sections[n].Widthを対応するDBGrid1.Columns[n].Width
に合わせておく.
ついでにオーナードローにしたいセクションの Styleを hsOwnerDrawに
しておく.
※ これで普通のDBGridに見えます(^^;
5. 予めリソースとして用意しておいたビットマップイメージを読み込む.
フォームの privateセクションなどで Bitmap Objectを定義しておいて
FormCreateなどで読み込みます.
ここで使っているBitmapは Width=10, Height=9 です.
:
private
DArrow: TBitmap; // Headerの下向き矢印
FSortOrder: Integer; // DBGridのソート順フラグ(後述)
:
procedure TForm1.FormCreate(Sender: TObject);
begin
// DefaultでGridのいちばん左のフィールド(=KeyField)でソートされて
// いるものとする
FSortOrder := 1;
DArrow := TBitmap.Create;
DArrow.LoadFromResourceName(hInstance, 'DOWN_ARROW');
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
DArrow.Free; // 開放するのを忘れずに
end;
6. HeaderControlの OnDrawSectionイベントで...
procedure TForm1.HeaderControl1DrawSection(
HeaderControl: THeaderControl; Section: THeaderSection;
const Rect: TRect; Pressed: Boolean);
begin
with HeaderControl.Canvas do begin
// テキストを描画↓
// マウスで押されている時は文字も一緒に凹んで見えるように...
if Pressed then
TextOut(Rect.Left + 7, Rect.Top + 3, Section.Text)
else
TextOut(Rect.Left + 6, Rect.Top + 2, Section.Text);
// 矢印(Bitmap)を描画↓
// マウスで押されている時は矢印も一緒に凹んで見えるように...
if (Section.Index = FSortOrder) and Pressed then
Draw(Rect.Right - (DArrow.Width * 2) + 1, Rect.Top + 4, DArrow);
// そうでない時は普通に見えるように...
if (Section.Index = FSortOrder) and not Pressed then
Draw(Rect.Right - (DArrow.Width * 2), Rect.Top + 3, DArrow);
end;
end;
7. HeaderControlの OnSectionClickイベントで...
procedure TForm1.HeaderControl1SectionClick(
HeaderControl: THeaderControl; Section: THeaderSection);
begin
// クリックされたフィールドがすでにソート基準になっている場合は
// 何もしない (余計な描画・ソート処理をしない)
if not (Section.Index = FSortOrder) then begin
FSortOrder := Section.Index; // ソート基準フラグを変更
case FSortOrder of
1: 〜; // ここでテーブルのインデックスを切り替える...
2: 〜; // または SQLの ORDER BY を変更してOpen...
3: 〜; // などの処理をします
end;
HeaderControl1.Invalidate;
end;
end;
___________________________________
03/24/1998 Tue. フクロウ [GCH06715]
Original document by フクロウ 氏 ID:(GCH06715)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|