Какая лучшая бесплатная реализация Tree Party для Delphi? - PullRequest
5 голосов
/ 09 мая 2011

Мне нужна древовидная реализация, которую я могу использовать с Virtual Treeview, которая не потребляет слишком много памяти, проста в использовании и работает так же быстро, как VT (то есть когда я храню свои данные вСам VT)

Я попробовал svTree от Linas - он прост в использовании, но не настолько быстр и не требует много памяти, как я надеялся.

Также хочу отметить, что мое приложениебудет управлять тысячами узлов.:)

Какую бесплатную библиотеку вы рекомендуете?И сможете ли вы создать минимальную демонстрацию того, как использовать ее с Virtual Treeview?

Ответы [ 4 ]

3 голосов
/ 10 мая 2011

Вам не нужны элементы управления или библиотеки для запоминания данных.Вам нужно придумать структуру данных, которая соответствует вашим потребностям.Последний шаг - использование VTV или любого другого элемента управления для отображения вашей структуры данных.Перестаньте на минуту задумываться о графическом интерфейсе и подумайте, как вы хотите построить структуру данных.Подумайте о шаблонах проектирования и старомодном программировании, списках ссылок, массивах, очередях, хэш-листах / словарях, красных / черных деревьях и т. Д. У каждого есть свои плюсы и минусы в отношении скорости и использования памяти при поиске, обходе, добавлении.Существуют библиотеки (например, http://www.boyet.com/FixedArticles/EZDSL.html), которые имеют базовые строительные блоки, но вы должны выяснить, чего вы хотите. Если вы застряли там, я советую вам задать новый вопрос и указать требования к вашей структуре данных.Возможно, вы захотите прочитать https://sites.google.com/site/igetfreebook/The-Tomes-of-Delphi-Algorithms-and-Data-Structures

Если ваш вопрос касается элемента управления с графическим интерфейсом, который также хранит ваши данные, то мне интересно, почему вы не хотите использовать VTV. Возможно, другие элементы управления проще,но с точки зрения дизайна они не лучше. Вы по-прежнему храните свои данные в элементе управления с графическим интерфейсом.

3 голосов
/ 09 мая 2011

Посмотрите на компонент rmTreeNonView в библиотеке rmControls .

Мы годами использовали модифицированную версию этого дерева в качестве контейнера данных.Он бесплатный, быстрый, невизуальный, поставляется с исходным кодом и с ним легко начать работу, потому что методы и свойства TTreeView дублируются почти на 100%, а также добавляются некоторые собственные методы - в частности, быстрый поиск по дереву по хешупути к узлам.

Я сомневаюсь, что компания уже в бизнесе (http://www.mills -enterprise.ca), но пакет rmControls, включая source, доступен на многих сайтах загрузки Delphi.

Вот некоторый код, показывающий, как указывать на узлы в другой древовидной структуре из узлов VTV ... надеюсь, я включил достаточно кода, чтобы вы могли видеть, что происходит.TmwDataTreeNode является узлом потомка TTreeNonView.Обратите внимание, что когда метод PopulateVT завершен, поле ContextNode каждого TNodeData указывает на узел в дереве контейнера исходных данных.Обратите внимание, что этот подход не использует виртуальную природу VTV, которая, скорее всего, более подходит для вашей ситуации.

type
      //Virtual tree record stuff
  PNodeData = ^TNodeData;
  TNodeData = record
  public
    NodeSelf: PVirtualNode;         //Ptr to our own VT node...needed?
    ContextNode: TmwDataTreeNode;        //ptr to our corresp node of data tree
    GridRecordIndex: integer;      //Grid.RecordIndex of our corresp Alloc formula.
  end;


procedure T_fmExplAllocOut.PopulateVT;
{ Load data to the DragDrop treeview. }
var
  n: TmwDataTreeNode;        //Pointer to a node of my customized TTreeNonView
begin
  VT.NodeDataSize := SizeOf(TNodeData);
  VT.BeginUpdate;
  vtsChangeFontSize(VT, Self.Font.Size);     //Set Tree Font.Size & DefaultNodeHeight
      //Add DragDrop Tree nodes
  n := AllocController.SnapContext.Tree.Items.GetFirstNode;
  while n <> nil do begin
    AddVTNode(nil, n);              //nil=parent node of top-level VT nodes
    n := n.GetNextSibling;
  end;
  VT.FullExpand;
  VT.EndUpdate;
end;


procedure T_fmExplAllocOut.AddVTNode(VTParentNode: PVirtualNode; n: TmwDataTreeNode);
{ Recursively add n & its children to VT. }
var
  NodeData: PNodeData;
  VTNode: PVirtualNode;
begin
  if (n = nil) or not NodeInIncludeFilter(n) then
    exit;
      //Add this node
  VTNode := VT.AddChild(VTParentNode);
  NodeData := VT.GetNodeData(VTNode);
  VT.ValidateNode(VTNode, False);        //else OnFreeNode won't get called
  with NodeData^ do begin
    NodeSelf :=         VTNode;
    ContextNode :=      n;
    GridRecordIndex := -1;
  end;
      //Add child nodes
  n := n.GetFirstChild;
  while n <> nil do begin
    AddVTNode(VTNode, n);            //Pass our added node as Parent
    n := n.GetNextSibling;
  end;
end;
2 голосов
/ 10 мая 2011

Похоже, у вас есть вполне конкретные потребности, поэтому я чувствую, что не будет полного решения, которое бы точно соответствовало вашим требованиям.

Мое первое предложение - использовать базу данных. Он обладает всеми необходимыми мне функциональными возможностями, а также дополнительными бонусами за надежность и высокую скорость работы. Конечно, вам придется написать некоторые из ваших подпрограмм, чтобы обрабатывать добавление / удаление / вставку / редактирование данных и т. Д. Реляционная база данных сможет хранить все ваши отношения между вашими категориями и легко изменять отношения между вашими записями (узлы). Потратьте время, чтобы узнать, как хранить иерархические данные, а затем отношения между вашими узлами. Хорошо спроектированная база данных предоставит вам все особенности вашего проекта. MySQL бесплатен и очень прост в использовании. Небольшая площадь, но очень быстрая. Посмотрите на эту статью, чтобы вы подумали о том, как древовидные структуры данных могут храниться реляционным способом: Реляционные древовидные структуры данных .

Сказав это, я не уверен, что это то, что вы ищете.

Пример того, как база данных может хранить ваше дерево:

Sample Tree from a database

Если база данных невозможна, тогда я бы посоветовал вам написать свой собственный класс. Только вы знаете, как ваши данные управляются и объединяются. Следовательно, вы можете написать точную функциональность, которой нужно манипулировать и обрезать дерево. Начните с просмотра TObjectList. Создайте свой объект класса, который хранит данные для каждого узла. Затем вы можете создать список этих объектов для хранения всех ваших узлов. Напишите методы для имитации действий пользователя над вашим деревом, например, Добавление, обновление, перемещение и т. Д. Это может занять некоторое время, но это действительно поможет вам учиться и принесет пользу вам, как разработчику приложений. Задавайте вопросы по ходу дела, когда застреваете.

0 голосов
/ 10 мая 2011

Некоторые интересные невизуальные деревья перечислены в ответах на: Delphi невизуальная реализация TTree

Одно из них может удовлетворить ваши потребности.

...