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

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

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

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

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

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

это TInspListBox.

можешь попробовать (https://github.com/RRUZ/Delphi-IDE-Colorizer/blob/master/IDE%20PlugIn/Galileo/IDEInspListBox.TInspListBox.pas)
...
Рейтинг: 0 / 0
07.04.2021, 18:42
    #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
07.04.2021, 22:37
    #40060533
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтрация дерева
А вложенный класс может попасться?
...
Рейтинг: 0 / 0
08.04.2021, 07:45
    #40060580
bzums
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтрация дерева
Неа
...
Рейтинг: 0 / 0
08.04.2021, 08:00
    #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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Фильтрация дерева / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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