Delphi 是否正确更新Treeview节点映像?

Delphi 是否正确更新Treeview节点映像?,delphi,treeview,Delphi,Treeview,我正在使用带有TImageList的TTreeView。我的树状视图与Windows树状视图类似,其中我有组节点和项目节点 创建组节点时,它们有两个Imagelist中设置的ImageIndex,一个用于关闭文件夹imgGroupClosed图标,另一个用于打开文件夹imgGroupOpen图标 当我添加其他类型的节点时,它们使用的图标也与Imagelist中设置的不同 现在我的问题是,如何确保组节点显示正确的图标?例如,如果删除或移动子项节点,则不再具有任何子项的组应显示为关闭,但显示为打开

我正在使用带有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,否则屏幕上的图像不会更新