お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
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