Delphi: проверка выбора в виде дерева - PullRequest
0 голосов
/ 27 июля 2011

Существует древовидное представление с 2 уровнями предметов.Мне нужно добавить текст всех выбранных элементов «sub» (уровень 1) в заметку.

for i := 0 to pred(TreeView1.Items.count) do 
if (TreeView1.Items.Item[i].Selected) and (TreeView1.Items.Item[i].Level=1)
   then 
       begin
            Memo1.Lines.Add(TreeView1.Items.Item[i].Text)
       end;

Но как добавить все элементы «sub» одновременно без их проверки (выбранной или нет)если их родитель (уровень 0) выбран?Например, я выбираю 3 предмета с уровнем 0, и их дети добавляются в заметку.

Спасибо за помощь!

Ответы [ 2 ]

3 голосов
/ 27 июля 2011

Получать только узлы уровня 1, у которых есть выбранный родитель:

var
  Node: TTreeNode;
  Sub: TTreeNode;
begin
  Node := TreeView.Items.GetFirstNode;
  while Node <> nil do
  begin
    if Node.Selected then
    begin
      Sub := Node.GetFirstChild;
      while Sub <> nil do
      begin
        Memo1.Lines.Add(Sub.Text);
        Sub := Sub.GetNextSibling;
      end;
    end;
    Node := Node.GetNextSibling;
  end;
end;

Обновление из-за комментария:

Получать узлы уровня 1, у которых есть выбранный родитель,или выбираются сами:

var
  I: Integer;
begin
  for I := 0 to TreeView.Items.Count - 1 do
    with TreeView.Items[I] do
      if (Level = 1) and (Selected or Parent.Selected) then
        Memo1.Lines.Add(Text);
end;
1 голос
/ 27 июля 2011

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

procedure EnumerateSelectedNonTopLevelItems(TreeView: TTreeView; List: TStrings);
var
  Node: TTreeNode;
begin
  for Node in TreeView.Items do
    if Node.Selected and Assigned(Node.Parent) then
      List.Add(Node.Text);
end;

Эта процедура даст вам узлы на уровнях 2, 3, 4 и т. Д. Поскольку у вас есть только уровень 0 и уровень 1, это нормально. Если вам действительно нужны узлы, которые являются прямыми потомками узлов верхнего уровня, вы можете изменить тест следующим образом:

if Node.Selected and Assigned(Node.Parent) and not Assigned(Node.Parent.Parent) then
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...