powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Дерево, FIBPlus и RALib
9 сообщений из 9, страница 1 из 1
Дерево, FIBPlus и RALib
    #32636220
dreamy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня есть таблица, представляющая древовидную структуру:
Код: plaintext
1.
2.
  id (PK)
  parent (FK на id)
  data

В свое время я искал компоненты для C++Builder, которые позволяли бы отображать такие данные в виде TreeView и нашел в библиотеке RALib компонет TRADBTreeView, который отлично справшяется с задачей.

В какой-нибудь отдельной форме происходит заполнение таблицы новыми данными - INSERT одной строки, после чего нужно перерисовать дерево в TreeView с учетом появления нового "листика" и поставить на этот "лист" указатель. Делаю я это переоткрытием связанного с RADBTreeView датасета: pFIBDatasetTree->CloseOpen(), что выглядит в итоге некрасиво и медленно.

Как можно сделать добавление "листка" в дерево без переоткрытия датасета? Может, есть альтернативы TRADBTreeView?
...
Рейтинг: 0 / 0
Дерево, FIBPlus и RALib
    #32636358
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то есть самый простой способ и быстроработающий - это использовать
простой компонент TTreeView.

И подгружать ветви по мере их открытия. Скорость офигительная и видны все изменения. И датасет всезда закрыт ...

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Дерево, FIBPlus и RALib
    #32636416
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот сообственно весь код (правда на Delphi, но суть одинакова):

Код: plaintext
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.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
unit tree;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, DB, StdCtrls, ExtCtrls, IBCustomDataSet, IBQuery;

type
  TFlyTree = class(TForm)
    tvTree: TTreeView;
    qryTree: TIBQuery;
    procedure tvTreeExpanding(Sender: TObject; Node: TTreeNode;
      var AllowExpansion: Boolean);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    procedure GetExpandingItems(var Node: TTreeNode);
    { Public declarations }
  end;

  {структура ItemRec хранит информацию об узле дерева для отображения на форме.
   Каждый узел дерева Node у TreeView имеет указатель на структуру Node.Data.
   имена полей ItemRec соответствуют именам полей таблицы TREE.}
  PItemRec = ^ItemRec;
  ItemRec = record
    ParentId: string;
    Id: string;
    Name: string;
    Legatees: integer;
  end;

var
  FlyTree: TFlyTree;

implementation

uses …;
{$R *.dfm}

procedure TFlyTree.tvTreeExpanding(Sender: TObject; Node: TTreeNode;
  var AllowExpansion: Boolean);
begin
  GetExpandingItems(Node);
end;

procedure TFlyTree.GetExpandingItems(var Node: TTreeNode);
var
  NewNode: TTreeNode;
  R: PItemRec;
begin
  if Node = nil then
    qryTree.ParamByName('PARENTID').asString := '0' // Корневые элементы
  else
    begin
      Node.Selected := true;
      R := Node.Data;
      qryTree.ParamByName('PARENTID').asString := R.ID;
      // удаляются потомки узла, чтобы при добавлении узлов
      // из запроса потомки не дублировались
      Node.DeleteChildren;
    end;

  qryTree.Open;
  qryTree.First;

	// в цикле при раскрытии узла к текущему узлу добавляются потомки
  while not qryTree.Eof do
    begin
      NewNode := tvTree.Items.AddChildObject(
      tvTree.Selected, Trim(qryTree.FieldByName('NAME').asString), nil);
      // При добавлении узла резервируется память под данные этого узла
      New(R);
      NewNode.Data := R;
      R.ParentId := qryTree.FieldByName('PARENTID').asString;
      R.Id := qryTree.FieldByName('ID').asString;
      R.Name := Trim(qryTree.FieldByName('NAME').asString);
      R.Legatees := qryTree.FieldByName('LEGATEES').asInteger; // Если есть потомки, то =  1 , нет =  2 

      // если число потомков >  0  , у узла имеется плюсик(+).
      NewNode.HasChildren := R.Legatees;

      qryTree.Next;
    end;
  // нарисовали потомков узла - закроем запрос :-)
  qryTree.Close;
end;


procedure TFlyTree.FormCreate(Sender: TObject);
var
  CanBeExpanded: Boolean;
begin
  qryTree.SQL.Clear;
  qryTree.SQL.Add(‘SELECT ID, PARENTID, NAME, LEGATEES FROM TABLE_TREE WHERE PARENTID = :PARENTID’);
  CanBeExpanded := false;
  // при открытии формы раскрываем узлы, относящиеся только к корню (nil).
  tvTreeExpanding(self, nil, CanBeExpanded);
end;

end.


Best regards,
Dnico.
...
Рейтинг: 0 / 0
Дерево, FIBPlus и RALib
    #32636629
dreamy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо ) обязательно попробую ) об обычном TTreeView как-то сразу не подумал ))
...
Рейтинг: 0 / 0
Дерево, FIBPlus и RALib
    #32636645
russdk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть такая штука ExpressQuantumGrid 3.2 там есть моднейшие компоненты для
работы с деревьями (dxDBTreeList). Качни попробуй.
...
Рейтинг: 0 / 0
Дерево, FIBPlus и RALib
    #32637910
Nikola18
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как тут любят говорить: тынц
...
Рейтинг: 0 / 0
Дерево, FIBPlus и RALib
    #32637934
dreamy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасиба! Идеально на мой взгляд подошел первый вариант с обычным TTreeView. На удивление удачно все работает!
...
Рейтинг: 0 / 0
Дерево, FIBPlus и RALib
    #32638639
Alto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отпиши лучше по совету Nikola18 с виртуалтривью... если хочешь пошевелить ручками или платными по совету russdk
Проблема проста: кеширование ветвей при больших деревьях... иначе затык будет полным ;)
...
Рейтинг: 0 / 0
Дерево, FIBPlus и RALib
    #32644910
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПроблема проста: кеширование ветвей при больших деревьях... иначе затык будет полным ;)
Так я же и привел вариант быстрого TreeView. Это работает на 12000 записях в таблице и никаких затыков ...

Best regards,
Dnico.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Дерево, FIBPlus и RALib
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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