首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

分享一个TTreeView勾选框操作的单元源码解决方法

2013-01-06 
分享一个TTreeView勾选框操作的单元源码unit UnitMaininterfaceusesWindows, Messages, SysUtils, Varian

分享一个TTreeView勾选框操作的单元源码


unit UnitMain;

interface

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


type
  TFormMain = class(TForm)
    tvTree: TTreeView;
    spl1: TSplitter;
    btnGetSelected: TBitBtn;
    btnSetSelected: TBitBtn;
    edtName: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure tvTreeClick(Sender: TObject);
    procedure btnGetSelectedClick(Sender: TObject);
    procedure btnSetSelectedClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }

    // 检查某个树节点是否被勾选
    function IsChecked(TreeNode : TTreeNode) : Boolean;

    // 设置某个树节点的勾选状态
    procedure SetChecked(TreeNode : TTreeNode; Checked : Boolean);

    // 对选中节点的子节点进行全选或反全选
    procedure ToggleCheckbox(TreeView : TTreeView; TreeNode : TTreeNode);
  end;

var
  FormMain: TFormMain;

implementation

{$R *.dfm}

const
  TVIS_CHECKED = $2000;
  TVS_CHECKBOXS = $00000100;

// 检查某个树节点是否被勾选
function TFormMain.IsChecked(TreeNode : TTreeNode) : Boolean;
var
  TVItem : TTVItem;
begin
  TVItem.Mask := TVIF_STATE;
  TVItem.hItem := TreeNode.ItemId;
  TreeView_GetItem(TreeNode.TreeView.Handle, TVItem);
  Result := (TVItem.State and TVIS_CHECKED) = TVIS_CHECKED;
end;

// 设置某个树节点的勾选状态
procedure TFormMain.SetChecked(TreeNode : TTreeNode; Checked : Boolean);
var
  TVItem : TTVItem;
begin
  FillChar(TVItem, SizeOf(TVItem), 0);

  with TVItem do
  begin
    hItem := TreeNode.ItemId;
    Mask := TVIF_STATE;
    StateMask := TVIS_STATEIMAGEMASK;

    if Checked then
      TVItem.State := TVIS_CHECKED
    else
      TVItem.State := TVIS_CHECKED shr 1;

    TreeView_SetItem(TreeNode.TreeView.Handle, TVItem);
  end;
end;

// 对选中节点的子节点进行全选或反全选
procedure TFormMain.ToggleCheckbox(TreeView : TTreeView; TreeNode : TTreeNode);
var
  CurNode, ParentNode, GrandSonNode, SonNode : TTreeNode;
  Flag : boolean;
begin
  CurNode := TreeNode;

  with TreeView do
  begin
    if IsChecked(CurNode) then
    begin
      //递归遍历处理其子节点
      SonNode := CurNode.GetFirstChild;


      while SonNode <> nil do
      begin
        SetChecked(SonNode, True);
        ToggleCheckbox(TreeView, SonNode);
        SonNode := SonNode.GetNextSibling;
      end;

      ParentNode := CurNode.Parent;
      if ParentNode <> nil then
      begin
        SetChecked(ParentNode, True);
      end;
    end
    else if not IsChecked(CurNode) then
    begin
      SonNode := CurNode.GetFirstChild;
      while SonNode <> nil do
      begin
        SetChecked(SonNode, False);
        ToggleCheckbox(TreeView, SonNode);
        SonNode := SonNode.GetNextSibling;
      end;
    end;
  end;
end;


procedure TFormMain.FormCreate(Sender: TObject);
begin
  //仅仅这一句话就能让treeview 显示复选框
SetWindowLong(tvTree.Handle, GWL_STYLE,
  GetWindowLong(tvTree.Handle, GWL_STYLE) or TVS_CHECKBOXS);
end;

procedure TFormMain.tvTreeClick(Sender: TObject);
var
  P : TPoint;
  TreeNode : TTreeNode;
begin
  GetCursorPos(P);
  P := tvTree.ScreenToClient(P);

  if (htOnStateIcon in tvTree.GetHitTestInfoAt(P.X,P.Y)) then
  begin
     TreeNode := tvTree.GetNodeAt(P.X,P.Y);
     ToggleCheckbox(tvTree, TreeNode);
  end;
end;

procedure TFormMain.btnGetSelectedClick(Sender: TObject);
var
  I : Integer;
begin
  for I := 0 to tvTree.Items.Count - 1 do
  begin
    if IsChecked(tvTree.Items[I]) then
    begin
      ShowMessage(tvTree.Items[I].Text);
    end;
  end;
end;



procedure TFormMain.btnSetSelectedClick(Sender: TObject);
var
  I : Integer;
begin
  if Trim(edtName.Text) = '' then Exit;

  for I := 0 to tvTree.Items.Count - 1 do
  begin
    if tvTree.Items[I].Text = Trim(edtName.Text) then
      SetChecked(tvTree.Items[I], True);
  end;
end;

end.


[解决办法]
路过学习,谢谢分享
[解决办法]
分享一个TTreeView勾选框操作的单元源码解决方法
[解决办法]
分享一个TTreeView勾选框操作的单元源码解决方法
源码的东东很不错。
CNpack里的treeview功能更全一些,可以直接全选子记录。楼主可再完美一些。


[解决办法]
正好需要,收藏了.楼主辛苦了.
[解决办法]
有一个更简单的方法,做2张图片用来显示
改变ImageIndex,SelectedIndex即可

[解决办法]
Good work.

热点排行