我的菜单转树代码如下,但是怎么设置成没有子节点的节点都是显示第3张图片,有子节点的节点收缩时显示第1张图片,展开时显示第2张图片,就像CSDN 论坛左边的树菜单?
function Tfrmmain.InitMenu(MainMenu: TMainMenu; ItemsOwner: TTreeView): TTreeNodes;
procedure lop(SubMenu:TMenuItem;var TreeItem:TTreeNodes;SubNode:TTreeNode);
var
SCount,Slop:integer;
SSubNode:TTreeNode;
begin
SCount := SubMenu.Count;
For Slop := 1 to SCount do
begin
if SubMenu.items[Slop-1].Caption='-' then break;
SSubNode := TreeItem.AddChild(subNode,SubMenu.items[Slop-1].Caption);
SSubNode.StateIndex := 1;
Lop(SubMenu.Items[Slop-1],TreeItem,SSubNode);
end;
end;
var
RetuMenu:TTreeNodes;
SubItem,ParentItem:TTreeNode;
MenuCount,lops:integer;
begin
Result := nil;
RetuMenu := TTreeNodes.Create(ItemsOwner);
ParentItem := RetuMenu.AddFirst(nil,'系统菜单');
ParentItem.ImageIndex:=0;
parentitem.SelectedIndex:=1;
MenuCount := MainMenu.Items.Count;
for lops := 0 to MenuCount-1 do
begin
SubItem := RetuMenu.Addchild(ParentItem,MainMenu.Items[lops].Caption);
SubItem.StateIndex := 1;
lop(MainMenu.Items[lops],RetuMenu,SubItem);
end;
Result := RetuMenu;
end;
function Tfrmmain.InitMenu(MainMenu: TMainMenu; ItemsOwner: TTreeView): TTreeNodes;
procedure lop(SubMenu:TMenuItem;var TreeItem:TTreeNodes;SubNode:TTreeNode);
var
SCount,Slop:integer;
SSubNode:TTreeNode;
begin
SCount := SubMenu.Count;
For Slop := 1 to SCount do
begin
if SubMenu.items[Slop-1].Caption='-' then break;
SSubNode := TreeItem.AddChild(subNode,SubMenu.items[Slop-1].Caption);
SSubNode.StateIndex := 1;
Lop(SubMenu.Items[Slop-1],TreeItem,SSubNode);
end;
end;
var
RetuMenu:TTreeNodes;
SubItem,ParentItem:TTreeNode;
MenuCount,lops:integer;
begin
Result := nil;
RetuMenu := TTreeNodes.Create(ItemsOwner);
ParentItem := RetuMenu.AddFirst(nil,'系统菜单');
ParentItem.ImageIndex:=0;
parentitem.SelectedIndex:=1;
MenuCount := MainMenu.Items.Count;
for lops := 0 to MenuCount-1 do
begin
SubItem := RetuMenu.Addchild(ParentItem,MainMenu.Items[lops].Caption);
SubItem.StateIndex := 1;
lop(MainMenu.Items[lops],RetuMenu,SubItem);
end;
Result := RetuMenu;
end;
begin
if Node.HasChildren then
Node.ImageIndex := 3
else
begin
if Node.Expanded then
Node.ImageIndex := 2
else
Node.ImageIndex := 1;
end;
end;
procedure Tfrmmain.TreeView1Expanded(Sender: TObject; Node: TTreeNode);
begin
if Node.HasChildren=false then
Node.ImageIndex := 2
else
begin
if Node.Expanded then
Node.ImageIndex := 1
else
Node.ImageIndex := 0;
end;
end;
你在下面调用一下TreeView1.Update方法再试试。
按上面的方法展开节点遇到的问题是:
当点父节点的时候,图片1和图片0重叠,而没有子节点的node图像没有发生变化,还是显示图片0.只有点击最末节点时才改变成图片2.
一个是未选中状态 Node.ImageIndex := X;
一个是选中状态的图标 Node.SelectedIndex := X;例如:
if SSubNode.HasChildren = false then
begin
SSubNode.ImageIndex := 2;
SSubNode.SelectedIndex := 2;
end;两个都给写上去,这样点跟没点,展开跟没展开就不会乱了
楼上兄弟,用下面代码出现错误
procedure Tfrmmain.TreeView1Expanded(Sender: TObject; Node: TTreeNode);
VAR
SSubnode:TTreeNode;
begin
if SSubnode.HasChildren=false then
SSubnode.ImageIndex := 2
SSubnode.SelectedIndex := 2
else
begin
if SSubnode.Expanded then
SSubnode.ImageIndex := 1
SSubnode.SelectedIndex :=1
else
SSubnode.ImageIndex := 0;
SSubnode.SelectedIndex :=0;
end;end;
错误如下:
[Error] mainform.pas(489): Missing operator or semicolon
[Error] mainform.pas(494): Missing operator or semicolon
[Fatal Error] ZHGLXT.dpr(22): Could not compile used unit 'mainform.pas'