--------------------这是点击改变图标-------------------- procedure TPopedomFrm.AppTreeViewClick(Sender: TObject); var SeNode,Node,GrandNode: TTreeNode; ii,jj :integer ; ImgIndex :integer; checked :boolean; bChecked :boolean; begin if (AppTreeView.Selected = nil) then exit; SeNode := AppTreeView.Selected; ImgIndex := 2; with AppTreeView do begin if Selected.Level>0 then begin if Selected.StateIndex = 1 then begin Selected.StateIndex := 2; ImgIndex := 2; end else begin Selected.StateIndex := 1; ImgIndex := 1; end; end; // Self // Down and/or Up case Selected.Level of 10: //操作员姓名 begin Node := Selected.GetFirstChild; //子节点 if (Node=nil) or (not Node.HasChildren ) then begin bChecked :=False ; AppTreeViewExpanding(sender,Selected,bChecked); // Selected.Expand(False); Node := Selected.GetFirstChild; //子节点 end; while Node<>nil do begin Node.StateIndex := ImgIndex; bChecked :=False ; AppTreeViewExpanding(sender,Node,bChecked); if Node.HasChildren then begin GrandNode := Node.GetFirstChild; //孙节点 while GrandNode <> nil do begin GrandNode.StateIndex := ImgIndex; GrandNode := GrandNode.GetNextChild(GrandNode); end; end; Node := Node.GetNextSibling; end; end; 1: //Top Node begin Node := Selected.GetFirstChild; //子节点 if (Node=nil) or (not Node.HasChildren ) then begin bChecked :=False ; AppTreeViewExpanding(sender,Selected,bChecked); // Selected.Expand(False); Node := Selected.GetFirstChild; //子节点 end; while Node<>nil do begin Node.StateIndex := ImgIndex; if Node.HasChildren then begin GrandNode := Node.GetFirstChild; //孙节点 while GrandNode <> nil do begin GrandNode.StateIndex := ImgIndex; GrandNode := GrandNode.GetNextChild(GrandNode); end; end; Node := Node.GetNextSibling; end; Selected.Parent.StateIndex :=ImgIndex ; // showmessage(inttostr(imgIndex)); if Selected.Parent.StateIndex =2 then begin bChecked :=False ; Node :=Selected.Parent; GrandNode := Node.GetFirstChild; //孙节点 while GrandNode <>nil do begin if GrandNode.StateIndex =1 then begin Node.StateIndex :=1 ; bChecked :=True; Break ; end; GrandNode := GrandNode.GetNextChild(GrandNode); end; end; end; { 2: // Middle Node begin Node := Selected.GetFirstChild; //子节点 while Node<>nil do begin Node.StateIndex := ImgIndex; Node := Node.GetNextSibling; end; Checked := false; //UP Node := Selected.Parent.GetFirstChild; //父节点 while Node <> nil do begin if Node.StateIndex = 1 then begin Checked := true; break; end; Node := Node.GetNextSibling; end; if Checked then Selected.Parent.StateIndex := 1 else Selected.Parent.StateIndex := 2; if Selected end; //1 } 2: //Bottom Node begin //父节点 Checked := false; Node := Selected.Parent.GetFirstChild; while Node <> nil do begin if Node.StateIndex = 1 then begin Checked := true; break; end; Node := Node.GetNextSibling; end; if Checked then Selected.Parent.StateIndex := 1 else Selected.Parent.StateIndex := 2; //祖父节点 Checked := false; Node := Selected.Parent.Parent.GetFirstChild; while Node <> nil do begin if Node.StateIndex = 1 then begin Checked := true; break; end; Node := Node.GetNextChild(Node);; end; if Checked then Selected.Parent.Parent.StateIndex := 1 else Selected.Parent.Parent.StateIndex := 2; end; //2 end; //case end;//with // Refresh AppTreeView.Selected := nil; end; -------------------可以参考一下来-----------------------------
建用户数据库如下
id name 项目名1 项目名2 项目名3 .... 项目名n选中了哪个项目你就把哪个项目下的设1
没选中的就置0
你就可以按此设置权限了
我就用上面的实现了你所要的一切:)
[email protected]
我将发布Snpack1.0的组件,是仿XP的界面组件。
相关信息请登陆:http://Snpack.51.net
http://snpack.51.net/ComponentEffect.htm#TSnTreeView
procedure TPopedomFrm.AppTreeViewClick(Sender: TObject);
var
SeNode,Node,GrandNode: TTreeNode;
ii,jj :integer ;
ImgIndex :integer;
checked :boolean;
bChecked :boolean;
begin
if (AppTreeView.Selected = nil) then
exit; SeNode := AppTreeView.Selected;
ImgIndex := 2;
with AppTreeView do
begin
if Selected.Level>0 then
begin
if Selected.StateIndex = 1 then
begin
Selected.StateIndex := 2;
ImgIndex := 2;
end
else
begin
Selected.StateIndex := 1;
ImgIndex := 1;
end;
end;
// Self
// Down and/or Up
case Selected.Level of
10: //操作员姓名
begin
Node := Selected.GetFirstChild; //子节点
if (Node=nil) or (not Node.HasChildren ) then
begin
bChecked :=False ;
AppTreeViewExpanding(sender,Selected,bChecked);
// Selected.Expand(False);
Node := Selected.GetFirstChild; //子节点
end;
while Node<>nil do
begin
Node.StateIndex := ImgIndex;
bChecked :=False ;
AppTreeViewExpanding(sender,Node,bChecked);
if Node.HasChildren then
begin
GrandNode := Node.GetFirstChild; //孙节点
while GrandNode <> nil do
begin
GrandNode.StateIndex := ImgIndex;
GrandNode := GrandNode.GetNextChild(GrandNode);
end;
end;
Node := Node.GetNextSibling;
end;
end;
1: //Top Node
begin Node := Selected.GetFirstChild; //子节点
if (Node=nil) or (not Node.HasChildren ) then
begin
bChecked :=False ;
AppTreeViewExpanding(sender,Selected,bChecked);
// Selected.Expand(False);
Node := Selected.GetFirstChild; //子节点
end;
while Node<>nil do
begin
Node.StateIndex := ImgIndex;
if Node.HasChildren then
begin
GrandNode := Node.GetFirstChild; //孙节点
while GrandNode <> nil do
begin
GrandNode.StateIndex := ImgIndex;
GrandNode := GrandNode.GetNextChild(GrandNode);
end;
end;
Node := Node.GetNextSibling;
end;
Selected.Parent.StateIndex :=ImgIndex ;
// showmessage(inttostr(imgIndex));
if Selected.Parent.StateIndex =2 then
begin
bChecked :=False ;
Node :=Selected.Parent;
GrandNode := Node.GetFirstChild; //孙节点
while GrandNode <>nil do
begin
if GrandNode.StateIndex =1 then
begin
Node.StateIndex :=1 ;
bChecked :=True;
Break ;
end;
GrandNode := GrandNode.GetNextChild(GrandNode);
end;
end;
end;
{ 2: // Middle Node
begin
Node := Selected.GetFirstChild; //子节点
while Node<>nil do
begin
Node.StateIndex := ImgIndex;
Node := Node.GetNextSibling;
end;
Checked := false; //UP
Node := Selected.Parent.GetFirstChild; //父节点
while Node <> nil do
begin
if Node.StateIndex = 1 then
begin
Checked := true;
break;
end;
Node := Node.GetNextSibling;
end;
if Checked then
Selected.Parent.StateIndex := 1
else
Selected.Parent.StateIndex := 2; if Selected
end; //1
}
2: //Bottom Node
begin
//父节点
Checked := false;
Node := Selected.Parent.GetFirstChild;
while Node <> nil do
begin
if Node.StateIndex = 1 then
begin
Checked := true;
break;
end;
Node := Node.GetNextSibling;
end;
if Checked then
Selected.Parent.StateIndex := 1
else
Selected.Parent.StateIndex := 2;
//祖父节点
Checked := false;
Node := Selected.Parent.Parent.GetFirstChild;
while Node <> nil do
begin
if Node.StateIndex = 1 then
begin
Checked := true;
break;
end;
Node := Node.GetNextChild(Node);;
end;
if Checked then
Selected.Parent.Parent.StateIndex := 1
else
Selected.Parent.Parent.StateIndex := 2;
end; //2
end; //case
end;//with // Refresh
AppTreeView.Selected := nil;
end;
-------------------可以参考一下来-----------------------------