Delphi 是否正确更新Treeview节点映像?
我正在使用带有TImageList的TTreeView。我的树状视图与Windows树状视图类似,其中我有组节点和项目节点 创建组节点时,它们有两个Imagelist中设置的ImageIndex,一个用于关闭文件夹imgGroupClosed图标,另一个用于打开文件夹imgGroupOpen图标 当我添加其他类型的节点时,它们使用的图标也与Imagelist中设置的不同 现在我的问题是,如何确保组节点显示正确的图标?例如,如果删除或移动子项节点,则不再具有任何子项的组应显示为关闭,但显示为打开 我尝试编写一个可重用的过程,如下所示:Delphi 是否正确更新Treeview节点映像?,delphi,treeview,Delphi,Treeview,我正在使用带有TImageList的TTreeView。我的树状视图与Windows树状视图类似,其中我有组节点和项目节点 创建组节点时,它们有两个Imagelist中设置的ImageIndex,一个用于关闭文件夹imgGroupClosed图标,另一个用于打开文件夹imgGroupOpen图标 当我添加其他类型的节点时,它们使用的图标也与Imagelist中设置的不同 现在我的问题是,如何确保组节点显示正确的图标?例如,如果删除或移动子项节点,则不再具有任何子项的组应显示为关闭,但显示为打开
procedure TfrmMain.UpdateGroupImages;
var
Node: TTreeNode;
i: Integer;
begin
if TreeView1.Items.Count > 0 then
begin
for i := 0 to TreeView1.Items.Count - 1 do
begin
Node := TreeView1.Items[i];
case Node.ImageIndex of
imgGroupClosed, imgGroupOpen:
begin
if Node.HasChildren then
begin
if Node.Expanded then
begin
Node.ImageIndex := imgGroupOpen;
Node.SelectedIndex := imgGroupOpen;
end
else
begin
Node.ImageIndex := imgGroupClosed;
Node.SelectedIndex := imgGroupClosed;
end
end
else
begin
Node.ImageIndex := imgGroupClosed;
Node.SelectedIndex := imgGroupClosed;
end;
end;
end;
end;
end;
end;
我在一些Treeview事件中调用了这个,比如OnCollapsed、OneExpanded、OnDeletion、OnDragDrop等,但它似乎工作不正常
有没有更好的方法,或者有人能帮我更新/修复上面的代码
基本上,我遇到的问题是组节点不能正确更新图像,所以有时当没有子节点或未展开时,我会留下一个打开的文件夹图标等
谢谢,Craig。按如下方式添加BeginUpdate和EndUpdate,它应该可以工作:
procedure TfrmMain.UpdateGroupImages;
var
Node: TTreeNode;
i: Integer;
begin
TreeView1.BeginUpdate;
try
if TreeView1.Items.Count > 0 then
begin
for i := 0 to TreeView1.Items.Count - 1 do
begin
Node := TreeView1.Items[i];
case Node.ImageIndex of
imgGroupClosed, imgGroupOpen:
begin
if Node.HasChildren then
begin
if Node.Expanded then
begin
Node.ImageIndex := imgGroupOpen;
Node.SelectedIndex := imgGroupOpen;
end
else
begin
Node.ImageIndex := imgGroupClosed;
Node.SelectedIndex := imgGroupClosed;
end
end
else
begin
Node.ImageIndex := imgGroupClosed;
Node.SelectedIndex := imgGroupClosed;
end;
end;
end;
end;
end;
finally
TreeView1.EndUpdate;
end;
end;
我现在无法尝试使用Delphi,但我想在开始时使用TreeView1.BeginUpdate,在结束时使用TreeView1.EndUpdate可以做到这一点。或者在结束时失效…@Andreas开始/结束更新工作。把它作为你的答案,我会接受你的感谢。这不是非常令人满意。BeginUpdate是一种优化,用于减少复合操作中的更新次数。大卫,我使用D2007,除非我调用BeginUpdate/EndUpdate,否则屏幕上的图像不会更新