« ■ヘルプについて | トップページ | ■Delphi 2007 届きました。 »

☆TreeViewにチェックボックスを表示する。

あまり使うことがないのですが、TreeViewにチェックボックスを表示させてみました。
チェックボックスを利用するには、ウィンドウスタイルの設定だけでいいと思うのですが、同じチェックボックスを何度かクリックしたときの応答がいまいちのような気がします。この点については、よくわかりませんでした。
今回、チェックボックスがクリックされたタイミングで、設定状態を取得する処理も書いてみました。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    StatusBar1: TStatusBar;
    CheckBox1: TCheckBox;
    procedure FormCreate(Sender: TObject);
    procedure TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  Commctrl;

const
  TVIS_CHECKED  = $2000;

// ウィンドウスタイルの設定---チェックボックスを設定します。
procedure TForm1.FormCreate(Sender: TObject);
var
  WindowStyles: Integer;
  I: Integer;
begin
  WindowStyles := GetWindowLong(TreeView1.Handle, GWL_STYLE);
  SetWindowLong(TreeView1.Handle, GWL_STYLE, WindowStyles or TVS_CHECKBOXES);
  StatusBar1.SimplePanel := True;

  // サンプルデータ
  for I := 1 to 9 do
    TreeView1.Items.Add(nil, 'Item' + IntToStr(I));
end;

// チェックボックスがクリックされたことを取得します。
procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  lpht: TTVHitTestInfo;
  TvItem: TTVItem;
  Node: TTreeNode;
  Check: Boolean;
begin
  // クリックした位置のノードを取得します。
  Node := TreeView1.GetNodeAt(X, Y);
  if Node = nil then Exit;

  // クリックした位置がチェックボックス上からどうかを調べます。
  lpht.pt.x := X;
  lpht.pt.y := Y;
  TreeView_HitTest(TreeView1.Handle, lpht);

  if lpht.flags = TVHT_ONITEMSTATEICON then
  begin
    // チェックボックス上をクリックされた場合の処理

    // チェックされているかどうかを調べます。
    TvItem.Mask := TVIF_STATE;
    TvItem.hItem := Node.ItemId;
    TreeView_GetItem(TreeView1.Handle, TvItem);
    Check := (TvItem.State and TVIS_CHECKED) > 0;

    if Check then
      StatusBar1.SimpleText := 'Checked'
    else
      StatusBar1.SimpleText := 'Unchecked';

    // チェックボックスをクリックした時に、ノードを移動させます。
    TreeView1.Selected := Node;
  end;
end;

end.

参考にしたサイト

MSDN
Tree-View Controls

Microsoft サポートオンライン
[HOWTO] TreeView コントロールでユーザーがチェック ボックスをクリックしたときに通知を受け取る方法

|

« ■ヘルプについて | トップページ | ■Delphi 2007 届きました。 »