Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Сохранение данных TreeView


Автор: AntonPavlov 24.2.2014, 03:08
Есть TreeView, к узлам привязаны данные. 
Такая вот структура:
Код

type
  PNodeOptions = ^NodeOptions;
  NodeOptions=record
   Name: String[255];
   Surname: String[255];
   Address: String[255];
   EMail: String[255];
  end;

Пожалуйста, помогите эти данные записывать и считывать из файла! Я обыскал все, ничего путного не нашел((( 
Очень нужна помощь! 

Автор: ZBugz 24.2.2014, 06:39
Пиши в inifile
[0]
item=1
item=2
item=3
item=4

Автор: kami 24.2.2014, 09:53
Цитата(AntonPavlov @  24.2.2014,  03:08 Найти цитируемый пост)
помогите эти данные записывать и считывать из файла! 

Первое, что попалось:
http://www.webdelphi.ru/2010/02/pokazyvaem-xml-fajl-lyuboj-slozhnosti-v-vide-treeview/
http://www.webdelphi.ru/2010/02/soxranenie-treeview-v-xml-fajl/
заодно - получится наглядно.
А использовал бы VirtualTree - вообще бы не задумывался о таком.

Автор: gesper 24.2.2014, 15:16
ini файл не годится тут.
Добавить два поля ID, ParentID и сохранять все в XML.
Насчет VirtualTree согласен.

Автор: ZBugz 25.2.2014, 06:13
Цитата(gesper @ 24.2.2014,  15:16)
ini файл не годится тут.
Добавить два поля ID, ParentID и сохранять все в XML.
Насчет VirtualTree согласен.

Это с какого перепуга не годится ? smile 
Я даже VirtualTree сохраняю в него smile

Автор: Beltar 27.2.2014, 14:43
Если неохота курить XML, то можно и в бинарный файл без особых проблем, я в свое время так делал. Если понимаешь, что такое стек, то ничего сложного.

Для сохранения тупо пишешь все данные подряд от выбранного узла до конечного (на котором нужно остановиться, т. е. сохранить можно и одну выбранную ветку) с указанием числа дочерных, чтобы потом восстановить структуру.

Для загрузки создаешь стек из примерно таких структур:

Код

type
  TNodeNestingInfo=record
  t:Integer;// Сколько еще осталось присоединить
  Node:TTreeNode; // узел к которому надо присоединять для добавки в корень nil.
  end;


Дальше читаешь данные, присоединяешь данные к узлу в вершине стека, уменьшаешь t, если у узла есть дочерные, то суешь этот узел в стек, записываешь в t число дочерных. Если дочерных нет, то смотришь, все ли засунул в текущий, и если все, то начинаешь чистить стек, пока не найдется в нем узел в который надо грузить.

Я фрагмент кода выложу, значительная часть там тупо работа с потоком, и моей структурой NodeDescriptor, которая цеплялась к узлу, аналог твоей NodeOptions. Т. е. тебе она неинтересна, за исключением одного поля, TNodeDescriptor.t, оно означает тип узла, если -1, то это конечный узел с данными, если >-1, то значит узел является категорией и t=числу дочерных. При t=0 имеем пустую категорию.

Сам файл писался со смещением 64 байта, т. е. имелся хеадер с меткой типа файла и дополнительной инфой.

В принципе можно не париться с потоками и записать все в базу данных вроде Access, алгоритм будет таким же.

Автор: gesper 27.2.2014, 19:33
Цитата(ZBugz @  25.2.2014,  06:13 Найти цитируемый пост)
Это с какого перепуга не годится ? smile 

Труднорасширяемый при развитии программы. Не гибок.

Автор: ZBugz 28.2.2014, 06:32
Цитата(gesper @ 27.2.2014,  19:33)
Цитата(ZBugz @  25.2.2014,  06:13 Найти цитируемый пост)
Это с какого перепуга не годится ? smile 

Труднорасширяемый при развитии программы. Не гибок.

Ну почему же ? Он кстати гибки достаточно для этих целей, т.е. для дерева считаю очень удобным.
И как говорит Beltar, т.е. предлагает такую структуру, то вот именно с ней+ini работает у меня идиально тот же VirtualTree.

Автор: Beltar 28.2.2014, 15:08
У меня программа на тогдашнем Sempron-2500 парсила банарник размером в 2-3 Мб секунды за 2. С INI размер файла ес-но будет больше и работать НАМНОГО медленнее, но сам ТС не сказал сколько именно данных он собирается хранить и что он вообще пишет, может у него там надо нормальную серверную СУБД ставить. Так о чем спорить? Вообще если писать в текстовик я бы проще сделал, читал все разом в StringList и там парсил аналогично бинарнику. Собственно Ini использовать меня смущает, что инишка явно работает по алгоритму маляра Шлемиля

Кто такой Шлемиль? Это малый из следующеro анекдота: 
Шлемиль устроился на работу маляром и должен был наносить разметку посредине дороrи. В первый день он взял бочку краски и разметил 300 метров дороrи. 
-Неплохо! - сказал босс - Ты быстро работаешь! - И заплатил ему денежку. 
На следующий день Шлемиль осилил только 150 метров. 
- Ну что ж, не так здорово, как вчера, но ты все равно быcrpо работаешь. 150 метров это не мало, - сказал босс и заплатил ему денежку. Еще через день Шлемиль расчертил 30 метров дороrи. 
Bcero 30 метров! - рассвирепел босс - Это никуда не годится. В первый день ты сделал в десять раз больше. Что случилось? 
- Ничеrо не могу поделать, - говорит Шлемиль. С каждым днем приходится все дальше и дальше уходить от бочки с краской..


Автор: ZBugz 1.3.2014, 06:52
Цитата

StringList

Именно так я и делаю, читаю через него с ini и сохраняю в ini smile Ну по крайней мере, если все это делать в ListView, то где то секунд 5 загрузка 1000 строк будет. Если VirtualTree, то я даже секунду не замечаю. А сохранение вообще мнгновенно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)