Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2009, 17:10   #1
SergGhost
Пользователь
 
Аватар для SergGhost
 
Регистрация: 25.09.2008
Сообщений: 39
По умолчанию сохранение структуры TreeView

Товарищи, подскажите пожалуйста.
На форме есть компонент TreeView. Пользователь добавляет или удаляет какие то узлы. Мне необходимо сохранить изменения произошедшие в дереве. Как это сделать?
P.S. Не забудь жамкнуть на весы.
Хотя и сладостен азарт по сразу двум идти дорогам, нельзя одной колодой карт играть и с дьяволом и с богом.
SergGhost вне форума Ответить с цитированием
Старый 26.05.2009, 17:12   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Насколько я знаю есть у ее ITEMS метод SaveToFile.
Попробуй его.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.05.2009, 18:35   #3
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Если дерево простенькое, то воспользуйтесь мудрым советом Стилета.
А вот если там мегабайты инфы, лучше бы использовать БД.
Опять же и поиск организовать можно, и прочие полезные прибамбасы...
mihali4 вне форума Ответить с цитированием
Старый 26.05.2009, 18:44   #4
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Стрелка

Можете на основе этих процедур сделать, поменяете, добавите чего-то своё в них:
1) Сохранение дерева(так же удобно сохранять содержимое из Data узла):
Код:
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'] := 'My Tree';

  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 *)
2) Загрузка, почти то же самое:
Код:
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;
Alter вне форума Ответить с цитированием
Старый 26.05.2009, 23:34   #5
SergGhost
Пользователь
 
Аватар для SergGhost
 
Регистрация: 25.09.2008
Сообщений: 39
По умолчанию

Я первым делом это и проверил, но оказалось, что метод SaveToFile есть у TreeView, а не у его Index, этого не знал))). Но как я понял, этот метод не совсем надежен.
Пытался воспользоваться процедурами Alter'а. С сохранением вроде все в норме, а вот с загрузкой, что то не получается. При вызове процедуры указываю имя treeview и имя файла:
XML2Tree(treeview1,XMLDoc); Delphi даже не компилирует. пишит следующее: '.'expected bot ')' found
Если ставить точку, то можно установить только TXMLDocument, но Delphi опять эт не нравится. Почему?
P.S. Не забудь жамкнуть на весы.
Хотя и сладостен азарт по сразу двум идти дорогам, нельзя одной колодой карт играть и с дьяволом и с богом.
SergGhost вне форума Ответить с цитированием
Старый 27.05.2009, 15:22   #6
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Почему ошибка? Поподробнее можно, где ошибка, и код куда засунули(если возможно).
Это проверенные процедуры, ошибок не должно вылазить.
Вот Demo, увидите, что работают без ошибок:
Вложения
Тип файла: rar TreeView_XML_Demo.rar (10.2 Кб, 149 просмотров)

Последний раз редактировалось Alter; 27.05.2009 в 15:39.
Alter вне форума Ответить с цитированием
Старый 27.05.2009, 18:31   #7
SergGhost
Пользователь
 
Аватар для SergGhost
 
Регистрация: 25.09.2008
Сообщений: 39
По умолчанию

Спасибо огромное, исходник очень помог
P.S. Не забудь жамкнуть на весы.
Хотя и сладостен азарт по сразу двум идти дорогам, нельзя одной колодой карт играть и с дьяволом и с богом.
SergGhost вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
treeview cheef Компоненты Delphi 3 15.04.2009 15:18
TreeView ddr111 Общие вопросы Delphi 7 31.03.2009 00:35
Сохранение в файл сложной динамической структуры _Инженер_ Общие вопросы Delphi 24 20.10.2008 09:38
сохранение структуры (динамические списки очередей) в файле AlenaZ Помощь студентам 2 09.06.2008 20:14
Сохранение и загрузка узлов TreeView из базы данных Ko$tello Компоненты Delphi 1 14.11.2006 17:15