Здравствуйте, в этой статье я хотел бы рассказать как можно сохранить узлы в файл, а также их потом считать оттуда, для того, чтобы как бы сохранялись настройки вашей программы, то есть например пишите Вы каталог товаров, надо же при следующем запуске в дереве отображать название товаров, для этого мы и используем сохранение данных дерева в файл, можно и в стрим, но данную переменную все равно необходимо куда-то записывать (хранить) например в БД, об этом я расскажу в следующей статье про 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;

То тогда наши узлы отобразятся в дереве. В следующей статье мы поговорим как можно эти самые узлы хранить в базе данных и очень сложно их оттуда удалить будет и изменить.

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

Полный исходник статьи (с прошлым уроком по TVirtualStringTree) качаем тут

Автор статьи - Andrey53

Метки: , , ,

Оставить комментарий

Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*