Здравствуйте, в этой статье я хотел бы рассказать как можно сохранить узлы в файл, а также их потом считать оттуда, для того, чтобы как бы сохранялись настройки вашей программы, то есть например пишите Вы каталог товаров, надо же при следующем запуске в дереве отображать название товаров, для этого мы и используем сохранение данных дерева в файл, можно и в стрим, но данную переменную все равно необходимо куда-то записывать (хранить) например в БД, об этом я расскажу в следующей статье про TVirtualStringTree. Да конечно хранить список дерева в какой-нибудь БД на сервере достаточно выгоднее, так как процент того, что Ваши данные дерева не потяряются вырастает, но об этом я расскажу. В TVirtualStringTree есть замечательных 2 события, которые срабатывают при вызове методов
- SaveToFile
- SaveToStream
- LoadFromFile
- LoadFromStream
Соответственно событие OnLoadNode возникает тогда, когда вызываются методы
- LoadFromFile
- LoadFromStream
А событие OnSaveNode возникает тогда, когда вызываются методы
- SaveToFile
- SaveToStream
Как Вы поняли OnSaveNode - событие, в котором необходимо сохранять узлы дерева, OnLoadNode - событие, в котором необходимо загружать в дерево, сохраненные узлы.
Для чтения и записи нам понадобятся классы TReader и TWriter, соответственно для чтения и для записи классы. Давайте на TButton события OnClick сохраним дерево наше в файл, для этого напишем следующий код
procedure TForm1.Button3Click(Sender: TObject);
begin
VirtualStringTree1.SaveToFile('text.txt');
end;
Да, если Вы напишите код LoadFromFile(‘text.txt’);, то конечно в вашем дереве ничего не отобразится или отобразятся обычные иероглифы. Для этого нам необходимо заполнить наши события. На событие OnSaveNode TVirtualStringTree напишем следующий код
procedure TForm1.VirtualStringTree1SaveNode(Sender: TBaseVirtualTree;
Node: PVirtualNode; Stream: TStream);
var
Writer:TWriter;
begin
Writer:=TWriter.Create(Stream,8096);
NewNode:=Sender.GetNodeData(Node);
Writer.WriteString(NewNode.NameNode);
FreeAndNil(Writer);
end;
Создаем нашу переменную типа Writer, при ее создании указываем откуда брать нам информацию — Stream, в которой хранятся наши узлы и указываем по сколько байт нам считывать из Stream. Далее мы получаем размер нашего узла каждого и затем с помощью метода WriteString записываем наш узел. Далее просто уничтожаем данную переменную, в событии OnLoadNode почти тоже самое, только используется TReader, где параметры и методы почти теже самые, только там ReadString для считывания из Stream информации. На событие OnLoadNode я написал следующий код
procedure TForm1.VirtualStringTree1LoadNode(Sender: TBaseVirtualTree;
Node: PVirtualNode; Stream: TStream);
var
Reader:TReader;
begin
Reader:=TReader.Create(Stream,1024);
NewNode:=Sender.GetNodeData(Node);
NewNode.NameNode:=Reader.ReadString;
FreeAndNil(Reader);
end;
И вот теперь уже, если Вы напишите на TButton событие OnClick
procedure TForm1.Button4Click(Sender: TObject);
begin
VirtualStringTree1.LoadFromFile('text.txt');
end;
То тогда наши узлы отобразятся в дереве. В следующей статье мы поговорим как можно эти самые узлы хранить в базе данных и очень сложно их оттуда удалить будет и изменить.