Подписка

Проекты

Сборник идей для разработок в Delphi и использования их в Интернет. Участвуй в работе коллективного разума!

Google API в Delphi - проект с открытым исходным кодом.


А тут я коплю на лицензию Delphi 2011. Сумма пожертвования не фиксирована.

Друзья блога

Блоги и сообщества

DelphiFeeds.ru - Все Delphi-блоги Рунета О раскрутке блога по программированию Сообщество умных людей VR-Online.RU Бесплатный журнал для программистов и всех, кто интересуется IT Статьи и уроки по Delphi Статьи по Delphi

Счётчики


Анализ веб сайтов

Рейтинг блогов




Система Orphus

  • 21Feb

    В прошлый раз мы строили дерево TreeView по данным из XML-документа. Сегодня проведем обратное преобразование – сохраним дерево TreeView любой сложности в XML-файл, чтобы довести работу до логического завершения. Раз научились читать документ – надо научиться его и правильно сохранять.
    Для решеня этой задачи вы можете воспользоваться как прошлым примером и уже имеющимся списком узлов TNodeList, так и процедурой, которую мы рассмотрим в этом посте.
    ' '
    Для решения задачи нам потребуется опять же:

    1. Модули XMLDoc и XMLIntf для работы с XML
    2. Компонент TreeView

    Для сохранения дерева TreeView в XML будем использовать рекурсию. Работу организуем следующим образом:

    1. Создадим объект TXMLDocument или воспользуемся IXMLDocument - не важно.
    2. Создадим один узел (Root Node) с необходимыми нам атриутами
    3. Создадим процедуру-обработчик для каждого элемента TreeView
    4. Используя процедуру-обработчик, рекурсивно обойдем все узлы дерева и запишем данные из них в XML-документ
    5. Сохраним XML-документ в файл.

    Начнем с процедуры-обработчика. В принципе, она не сильно будет отличаться от аналогичной уже рассмотренной. Выглядит она следующим образом:

    procedure ProcessTreeItem(tn: TTreeNode; iNode: IXMLNode);
    var
    cNode : IXMLNode;
    begin
    if (tn = nil) then Exit;
    cNode:= iNode.AddChild(tn.Text);//имя узла
    {атрибуы узла}
    cNode.Attributes['Text'] := tn.Text;
    cNode.Attributes['Level'] := IntToStr(tn.Level);
    //дочерние узлы
    tn := tn.getFirstChild;
    while tn <> nil do
    begin
    ProcessTreeItem(tn, cNode);
    tn := tn.getNextSibling;
    end;
    end;

    То есть в ProcessTreeItem мы динамически создаем узлы XML-документа, присваивая им необходимые имена и атрибуты и работая на том же уровне, что и iNode (вызывающий узел). Можете доработать обработчик в соответствии со своими потребностями. Например, можно сделать, чтобы имена присваивались не по названию узла в дереве, а теже, что и спользовались в списке TNodeList и т.д..
    Теперь напишем саму процедуру сохранения дерева, включив в неё и приведенную выше ProcessTreeItem. Вот полный листинг процедуры сохранения TreeView в XML-файл:

    procedure TXMLTree.SaveTreeToXML;
    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(tn.Text);//имя узла
    {атрибуы узла}
    cNode.Attributes['Text'] := tn.Text;
    cNode.Attributes['Level'] := IntToStr(tn.Level);
    //дочерние узлы
    tn := tn.getFirstChild;
    while tn <> nil do
    begin
    ProcessTreeItem(tn, cNode);
    tn := tn.getNextSibling;
    end;
    end;
     
    begin
      XMLDoc := TXMLDocument.Create(nil);
      XMLDoc.Active := True;
      iNode := XMLDoc.AddChild('Skin');//создаем корневой элемент
      //атрибуты корневого узла
      iNode.Attributes['name']:='MySkin';
      iNode.Attributes['author']:='vlad';
     
      tn := Tree.TopItem;
      while tn <> nil do //бегаем в цикле пока не пройдемся по всем узлам TreeView
      begin
        ProcessTreeItem (tn, iNode);
        tn := tn.getNextSibling;
      end;
      //сохраняем файл
      XMLDoc.SaveToFile(ChangeFileExt(ParamStr(0),'.XML'));
      //уничтожаем объект
      XMLDoc := nil
    end;

    Вот собственно и вся работа по сохранению TreeView в XML. Все достаточно просто и компактно.

    ---------------------------
    Интересуетесть вопросом о том как раскрутить блог ? Заходите на timnet.ru. Поверьте, в этом блоге есть чему поучиться. И, кстати, про "поучиться". Если лень писать реферат самому, то можете скачать бесплатные рефераты из Банка Рефератов.
    ---------------------------

    Related posts:

    1. Показываем XML-файл любой сложности в виде TreeView.
    2. Lazarus: автоматическое сохранение индивидуальных настроек приложения
    3. Google Data Protocol. Разбор элементов Entry.

    Автор Vlad в 2:03 pm

    Метки: , , ,

Ваш ответ

Внимание: Все комментарии модерируются, и это может вызвать задержку их публикации. Отправлять комментарий заново не требуется.

Пожалуйста, заключайте исходный код в тэги [code][/code].