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

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

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

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

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

Best regards,
Dnico.
...
Рейтинг: 0 / 0
05.08.2004, 11:12:59
    #32636416
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево, FIBPlus и RALib
Вот сообственно весь код (правда на 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
05.08.2004, 12:39:58
    #32636629
dreamy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево, FIBPlus и RALib
Спасибо ) обязательно попробую ) об обычном TTreeView как-то сразу не подумал ))
...
Рейтинг: 0 / 0
05.08.2004, 12:45:40
    #32636645
russdk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево, FIBPlus и RALib
Есть такая штука ExpressQuantumGrid 3.2 там есть моднейшие компоненты для
работы с деревьями (dxDBTreeList). Качни попробуй.
...
Рейтинг: 0 / 0
06.08.2004, 07:45:47
    #32637910
Nikola18
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево, FIBPlus и RALib
Как тут любят говорить: тынц
...
Рейтинг: 0 / 0
06.08.2004, 08:44:49
    #32637934
dreamy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево, FIBPlus и RALib
Всем спасиба! Идеально на мой взгляд подошел первый вариант с обычным TTreeView. На удивление удачно все работает!
...
Рейтинг: 0 / 0
06.08.2004, 13:52:40
    #32638639
Alto
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево, FIBPlus и RALib
Отпиши лучше по совету Nikola18 с виртуалтривью... если хочешь пошевелить ручками или платными по совету russdk
Проблема проста: кеширование ветвей при больших деревьях... иначе затык будет полным ;)
...
Рейтинг: 0 / 0
11.08.2004, 15:38:07
    #32644910
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дерево, FIBPlus и RALib
авторПроблема проста: кеширование ветвей при больших деревьях... иначе затык будет полным ;)
Так я же и привел вариант быстрого TreeView. Это работает на 12000 записях в таблице и никаких затыков ...

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


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