powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Фильтрация дерева
10 сообщений из 10, страница 1 из 1
Фильтрация дерева
    #40060321
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как можно организовать фильтрацию по дереву (TreeView или TreeList). Наподобие того, как реализовано в испекторе объкутов Delphi - набрал текст, пропали все не относящиеся к строке поиска строки.
То, что я сейчас вижу - нужно перестраивать все дерево (у меня оно тупо по стриглисту рисуется).

Хотелось бы найти что-то типа Node.Visible или View.Filter.

Спасибо.
...
Рейтинг: 0 / 0
Фильтрация дерева
    #40060322
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотри Virtual Tree View.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Фильтрация дерева
    #40060323
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо.
Вот прям ожидал этот ответ :-)
Посредством стандартных компонентов не получится никак?

Ну то есть одно то решение есть - пересоздать дерево (благо оно маленькое, менее 100 узлов).
...
Рейтинг: 0 / 0
Фильтрация дерева
    #40060326
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
07.04.2021 12:25, bzums пишет:
> Ну то есть одно то решение есть - пересоздать дерево

со стандартным деревом иных путей нет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Фильтрация дерева
    #40060329
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вот тут что за компонент (родной дельфийский инспектор)?

Дерево есть, но странное такое.
...
Рейтинг: 0 / 0
Фильтрация дерева
    #40060365
DHDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bzums,

это TInspListBox.

можешь попробовать (https://github.com/RRUZ/Delphi-IDE-Colorizer/blob/master/IDE%20PlugIn/Galileo/IDEInspListBox.TInspListBox.pas)
...
Рейтинг: 0 / 0
Фильтрация дерева
    #40060504
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прежде чем делать, спрошу совета у умных людей.

У меня имеется дерево, которое необходимо построить.
Выглядит оно таким образом:
TObject1
Methods
Create
Destroy
......
Properties
Name
Description
......

TObject2
Methods
SendTo
RecieveFrom
......
Properties
Sender
Reciever
......

То есть глубина получается в три уровня. У обьекта есть по крайней мере один метод и одно свойство (хотя у одного, правда, нет ни того, ни другого).

Что если я тупо создам Dictionary для хранения, и создам там такую структуру:
TObject1 Methods Create
TObject1 Methods Destroy
TObject1 Properties Name
TObject1 Properties Description
TObject2 Methods SendTo
TObject2 Methods RecieveFrom
TObject2 Properties Sender
TObject2 Properties Reciever

Это нормальное решение?
Необъодимо писать именно не в дерево сразу, а в некий промежуточный обьект изза того, что хочется как раз таки организовать некое подобие фильтра - по введенному символу перестраивать дерево по этому самому набору.
Сам набор надо еще заполнить предварительно, то есть его нет (реально по РТТИ сторится список обьектов).

Большое спасибо.
...
Рейтинг: 0 / 0
Фильтрация дерева
    #40060533
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вложенный класс может попасться?
...
Рейтинг: 0 / 0
Фильтрация дерева
    #40060580
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Неа
...
Рейтинг: 0 / 0
Фильтрация дерева
    #40060582
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для хранения использую Диктионари
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
type
  TStroka= class
    Column1: String;
    Column2: String;
    Column3: String;
  end;
var
  Dictionary: TDictionary <Integer, TStroka>;
  Stroka: TStroka;



Список обектов хранится в MyStringList
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
procedure XXX(Sender: TObject);
var
  LType: TRttiType;
  LContext: TRttiContext;
  LMethod : TRttiMethod;
  LProperty : TRttiProperty;

  Col1, Col2, Col3: string;
  Node: TTreeNode;
  RootLevelCount: Integer;
  X, X1, Y: Integer;
  CurrentTextField: String;
  MyTreeNodeText: array [0..10] of String;
  MyTreeNode: array [0..10] of TTreeNode;

begin

    Dictionary := TDictionary<Integer, TStroka>.Create;
    Y := 0;
    for i := 0 to MyStringList.Count - 1 do begin
          //objects
          LType := LContext.GetType(MyStringList.Objects[i].ClassType);
          Col1 := LType.ToString;

          //methods
          for LMethod in LType.GetMethods do
          begin
            if TRttiInstanceType(LMethod.Parent).MetaclassType.ClassName = MyStringList[i] then begin
              Col2 := 'Method';
              Col3 := LMethod.ToString;

              Stroka := TStroka.Create;
              Stroka.Column1 := Col1;
              Stroka.Column2 := Col2;
              Stroka.Column3 := Col3;
              try
                Dictionary.Add(Y, Stroka);
                Y := Y + 1;
              except
                on Exception do
                //
              end;
            end;
          end;

          //properties
          for LProperty in LContext.GetType(MyStringList.Objects[i].ClassType).GetProperties do
          begin
            Col2 := 'Property';
            Col3 := LProperty.ToString;

            Stroka := TStroka.Create;
            Stroka.Column1 := Col1;
            Stroka.Column2 := Col2;
            Stroka.Column3 := Col3;
            try
              Dictionary.Add(Y, Stroka);
              Y := Y + 1;
            except
              on Exception do
              //
            end;
          end;
    end;
end;




Построение дерева ниже:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
  for Key := 0 to Dictionary.Count - 1 do
  begin
      //Memo1.Lines.Add( Dictionary.Items[Key].Column1 + ', ' + Dictionary.Items[Key].Column2 + ', ' + Dictionary.Items[Key].Column3);

       RootLevelCount := 3;
       for X := 0 to RootLevelCount-1 do
        begin
          case x of
            0: CurrentTextField := Dictionary.Items[Key].Column1;
            1: CurrentTextField := Dictionary.Items[Key].Column2;
            2: CurrentTextField := Dictionary.Items[Key].Column3;
          end;
          if CurrentTextField = '' then CurrentTextField := 'Level ' + IntToStr(x);
          if MyTreeNodeText[x] <> CurrentTextField then
            begin
              MyTreeNodeText[X]:=CurrentTextField;
              for X1 := x+1 to RootLevelCount-1 do
                MyTreeNodeText[x1]:='';
              if x=0 then
                begin
                 Node:= treeview1.Items.Add(nil, CurrentTextField);
                 MyTreeNode[x] := node;
                end else
                begin
                 node:=treeview1.Items.AddChild(MyTreeNode[x-1], CurrentTextField);
                 MyTreeNode[x] := node;
                end;
            end;
        end;
        MyTreeNodeText[RootLevelCount]:='';
  end;

  Dictionary.Free;
  Stroka.Free;



Это работает. Но решение удачным назвать нельзя (код частично не мой). Набор должен быть отсортирован по всем трем столбцам, иначе при формировании может быть двоение веток (но значения там, естественно, уникальные).

Есть ли более тривиальные (более простые в реализации варианты)? Чувствую, что загонять простую структуру (список обьектов из StringList, а потом их же свойства и методы) в таблицу (или подобие), чтобы потом это всю громоздкую структуру парсить обратно...

Спасибо.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Фильтрация дерева
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]