Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > VirtualTreeView


Автор: aaav 4.3.2009, 12:12
Добрый день.

заполняю VTreeView из БД, структура не дерево, реализация - как описано в статье.
Т.к. в таблице много полей, то в VTreeView - отображаю только несколько столбцов.
Подскажите как можно сделать что бы в каждой строке всегда отображался + и по его нажатию (Expanding) - разворачивался список с дочерними ветками (addChild) в которые занести данные других столбцов таблицы.

Спасибо!

Автор: Poseidon 4.3.2009, 12:32
Так если у тебя addChild, то + автоматически появится.

Автор: aaav 4.3.2009, 12:43
дочерних узлов первоначально нет, заполнил из БД и все (но прорисовал не все столбцы, их много), теперь хочу отобразить + и по его нажатию сделать добавление дочерних узлов, а в них добавить в данные из остальных столбцов

Автор: Poseidon 5.3.2009, 00:31
Цитата(aaav @  4.3.2009,  12:43 Найти цитируемый пост)
теперь хочу отобразить + и по его нажатию сделать добавление дочерних узлов
Если хочется сделать именно так, то добавь к каждому RootNode по одному ребенку (addChild) и получишь свои плюсики. Но лично я бы свормировал сразу все дерево и ничего потом уже не подгужал. VT позволяет загружать несколько тысяч веток практически мгновенно.

Автор: pethead 10.3.2009, 10:31
пробую так же отобразить на VT выборку из БД.
но я работаю с mysql напрямую потому у меня данные возвращаются в структурах Row: PMYSQL_ROW; количество я получаю через mysql_field_count и потом перебором пока not nil выбираю Row:=mysql_fetch_row
вот думаю как бы прикрутить VT по примеру из доки...



Автор: aaav 11.3.2009, 00:49
Делаю как в примере в статье:

Код

type
  MyNode = ^TMyNode;
  TMyNode = record
    ID : Integer;
    Name_1, Name_2, Name_3 : WideString;
    Initialized: Boolean;
  End;


procedure TMyForm.FormCreate(Sender: TObject);
begin
  VMyTree.NodeDataSize :=SizeOf(TMyNode);
end;


procedure TMyForm.LoadVMyTree;
begin
  With VMyTree Do
    begin
      Clear;
      NodeDataSize :=SizeOf(TMyNode);
      RootNodeCount :=MyQuery.RecordCount;
    end;
end;

procedure TMyForm.VMyTreeFreeNode(Sender: TBaseVirtualTree;
  Node: PVirtualNode);
Var
  MyNode : PMyNode;
begin
  MyNode := Sender.GetNodeData(Node);
  If Assigned(MyNode) then
    Finalize(MyNode^);
end;

procedure TMyForm.VMyTreeGetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: WideString);
Var
  MyNode : PMyNode;
begin
  MyNode := Sender.GetNodeData(Node);
  Case Column Of
    0: CellText :=IntToStr(MyNode.ID);
    1: CellText :=MyNode.Name_1;
  end;
end;

procedure TMyForm.VMyTreeInitNode(Sender: TBaseVirtualTree; ParentNode,
  Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
Var
  MyNode: PMyNode;
begin
  MyNode := Sender.GetNodeData(Node);
  If Not MyNode.Initialized then
    begin
      Initialize(MyNode^);
      With MyNode^ Do
        begin
          ID := MyQuery.FieldByName('ID').AsInteger;
          Name_1 :=MyQuery.FieldByName('NAME_1').AsString;
          Name_2 :=MyQuery.FieldByName('NAME_2').AsString;
          Name_3 :=MyQuery.FieldByName('NAME_3').AsString;
          Initialized := True;
        end;
    end;
  If Not MyQuery.Eof Then
    MyQuery.Next;
end;


все великолепно работает, но я хочу что бы в дереве выводилось не только линейно ID, Name_1, но и у каждой такой строки были бы дочерние узлы содержащие каждый Name_2 и Name_3

как такое можно реализовать?

Автор: aaav 14.3.2009, 11:55
Неужели никто не подскажет?

Автор: aaav 30.3.2009, 20:56
Может все же кто-то поможет?

Автор: pethead 1.4.2009, 18:24
ну так порождая эти ноды и заполняй их. а так ты сам все делаешь линейно - линейно и выходит.

Автор: AndrewPA 12.4.2009, 17:00
я думаю что в событии InitNode можно добавить к записи RootNode (или 0 level) свойство - имеет детей InitialStates:=InitialStates+[vchashchildren]
У тебя у каждой записи появится + по которому ты можешь нажать и вывзвать событие initchildren где укажешь сколько детей ты хочешь показать узла и после этого у тебя будет вызов GetText для детей.
Чтото типа того

Автор: dvamaster 15.4.2009, 08:20
Еще вариант, добавить Child с названием к примеру "идет запрос". При раскрытии выполняешь запрос и обновляешь детей, удаляя самый первый ("идет запрос").

Получишь еще и визуальную "симпатяшку"  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)