Правильно ли обновлять изображения узла Treeview? - PullRequest
1 голос
/ 25 мая 2011

Я использую TTreeView с TImageList.Мое древовидное представление представлено аналогично древовидному представлению Windows, где у меня есть узлы группы и узлы элементов.

Когда узлы группы создаются, они имеют 2 индекса изображения, как установлено в списке изображений, один для закрытой папки (imgGroupClosed)значок второй - для значка открытой папки (imgGroupOpen).

Когда я добавляю другие типы узлов, они используют другой значок, также установленный из списка изображений.

Теперь на мой вопрос, какубедиться, что узлы группы показывают правильный значок?например, если я удаляю или перемещаю узел дочернего элемента, группа, у которой больше нет дочерних элементов, должна отображаться как закрытая, но она отображается как открытая.

Я попытался написать процедуру многократного использования, например:

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, OnExpanded, OnDeletion, OnDragDrop и т. Д., Но, похоже, он работает неправильно.

Есть ли лучший способ сделать это, илиМожет ли кто-нибудь помочь обновить / исправить мой код выше?

В основном проблема, которую я получаю, заключается в том, что узлы группы не обновляют изображения правильно, поэтому иногда у меня остается значок открытой папки, когда нет дочерних элементов или они не развернуты.и т.д.

Спасибо, Крейг.

1 Ответ

0 голосов
/ 25 мая 2011

Добавьте 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...