Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Фильтрация дерева  [new]
bzums
Member

Откуда:
Сообщений: 108
Как можно организовать фильтрацию по дереву (TreeView или TreeList). Наподобие того, как реализовано в испекторе объкутов Delphi - набрал текст, пропали все не относящиеся к строке поиска строки.
То, что я сейчас вижу - нужно перестраивать все дерево (у меня оно тупо по стриглисту рисуется).

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

Спасибо.
7 апр 21, 12:18    [22305348]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация дерева  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52887

Посмотри Virtual Tree View.

Posted via ActualForum NNTP Server 1.5

7 апр 21, 12:20    [22305349]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация дерева  [new]
bzums
Member

Откуда:
Сообщений: 108
Спасибо.
Вот прям ожидал этот ответ :-)
Посредством стандартных компонентов не получится никак?

Ну то есть одно то решение есть - пересоздать дерево (благо оно маленькое, менее 100 узлов).
7 апр 21, 12:25    [22305350]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация дерева  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32182

07.04.2021 12:25, bzums пишет:
> Ну то есть одно то решение есть - пересоздать дерево

со стандартным деревом иных путей нет.

Posted via ActualForum NNTP Server 1.5

7 апр 21, 12:27    [22305353]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация дерева  [new]
bzums
Member

Откуда:
Сообщений: 108
А вот тут что за компонент (родной дельфийский инспектор)?

Дерево есть, но странное такое.

К сообщению приложен файл. Размер - 35Kb
7 апр 21, 12:40    [22305360]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация дерева  [new]
DHDD
Member

Откуда:
Сообщений: 88
bzums,

это TInspListBox.

можешь попробовать (https://github.com/RRUZ/Delphi-IDE-Colorizer/blob/master/IDE%20PlugIn/Galileo/IDEInspListBox.TInspListBox.pas)
7 апр 21, 14:10    [22305416]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация дерева  [new]
bzums
Member

Откуда:
Сообщений: 108
Прежде чем делать, спрошу совета у умных людей.

У меня имеется дерево, которое необходимо построить.
Выглядит оно таким образом:
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

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

Большое спасибо.
7 апр 21, 18:42    [22305635]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация дерева  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2507
А вложенный класс может попасться?
7 апр 21, 22:37    [22305715]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация дерева  [new]
bzums
Member

Откуда:
Сообщений: 108
Неа
8 апр 21, 07:45    [22305778]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация дерева  [new]
bzums
Member

Откуда:
Сообщений: 108
Для хранения использую Диктионари
type
  TStroka= class
    Column1: String;
    Column2: String;
    Column3: String;
  end;
var
  Dictionary: TDictionary <Integer, TStroka>;
  Stroka: TStroka;


Список обектов хранится в MyStringList
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;



Построение дерева ниже:
  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, а потом их же свойства и методы) в таблицу (или подобие), чтобы потом это всю громоздкую структуру парсить обратно...

Спасибо.
8 апр 21, 08:00    [22305780]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить