Mator

TTreeView with checkboxes

Apr 9th, 2015
323
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 3.51 KB | None | 0 0
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, ComCtrls, ImgList, StdCtrls;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     TreeView1: TTreeView;
  12.     ImageList1: TImageList;
  13.     procedure TreeView1Click(Sender: TObject);
  14.     procedure TreeView1KeyDown(Sender: TObject; var Key: Word;
  15.       Shift: TShiftState);
  16.     procedure FormCreate(Sender: TObject);
  17.     procedure TreeView1Collapsing(Sender: TObject; Node: TTreeNode;
  18.       var AllowCollapse: Boolean);
  19.   private
  20.     { Private declarations }
  21.   public
  22.     { Public declarations }
  23.   end;
  24.  
  25.  
  26. const
  27. //ImageList.StateIndex=0 has some bugs, so we add one dummy image to position 0
  28. cUnChecked = 1;
  29. cChecked = 2;
  30. cPartiallyChecked = 3;
  31.  
  32. var
  33.   Form1: TForm1;
  34.  
  35. implementation
  36. {$R *.dfm}
  37.  
  38. procedure SetChildren(Node:TTreeNode; state:Integer);
  39. var
  40.   tmp:TTreeNode;
  41. begin
  42.   // exit if node not assigned
  43.   if not Assigned(Node) then exit;
  44.  
  45.   // set first child and all siblings to state
  46.   Node.StateIndex := state;
  47.   tmp := Node.getNextSibling;
  48.   if Assigned(tmp) then SetChildren(tmp, state);
  49.  
  50.   // set all children to state
  51.   tmp := Node.getFirstChild;
  52.   if Assigned(tmp) then SetChildren(tmp, state);
  53. end;
  54.  
  55. procedure SetParents(Node:TTreeNode);
  56. var
  57.   tmp:TTreeNode;
  58.   state:Integer;
  59. begin
  60.   // exit if node not assigned
  61.   if not Assigned(Node) then exit;
  62.  
  63.   // parent state is checked if all siblings are checked
  64.   state := cChecked;
  65.   tmp := Node.getFirstChild;
  66.   while Assigned(tmp) do begin
  67.     if tmp.StateIndex <> cChecked then begin
  68.       state := cPartiallyChecked;
  69.       break;
  70.     end;
  71.     tmp := tmp.getNextSibling;
  72.   end;
  73.  
  74.   // parent state is unchecked if all siblings are unchecked
  75.   if state = cPartiallyChecked then begin
  76.     state := cUnChecked;
  77.     tmp := Node.getFirstChild;
  78.     while Assigned(tmp) do begin
  79.       if tmp.StateIndex <> cUnChecked then begin
  80.         state := cPartiallyChecked;
  81.         break;
  82.       end;
  83.       tmp := tmp.getNextSibling;
  84.     end;
  85.   end;
  86.  
  87.   // set state, recurse to next parent
  88.   Node.StateIndex := state;
  89.   tmp := Node.Parent;
  90.   if Assigned(tmp) then
  91.     SetParents(tmp);
  92. end;
  93.  
  94. procedure ToggleTreeViewCheckBoxes(Node:TTreeNode);
  95. var
  96.   tmp:TTreeNode;
  97. begin
  98.   if Assigned(Node) then begin
  99.     if (Node.StateIndex = cUnChecked)
  100.     or (Node.StateIndex = cPartiallyChecked) then begin
  101.       Node.StateIndex := cChecked;
  102.       SetChildren(Node.getFirstChild, cChecked);
  103.       SetParents(Node.Parent);
  104.     end
  105.     else if Node.StateIndex = cChecked then begin
  106.       Node.StateIndex := cUnChecked;
  107.       SetChildren(Node.getFirstChild, cUnChecked);
  108.       SetParents(Node.Parent);
  109.     end;
  110.   end; // if Assigned(Node)
  111. end; (*ToggleTreeViewCheckBoxes*)
  112.  
  113. procedure TForm1.TreeView1Click(Sender: TObject);
  114. var
  115.   P:TPoint;
  116. begin
  117.   GetCursorPos(P);
  118.   P := TreeView1.ScreenToClient(P);
  119.   if (htOnStateIcon in TreeView1.GetHitTestInfoAt(P.X,P.Y)) then
  120.     ToggleTreeViewCheckBoxes(TreeView1.Selected);
  121. end;
  122.  
  123. procedure TForm1.TreeView1KeyDown(Sender: TObject; var Key: Word;
  124.   Shift: TShiftState);
  125. begin
  126.   if (Key = VK_SPACE) and Assigned(TreeView1.Selected) then
  127.     ToggleTreeViewCheckBoxes(TreeView1.Selected);
  128. end; (*TreeView1KeyDown*)
  129.  
  130. procedure TForm1.FormCreate(Sender: TObject);
  131. var
  132.   i: integer;
  133. begin
  134.   TreeView1.FullExpand;
  135. end; (*FormCreate*)
  136.  
  137. procedure TForm1.TreeView1Collapsing(Sender: TObject; Node: TTreeNode;
  138.   var AllowCollapse: Boolean);
  139. begin
  140.   AllowCollapse := true;
  141. end; (*TreeView1Collapsing*)
  142.  
  143.  
  144. end.
Advertisement
Add Comment
Please, Sign In to add comment