Virtual Treeview. Заполнение из таблицы БД.

windtalker
Дата: 21.11.2007 13:59:29
Древовидная струкура хранится в таблице со следующими полями: ID, ParentID, Name.
Как заполнить компонет Virtual Treeview данными из этой таблицы. Данные должны быть загружены разом, без загруизки по мере распахивания дерева.
Johnmen
Дата: 21.11.2007 14:17:14
Ну и загрузи их, куда тебе удобней. Напр. в массив. Оттуда бери для показа.
И смотри примеры. Насколько помню, они прилагаются к VTV.
windtalker
Дата: 21.11.2007 14:33:45
Примеры я конечно посмотрю. Но хотелось бы взглянуть на кусок когда. Может кто решал подобную задачу?
Johnmen
Дата: 21.11.2007 14:44:23
Да, кто-то решал. Хотя чего там "решать" совершенно непонятно. Или уже стандартное использование компонента называется "решением задачи"?
mvb
Дата: 21.11.2007 14:45:07
поищи на сайте Devrace готовый компонент TDBVirtualStringTree, он как раз для этого, только загружает не все данные сразу, а при распахивании ветки, хотя может это и настраивается где-нить...
LordMAD
Дата: 21.11.2007 14:57:36
windtalker
Примеры я конечно посмотрю. Но хотелось бы взглянуть на кусок когда. Может кто решал подобную задачу?
Если смотреть кусок примера, то это и будет куском кода. ;) У меня в проектах используются несколько стратегий для подобных твоему случаев, так что считаю, что рекомендовать какую-то конкретную стратегию - не стоит, однако сумую простую (можно сказать - решение "в лоб") приведу в качестве примера:
1. Выбираем данные в наследника TDataSet (по вкусу).
2. В клонированном курсоре отбираем верхний уровень иерархии и устанавливаем для VTV кол-во элементов.
3. При инициализации запоминаем bookmark для node.
4. По запросу от VTV значения переходим на bookmark и отдаем VTV значение.
5. При развертывании элемента в клонированном курсоре отбираем подчиненные элементы и устанавливаем для VTV кол-во элементов.

Но ты еще раз подумай насчет "без загруизки по мере распахивания дерева". ;)
matalata
Дата: 21.11.2007 15:29:55
windtalker
Древовидная струкура хранится в таблице со следующими полями: ID, ParentID, Name.
Как заполнить компонет Virtual Treeview данными из этой таблицы. Данные должны быть загружены разом, без загруизки по мере распахивания дерева.


Если разом, то значит база небольшая и можно тупо в бесконечном цикле просматривать
от first до eof записи и распихивать их по дереву.
После добавления очередной node запоминать во временном массиве номер записи (уникальный ключ) для того, тобы при следующем сканировании базы знать - добавлена ли запись в дерево ранее.
выход из бесконечного цикла если ни одна запись не добавлена.

Неясно будет что делать с висящими ParentID записями.

нужна будет процедурка для поиска в дереве нужного node по ID
m71
Дата: 21.11.2007 20:13:47
procedure TGetOrgsForm.BuildVST;
begin
  VST.BeginUpdate;
  VST.Clear;
  VST.NodeDataSize := Sizeof(TDirRec);
  BuildVSTL(nil);
  VST.EndUpdate;
end;


procedure TGetOrgsForm.BuildVSTL(PNode: PVirtualNode);
var
  CData,PData: POrgRec;
  CNode: PVirtualNode;
begin
  with TMSQuery.Create(Application) do
  try
    Connection := DM.MSConnection;

    SQL.Add('SELECT * FROM Organizations');

    if not Assigned(PNode) then 
    begin 
      SQL.Add('WHERE (org_parent  = 0)');
    end else
    begin
      PData := VST.GetNodeData(PNode);
      SQL.Add(Format('WHERE (org_parent  = %d)',[PData.OrgID]);
    end;

    SQL.Add('ORDER BY org_name');

    Open;
    while not Eof do
    begin
      CNode := VST.AddChild(ParentNode);

      CData := VST.GetNodeData(Node);
      CData^.OrgID     := FieldByName('org_id').AsInteger;
      CData^.OrgName   := FieldByName('org_name').AsString;
      CData^.OrgParent := FieldByName('org_parent').AsInteger;

      BuildVSTL(CNode);
    end;
    Close;
  finally
    Free;
  end;
end;


m71
Дата: 21.11.2007 20:15:26
Там в цикле Next пропущен
treefeed
Дата: 21.11.2007 20:29:45
windtalker
Примеры я конечно посмотрю. Но хотелось бы взглянуть на кусок когда. Может кто решал подобную задачу?


Хорошую справку(и код примеров) на русском языке смотри здесь:
http://quadr0.pochta.ru/VirtualTreeview/virtualtreeview.zip
http://quadr0.pochta.ru/VirtualTreeview/virtualtreeview_pdf.zip