ПримечаниеСохранение и загрузка Treeview с помощью XML
Извините заранее за длинный пост, я, хотя было бы лучше поставить как можно больше информации о как можно скорее, чем заполнить пробелы, когда это необходимо.
Заметьте, что я также отметил это как Delphi и занимаюсь собственным делом и использую Delphi XE. Теперь я использую Lazarus в качестве своей основной IDE, я просто не могу позволить себе покупать более новые версии Delphi, и теперь Lazarus становится более стабильным. имеет смысл сделать переход на Лазарь.
Для этого вопроса я включил приложение zip с источником проекта, хотя он написан в Лазаресе, и это действительно поможет с вопросом, который у меня есть, поэтому комментарии в первом абзаце.
Обзор
Onto вопрос, у меня есть объект, который является владельцем нескольких классов как TLists.
Я представляю эти данные в Treeview, и нет никакого способа узнать, сколько уровней и узлов будет присутствовать в дереве, поскольку они динамически создаются во время выполнения. Одно ограничение, которое я установил, заключается в том, что узлы верхнего уровня будут фиксированными, то есть они не могут быть удалены или переименованы - это то, что я назову RootGroups.
Treeview будет заполнен элементами и группами, каждый узел, добавленный в Treeview, будет иметь свой собственный объект, назначенный данным, чтобы правильно идентифицировать каждый элемент. Я собираюсь показать пример экрана в настоящее время, чтобы дать лучшее представление перед продолжением:
Как вы можете видеть, у меня есть два верхних большинство узлов, Object1Root и Object2Root. Если вы заметили кнопки справа, они позволяют добавлять группу и элементы в Treeview, но они становятся отключенными, если они не принадлежат к той части Treeview. Например, вы не можете добавить Object2Group или Object2Item под Object1Root.
В принципе все в Treeview имеет свой собственный указатель на объект. Каждый объект я получаю из базового объекта. Этот базовый объект имеет свойство для хранения положения, где он находится в Treeview, как это:
type
TBaseObject = class
private
FName: string;
FGroup: string;
FNodeLevel: Integer;
FNodeIndex: Integer;
public
constructor Create(AName: string);
destructor Destroy; override;
published
property Name: string read FName write FName;
property Group: string read FGroup write FGroup;
property NodeLevel: Integer read FNodeLevel write FNodeLevel;
property NodeIndex: Integer read FNodeIndex write FNodeIndex;
end;
Я тогда вывожу мои другие классы от базового объекта, как это:
type
TObject1RootGroup = class(TBaseObject)
public
constructor Create(AName: string);
destructor Destroy; override;
procedure ToSave(const XMLDoc: IXMLDocument; var Root, Node: IXMLNode);
end;
TObject1Group = class(TBaseObject)
public
constructor Create(AName: string);
destructor Destroy; override;
procedure ToSave(const XMLDoc: IXMLDocument; var Root, Node: IXMLNode);
end;
TObject1Item = class(TBaseObject)
private
FSomeVal1: string;
FSomeVal2: string;
public
constructor Create(AName: string);
destructor Destroy; override;
procedure ToSave(const XMLDoc: IXMLDocument; var Root, Node: IXMLNode);
published
property SomeVal1: string read FSomeVal1 write FSomeVal1;
property SomeVal2: string read FSomeVal2 write FSomeVal2;
end;
Главный объект, который держит все эти классы выглядит следующим образом:
type
TMyObject = class(TObject)
private
FName: string;
FObject1Groups: TList;
FObject1Items: TList;
FObject2Groups: TList;
FObject2Items: TList;
protected
procedure FreeObjects;
public
constructor Create(AName: string);
destructor Destroy; override;
procedure Save(FileName: string);
function Load(Filename: string): Boolean;
published
property Name: string read FName write FName;
property Object1Groups: TList read FObject1Groups;
property Object1Items: TList read FObject1Items;
property Object2Groups: TList read FObject2Groups;
property Object2Items: TList read FObject2Items;
end;
Когда я сохраняю Главный объект для XML. Сначала я перебираю все TreeView и затем назначаю каждому объекту данные узла, такие как «Родитель», «Уровень», «Индекс» и т. Д.Вывод XML файла на основе первого изображения будет выглядеть следующим образом:
Примечание: В SomeVal части не важно, так как я никогда не потрудился ничего писать к объектам.
Действительно, что мне нужно сделать, это сохранить в XML так же, как показано Treeview. Я не слишком знаком с XML, как я все еще получаю, чтобы справиться с этим, но я думаю, что результат должен выглядеть следующим образом: (написанный в блокноте)
<XML Name="test.xml">
<Counts Object1Groups="3" Object1Items="5" Object2Groups="2" Object2Items="1" />
<TObject1RootGroup Name="Object1Root" Group="" NodeLevel="0" NodeIndex="0"
<TObject1Item Name="Item1" Group="Object1Root" NodeLevel="1" NodeIndex="0" SomeVal1="" SomeVal2="" />
<TObject1Item Name="Item2" Group="Object1Root" NodeLevel="1" NodeIndex="1" SomeVal1="" SomeVal2="" />
<TObject1Group Name="Group1" Group="Object1Root" NodeLevel="1" NodeIndex="2" />
<TObject1Item Name="Item3" Group="Object1Root" NodeLevel="1" NodeIndex="3" SomeVal1="" SomeVal2="" />
<TObject1Group Name="Group2" Group="Object1Root" NodeLevel="1" NodeIndex="4" />
<TObject1Item Name="Item1" Group="Group2" NodeLevel="2" NodeIndex="0" SomeVal1="" SomeVal2="" />
<TObject1Group Name="Group1" Group="Group2" NodeLevel="2" NodeIndex="1" />
<TObject1Item Name="Item1" Group="Group1" NodeLevel="3" NodeIndex="0" SomeVal1="" SomeVal2="" />
<TObject2RootGroup Name="Object2Root" Group="" NodeLevel="0" NodeIndex="1"
<TObject2Group Name="Group1" Group="Object2Root" NodeLevel="1" NodeIndex="0" />
<TObject2Group Name="Group2" Group="Object2Root" NodeLevel="1" NodeIndex="1" />
<TObject2Item Name="Item1" Group="Group2" NodeLevel="2" NodeIndex="0" SomeVal1="" SomeVal2="" />
</XML>
Тогда я мог бы загрузить TreeView с XML. Проблема в том, что я действительно знаю, как сохранить XML, как я в настоящее время, я знаю, что какая-то рекурсия и т. Д. Необходимы, и именно здесь я буду бороться и, в частности, перестроить дерево из XML-файла.
Attachment
Мне потребовалось несколько часов, чтобы раздеться мой фактический код проекта в качестве примера, который легче читать и понимать, что написано в Lazarus и использует библиотеку OmniXML, я включили исходные единицы без файла проекта.
скачать здесь (пароль StackOverflow): http://www34.zippyshare.com/v/16401041/file.html
В конце концов, мой вопрос:
- Как сохранить XML с правильной структурой иерархии.
- Как загрузить XML и перестроить Treeview так, как это было до сохранения.
Большое спасибо.
Вы спрашивали об этом уже дважды. Возможно, удалить другую Q. –
@DavidHeffernan жаль, что это была настоящая ошибка. Я забыл ее удалить. Мне нужно было выпить, потратив возраст, написание вопроса и составление примеров. –
ОК, я понимаю. Это намного лучше Q, +1. –