Перейти к содержанию
Fire Monkey от А до Я
  • 0

Цикл по TTreeView обходит не все уровни


x11

Вопрос

Почему этот цикл "видит" только первый уровень дерева?

Тогда как правильно организовать поиск нужного TreeViewItem`а по всем узлам, по всему дереву?

 


function TfmTree.FindItemByIndex(id_parent: Integer): TTreeViewItem;
var
  i: Integer;
begin
  Result := nil;
  for i:= 0 to Pred(TreeView1.Count) do
   if TreeView1.Items[i].Tag = id_parent then
    begin
     Result := TreeView1.Items[i];
     break;
    end;
end;                          

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Почему GlobalCount всегда возвращает количество корневых узлов?

 

function TfmTree.ItemByTag(id: integer): TTreeViewItem;
var
  Item: TTreeViewItem;
  I: Integer;
begin
  Result := nil;
  for I := 0 to Pred(TreeView1.GlobalCount) do
  begin
    Item := TreeView1.ItemByGlobalIndex(I);
    if Item.Tag = id then
      Exit(Item);
  end;
end;

 

Ссылка на комментарий
  • 0

Тут в чем затык. Есть цикл по таблице для заполнения дерева. Получается, что при каждой итерации нужно вызывать ExpandAll.

 

 

Изменено пользователем x11
Ссылка на комментарий
  • 0

Я знаю, что рациональнее заполнять дерево по мере раскрытия узлов. Но нужно иметь возможность поиска по тексту узла. А пока не прогрузишь всё дерево, искать по нему нет возможности.

Поэтому нужно грузить всё дерево целиком.

А у стандартного дерева FMX отсутствуют такие свойства, как в других DBTree-деревьях. Где достаточно указать три основных поля из таблицы: id, parent, name. Не говоря уже о других служебных полях.

Ссылка на комментарий
  • 0
  • Администраторы

Посмотрите на метод http://docwiki.embarcadero.com/Libraries/Seattle/en/FMX.Controls.TControl.EnumControls он создан для удобного обхода по всему дереву контролов. Просто проверяйте класс входного параметра и делайте ваш поиск.

 

Ссылка на комментарий
  • 0
Только что, Равиль Зарипов (ZuBy) сказал:

работает только с раскрытым списком

Ну, чукча не читатель, чукча писатель :)

Не посмотрел что обсуждалось ранее, полез сразу в исходники TreeView. Ну, тогда только рекурсия остается...

Ссылка на комментарий
  • 0
7 часов назад, Brovin Yaroslav сказал:

Посмотрите на метод http://docwiki.embarcadero.com/Libraries/Seattle/en/FMX.Controls.TControl.EnumControls он создан для удобного обхода по всему дереву контролов. Просто проверяйте класс входного параметра и делайте ваш поиск.

 

 

Примеров, случайно нет?

Ссылка на комментарий
  • 0

Пока непонятно, что такое ListOfVisibleControls. Это список мой? Я сам должен где-то объявить и создать? Какого типа? Это глобальный объект или локальный?

Изменено пользователем x11
Ссылка на комментарий
  • 0
  • Модераторы

вот пример с EnumControls и ItemByGlobalIndex

никаких проверок не писал, а они нужны в реальном проекте

TreeViewSearch.zip

Ссылка на комментарий
  • 0

Спрошу в порядке оффтопика: почему у вас так причудливо обозначена верхняя граница цикла? Зачем это Pred(TreeView1.Count)? Чем хуже простое  TreeView1.Count-1 ?

Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...