Консультация № 160194
11.02.2009, 13:59
0.00 руб.
0 0 0
Здравствуйте!
Я пытаюсь реализовать чтение из XML с сохранением структуры с TreeView, при этом сохраняя дополнительную информацию в TreeNode.Data

Не могу попять как сделать чтобы при клике нода информация грузилась в TMemo например.
Как я понимаю 2 варианта: 1. составление таблицы соответствия - и грузить информацию из XML непосредственно, 2 грузить иформацию в память вместе с TTreeNode в его поле Data. Но с памятью не работал еще....
Существую 2 типа: 1. Что-то вроде папки - хранит другие объекты - или пустая. 2. Конечные объекты - хранят информацию
Вот попытки что-то сделать:
Код:
 
type
TProgram = record //class
Folder : Boolean; //Папка?
Name, //Название В дереве и нода
FullName, //Наименование программы
ver : String; //Версия
end;
PProgram = ^TProgram;
var
ProgramInfo : PProgram;
......
//Загрузка веток и листов
Procedure TFrm_Main.GetChileds(XMLNode: IXMLNode; TreeNodes: TTreeNodes; TreeNode: TTreeNode );
var
i: integer;
tmpNode : IXMLNode;
tmpTreeNode: TTreeNode;
//ProgramData: TProgram;
begin
for i:=0 to XMLNode.ChildNodes.Count - 1 do
begin
tmpNode := XMLNode.ChildNodes[i];
if tmpNode.ChildNodes.Count>0
then begin
GetChileds( tmpNode,
TreeNodes,
TreeNodes.AddChild( TreeNode , tmpNode.NodeName ) );
end
else
begin
//ProgramInfo := TProgram.Create;
//Операции над добавленным потомком
tmpTreeNode := TreeNodes.AddChild( TreeNode , tmpNode.NodeName );
//Переносим параметры
New(ProgramInfo);
tmpTreeNode.Data := ProgramInfo;
//Какие параметры вносим?
if tmpNode.Attributes['Folder']=false then
begin //Заполняем параметры
ProgramInfo^.Folder := false;
ProgramInfo^.FullName := tmpNode.Attributes['FullName'];
ProgramInfo^.ver := tmpNode.Attributes['Version'];
end
else ProgramInfo.Folder := true;
end; //Есть, нет детей
end; //Цикл добавление нодов
end;
//При операции ProgramInfo^.Folder := false; вылетает с ошибкой Project ... raised exception class EAccessViolation with message 'Access violation at address 00404934 in module .... Rad address 000000004'
...........
//Начало работы
var
FirstNode: IXMLNode;
TreeNodes: TTreeNodes;
FirstTreeNode: TTreeNode;
begin
XMLDocument.Active;
//Подготовка загрзки
TreeView.Items.Clear;
FirstNode := XMLDocument.ChildNodes.Get(1);
TreeNodes := TreeView.Items;
FirstTreeNode := TreeView.Items.AddChild(TreeView.TopItem, FirstNode.NodeName);
//Загрузка
GetChileds(FirstNode, TreeNodes, FirstTreeNode);
//Фокус и загрузка выделенного
TreeView.Items.Item[0].Selected := true;
.............
//Действия при клике
procedure TFrm_Main.TreeViewChange(Sender: TObject; Node: TTreeNode);
begin
TreeClickNode.Execute; //В этой процедуре должны грузится данные в Memo например
end;
//С сохранением еще не разбирался....


Очень буду рад предложению решения проблемы. Информацию по памяти (желательно по конкретному случаю)
Информацию как сделать проще, лучше

Приложение:
XML файл
<?xml version="1.0"?>
<Software Folder="True">
<Text Folder="True">
<MSOffice Folder="False" FullName="Microsoft Office" Version="11.0"/>
<OpenOffice Folder="False" FullName="Open Office" Version="4.0"/>
<Editor Folder="True">
<Notepadpp Folder="False" FullName="Notepad++" Version="4.5"/>
</Editor>
</Text>
<Multimedia Folder="True">
<Grafics Folder="True">
<Photoshop Folder="False" FullName="Adobe Photoshop" Version="11.0"/>
</Grafics>
<Audio Folder="True">
<Winamp Folder="False" FullName="Nullsoft Winamp" Version="5.6"/>
</Audio>
<Premier Folder="False" FullName="Adobe Premier" Version="2.0"/>
</Multimedia>
</Software>

Обсуждение

Форма ответа