我正在创建带有复选框的 Treeview。我已经弄清如何将复选框切换到节点(
我创建了一个树形结构示例:
procedure ToggleTreeViewCheckBoxes
)。我添加了一个带有复选框位图的 TImageList
组件,并在 OnClick
树形视图事件中更改了 StateIndex
。它运行得很好,但我想添加额外的行为。我创建了一个树形结构示例:
Root 1
Parent 1 (复选框)
- Child 1 (复选框)
- Child 2 (复选框)
Parent 2 (复选框)
- Child 1 (复选框)
- Child 2 (复选框)
Root 2
Parent 1 (复选框)
- Child 1 (复选框)
- Child 2 (复选框)
Parent 2 (复选框)
- Child 1 (复选框)
- Child 2 (复选框)
unit TreeViewCheckboxes;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.ImageList, Vcl.ImgList,
Vcl.ComCtrls;
type
TForm5 = class(TForm)
ImageList1: TImageList;
TreeView1: TTreeView;
procedure FormCreate(Sender: TObject);
procedure TreeView1Click(Sender: TObject);
private
{ Private declarations }
procedure ToggleTreeViewCheckBoxes(Node:TTreeNode; cUnChecked, cChecked: Integer);
public
{ Public declarations }
end;
var
Form5: TForm5;
const
cStateUnCheck = 1;
cStateChecked = 2;
aRootList: Array[1..2] of String =
(
'Root 1',
'Root 2'
);
implementation
{$R *.dfm}
{ TForm5 }
procedure TForm5.FormCreate(Sender: TObject);
var
RootNode: TTreeNode;
ParentNode: TTreeNode;
ChildNode: TTreeNode;
i: Integer;
begin
for i := 1 to High(aRootList) do
begin
RootNode := TreeView1.Items.Add(nil, aRootList[i]);
ParentNode := TreeView1.Items.AddChild(RootNode, 'Parent 1');
ParentNode.StateIndex := 1;
ChildNode := TreeView1.Items.AddChild(ParentNode, 'Child 1');
ChildNode.StateIndex := 1;
ChildNode := TreeView1.Items.AddChild(ParentNode, 'Child 2');
ChildNode.StateIndex := 1;
ParentNode := TreeView1.Items.AddChild(RootNode, 'Parent 2');
ParentNode.StateIndex := 1;
ChildNode := TreeView1.Items.AddChild(ParentNode, 'Child 1');
ChildNode.StateIndex := 1;
ChildNode := TreeView1.Items.AddChild(ParentNode, 'Child 2');
ChildNode.StateIndex := 1;
end;
end;
procedure TForm5.ToggleTreeViewCheckBoxes(Node: TTreeNode; cUnChecked,
cChecked: Integer);
begin
if Assigned(Node) then
begin
if Node.StateIndex = cUnChecked then
Node.StateIndex := cChecked
else if Node.StateIndex = cChecked then
Node.StateIndex := cUnChecked;
end;
end;
procedure TForm5.TreeView1Click(Sender: TObject);
var
P: TPoint;
begin
GetCursorPos(P);
P := TreeView1.ScreenToClient(P);
if (htOnStateIcon in TreeView1.GetHitTestInfoAt(P.X, P.Y)) then
ToggleTreeViewCheckBoxes(TreeView1.Selected, cStateUnCheck, cStateChecked);
end;
end.
问题:
1) 如何实现:如果我点击任何一个父复选框节点,所有子节点都取消勾选?
2) 你知道有更好的方法动态添加节点并为所有子节点设置StateIndex
吗?我的意思是不要每次都使用ChildNode.StateIndex := 1;
这一行。
TVS_CHECKBOXES
窗口样式),但是TTreeView
VCL 组件至今仍不支持该功能(RSP-15270)。 - Remy Lebeau