Сохранение и открытие узлов TVirtualStringTree из файла

3 минуты на чтение

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

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

Facebook Vk Ok Twitter LinkedIn Telegram

Похожие записи:

Ну что, в первой части и во второй части статей, про сохранение данных TStringGrid в файлы и открытие из файла данных, с последующей загрузкой их в TStringGrid, мы поговорили о сохранение и считывание данных из типизированного файла, а также сохранение и считы...
Сейчас расскажу как я добавляю узлы в TVirtualStringTree. То есть попробуем добавить узлы, затем первыми в родительском, последним в родительском. То есть здесь в данном компоненте TVirtualStringTree есть небольшой нюанс, тут не получится как TTreeView сразу д...
Здравствуйте, в этой статье я хотел бы рассказать как можно сохранить узлы в Stream. Данную переменную можно хранить где угодно, в файле, БД. Мы остановимся на БД, так как чаще всего для отображения узлов используют именно БД, а там мы и будем хранить Stream, ...