Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> XML + TreeView, Помогите выстроить дерево из XML 
:(
    Опции темы
Nchanged
Дата 23.1.2007, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 9.2.2006

Репутация: нет
Всего: нет



Здравствуйте!
Скажем есть хмл.
Код

<root>
<folder id="1" value="Главная">
  <folder id="1" value="Подглавной">
    <folder id="1" value="Подподглавной"></folder>
  </folder>        
  <folder id="2" value="Подглавной2"></folder>
</folder>
<folder id="2" value="О нас"></folder>
<folder id="3" value="Статьи"></folder>
</root>


Т.е, структура. Контент. Длится это ветка может бесконечно долго. Юзаю XMLdocument. Вопрос заключается в следущем. Как мне правильно выстроить структуру в TreeView. Имеется ли смысл, и как это реализоватЬ, если я буду испольовать OnExpanded. Т.е подгружать по мере надобности. 

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

P.S поиск юзал - ответов не нашел.

PM MAIL   Вверх
MetalFan
Дата 23.1.2007, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



а давай ты начнешь делать, дойдешь до ступора и выложишь что получилось, а мы тебе подскажем, как дальше, а?
а то получается нечто "напишите за меня программу, а то я программировать не умею - вхожу в ступор" ;)

з.ы. сырой алгоритм:
Код

1) для каждого нода должна храниться информация типа IsChildsLoaded и XMLNode
PTreeNodeData = ^TTreeNodeData;
TTreeNodeData = record
  IsChildrenLoaded: boolean;
  XMLNode: IXMLNode;
end;


2) функция вида: 
LoadTreeNodes( AParent: TTreeNode; AXMLNode: IXMLNode; ALevel: integer );
begin
  цикл от 0 до AXMLNode.кол-во_детей - 1  
  begin
     выделяешь память под новую запись TreeNodeData;
     заполняешь ее;
     создаешь новый treenode;
     если AXMLNode.и-тый ребенок имеет детей
       если ALevel>1 то 
           выставляешь IsChildrenLoaded := true;
           рекурсивно вызываешь LoadTreeNodes c ALevel-1 и необх.параметрами
       иначе
          IsChildrenLoaded := false;
  end;
end;

3) потом в OnExpanding проверяешь IsChildLoaded и загружаешь их в случае надобности

4) в OnDeletion не забыть освободить память!


Это сообщение отредактировал(а) MetalFan - 23.1.2007, 11:17


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Voyager
Дата 23.1.2007, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 8.2.2005

Репутация: 2
Всего: 18



Строил дерево так:
Код

procedure TWinForm1.Button1_Click(sender: System.Object; e: System.EventArgs);
var
  XMLDocument1: XMLDocument;
begin
  with OpenDialog1 do
  begin
    Filter := 'XML files (*.xml)|*.xml|All files (*.*)|*.*';
  end;
  if OpenDialog1.ShowDialog <> System.Windows.Forms.DialogResult.OK then Exit;
  XMLDocument1 := XMLDocument.Create;
  try
    XMLDocument1.Load(OpenDialog1.OpenFile);
    try
      tvXML.Nodes.Clear;
      D0MNode2TreeViewNode(XMLDocument1.DocumentElement, nil );
    except
      on E: Exception do
      begin
        MessageBox.Show( 'Error message:'#13#10 + E.Message);
      end;
    end;
  finally
    XMLDocument1.Free;
  end;
end;

procedure TWinForm1.D0MNode2TreeViewNode(aDOMNode: XMLNode; parentNode:TreeNode);
var i: Integer;
  ThisNode : TreeNode;
begin
  if not Assigned(ADOMNode) then Exit;
  ThisNode := tvXML.Nodes.Add(ADOMNode.Name);
  if not Assigned(ThisNode) then Exit;
  ThisNode.ImageIndex := 0;
  if Assigned(ADOMNode.Attributes) then
    for i := 0 to ADOMNode.Attributes.Count - 1 do
      with ThisNode.Nodes.add(ADOMNode.Attributes.Item(i).Name) do
        ImageIndex := 1;
  ThisNode.SelectedImageIndex := ThisNode.ImageIndex;
  if Assigned(ADOMNode.ChildNodes) then
    for i := 0 to ADOMNode.ChildNodes.Count - 1 do
      D0MNode2TreeViewNode(ADOMNode.ChildNodes[i],ThisNode);
end;

PM   Вверх
Rodman
Дата 1.2.2007, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 7
Всего: 122



Код

procedure XML2Tree(
          tree   : TTreeView; 
          XMLDoc : TXMLDocument);
var
  iNode : IXMLNode;

  procedure ProcessNode(
        Node : IXMLNode; 
        tn   : TTreeNode);
  var
    cNode : IXMLNode;
  begin
    if Node = nil then Exit;
    with Node do
    begin
      tn := tree.Items.AddChild(tn, Attributes['text']);
      tn.ImageIndex := Integer(Attributes['imageIndex']);
      tn.StateIndex := Integer(Attributes['stateIndex']);
    end;


    cNode := Node.ChildNodes.First;
    while cNode <> nil do
    begin
      ProcessNode(cNode, tn);
      cNode := cNode.NextSibling;
    end;
  end; (*ProcessNode*)
begin
  tree.Items.Clear;
  XMLDoc.FileName := ChangeFileExt(ParamStr(0),'.XML');
  XMLDoc.Active := True;

  iNode := XMLDoc.DocumentElement.ChildNodes.First;

  while iNode <> nil do
  begin
    ProcessNode(iNode,nil);
    iNode := iNode.NextSibling;
  end;

  XMLDoc.Active := False;
end;


Код

procedure Tree2XML(tree: TTreeView);
var
  tn : TTreeNode;
  XMLDoc : TXMLDocument;
  iNode : IXMLNode;

  procedure ProcessTreeItem(
        tn    : TTreeNode; 
        iNode : IXMLNode);
  var
    cNode : IXMLNode;
  begin
    if (tn = nil) then Exit;
    cNode := iNode.AddChild('item');
    cNode.Attributes['text'] := tn.Text;
    cNode.Attributes['imageIndex'] := tn.ImageIndex;
    cNode.Attributes['stateIndex'] := tn.StateIndex;

    //child nodes
    tn := tn.getFirstChild;
    while tn <> nil do
    begin
      ProcessTreeItem(tn, cNode);
      tn := tn.getNextSibling;
    end;
  end; (*ProcessTreeItem*)
begin
  XMLDoc := TXMLDocument.Create(nil);
  XMLDoc.Active := True;
  iNode := XMLDoc.AddChild('tree2xml');
  iNode.Attributes['app'] := ParamStr(0);

  tn := tree.TopItem;
  while tn <> nil do
  begin
    ProcessTreeItem (tn, iNode);

    tn := tn.getNextSibling;
  end;

  XMLDoc.SaveToFile(ChangeFileExt(ParamStr(0),'.XML'));

  XMLDoc := nil;
end; (* Tree2XML *)

PM MAIL WWW Skype GTalk YIM MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0838 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.