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

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

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2013, 22:11   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Вопрос Загрузка из XML в TreeView

Доброго!

Написал сохранение TreeView в XML. А вот с загрузкой что-то туплю...

Сохранение:
Код:
procedure TForm11.SaveTreeItems;
var
  xml: TNativeXml;
  xRoot: TXMLNode;
  Node: TTreeNode;
  i: Integer;

  procedure ProcessTreeItem(aNode: TTreeNode; aRoot: TXmlNode);
  var
    cNode: TXmlNode;
    Data: pNodeData;
    i: Integer;
  begin
    if Assigned(aNode.Data) then
    begin
      Data := aNode.Data;
      cNode := aRoot.NodeNew(Data.Name);
      cNode.WriteAttributeString('Name', Data.Name);
      cNode.WriteAttributeString('File', Data.SourceFile);
    end
    else
      cNode := aRoot.NodeNew(aNode.Text);

    for i := 0 to aNode.Count - 1 do
      ProcessTreeItem(aNode.Item[i], cNode);
  end;

begin
  xml := TNativeXml.CreateName('Book');
  try
    with xml.Root do
    begin
      xRoot := NodeNew('Pages');
    end;
    Node := TreeView1.TopItem;
    ProcessTreeItem(Node, xRoot);
    xml.XmlFormat := xfReadable;
    xml.Charset := 'ansi';
    xml.SaveToFile(ExtractFilePath(ParamStr(0)) + 'TreeView.xml');
  finally
    FreeAndNil(xml);
  end;
end;
Как её правильно перевернуть для чтения?

Сейчас есть это:
Код:
var
  xml: TNativeXml;
  xRoot: TXMLNode;
  Node: TTreeNode;
  i: Integer;

  procedure FillTree(aXmlNode: TXmlNode; aTreeNode: TTreeNode);
  var
    pData: pNodeData;
    tNode: TTreeNode;
    i: Integer;
  begin
    New(pData);
    pData.Name := aXmlNode.ReadAttributeString('Name');
    pData.SourceFile := aXmlNode.ReadAttributeString('File');
    tNode := TreeView1.Items.AddChildObject(aTreeNode, pData.Name, pData);

    for i := 0 to aXmlNode.NodeCount - 1 do
      FillTree(aXmlNode.Nodes[i], tNode);
  end;

begin
  if not FileExists(ExtractFilePath(ParamStr(0)) + 'TreeView.xml') then
    Exit;
  xml := TNativeXml.CreateName('Book');
  try
    xml.XmlFormat := xfReadable;
    xml.Charset := 'ansi';
    xml.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'TreeView.xml');
    with xml.Root do
    begin
      xRoot := NodeByName('Pages').FirstNodeByType(xeElement);
    end;
    FillTree(xRoot, TreeView1.TopItem);

  finally
    FreeAndNil(xml);
  end;
end;
Загружает почти правильно, но в дереве появляются пустые ветки. Как правильно реализовать-то?
Человек_Борща вне форума Ответить с цитированием
Старый 19.04.2013, 12:51   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

проблему решил прокрутив страницу вниз.
Человек_Борща вне форума Ответить с цитированием
Старый 08.05.2013, 08:02   #3
XerSon
Форумчанин
 
Аватар для XerSon
 
Регистрация: 21.01.2008
Сообщений: 211
По умолчанию

Может поможет пример в аттаче.
Вложения
Тип файла: zip XML Editor.zip (22.1 Кб, 36 просмотров)
XerSon вне форума Ответить с цитированием
Старый 08.05.2013, 08:03   #4
XerSon
Форумчанин
 
Аватар для XerSon
 
Регистрация: 21.01.2008
Сообщений: 211
По умолчанию

Человек_Борща

А как организовать поиск определенного значения?
XerSon вне форума Ответить с цитированием
Старый 08.05.2013, 17:31   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Я инкрементным поиском TreeView пользовался.
Человек_Борща вне форума Ответить с цитированием
Старый 08.05.2013, 19:20   #6
XerSon
Форумчанин
 
Аватар для XerSon
 
Регистрация: 21.01.2008
Сообщений: 211
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Я инкрементным поиском TreeView пользовался.
Можно пример?
XerSon вне форума Ответить с цитированием
Старый 08.05.2013, 22:41   #7
XerSon
Форумчанин
 
Аватар для XerSon
 
Регистрация: 21.01.2008
Сообщений: 211
По умолчанию

Попробовал так
Код:
var
  i: integer;
begin
  for i := 0 to TreeView1.Items.Count - 1 do
    if Pos(AnsiUpperCase(Edit1.Text),AnsiUpperCase(TreeView1.Items[i].Text)) <> 0 then
    begin
      TreeView1.Selected := TreeView1.Items[i];
      TreeView1.SetFocus;
      Edit1.Text := '';
      break;
    end;
Ищет по именам нодов, а не по значениям.
XerSon вне форума Ответить с цитированием
Старый 09.05.2013, 10:06   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Ищет по именам нодов, а не по значениям.
Нет имени нода. Одним и тем же текстом можно заполнить Text всех 1000 узлов. И что, это имя? Это скорее и есть значение нода. Второй вариант поиска - по значению свойства Data или по параметрам объектов, указатели на которые туда помещены
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.05.2013, 10:19   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Incremental Search реализовал в VirtualTrees им и пользуюсь.
Человек_Борща вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TreeView to XML в WPF eg01st WPF, UWP, WinRT, XAML 0 29.01.2013 14:29
Построить treeView из XML Pon4ik C# (си шарп) 7 18.05.2012 19:07
Построение TreeView из XML maximumtf2 Общие вопросы Delphi 8 11.04.2012 00:30
TreeView сохранить в xml использую linq iukash C# (си шарп) 3 24.07.2011 16:45
загрузка в treeview Vlad123987 Общие вопросы Delphi 1 31.01.2011 11:18