Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.149.233.72] |
|
Сообщ.
#1
,
|
|
|
Всем добрый день.
Возник такой вопрос: есть дерево TreeView, к узлам которого в поле Data привязаны определенные данные. При сохранении дерева через TFileStream и WriteComponent структура дерева сохраняется и в дальнейшем восстанавливается посредством TFileStream и ReadComponent. Все прекрасно, но вопрос - как сохранить поле Data для каждого узла, чтобы при восстановлении дерева оно также восстанавливалось? Может как-то через базу данных? Но как? Не силен в таких вопросах. Может кто-нибудь помочь? |
Сообщ.
#2
,
|
|
|
Что за данные хранятся в узлах?
|
Сообщ.
#3
,
|
|
|
Integer, String (переменная типа record).
|
Сообщ.
#4
,
|
|
|
Для данных такого рода, чтобы не вводить свои механизмы сохранения-восстановления, можно использовать простой приём - добавить строковое представление числа и строку данных к тексту узла перед сохранением через разделитель. А при загрузке разделить текст на три части по разделителю, и создать данные.
Было: 'NodeText', данные (42, 'Вася Пупкин') Перед сохранением превратить в 'NodeText|42|Вася Пупкин' После загрузки с помощью DelimitedText получить TStringList с тремя строками и воостановить всё. Собственно, понадобится две процедуры - условно NodeToText и TextToNode (если применять к каждому узлу отдельно) |
Сообщ.
#5
,
|
|
|
Можно еще создать новый класс на основе treeview и расширить DefineProperties. Также можно создать новый класс узла и добавить ему published свойства, тогда по идее они будут читаться и записываться автоматом
|
Сообщ.
#6
,
|
|
|
Очень не хотелось бы тащить в текст узла Васю Пупкина и пр.
|
Сообщ.
#7
,
|
|
|
Если поподробнее, то ситуация такая:
есть у меня программа, которая позволяет мне формировать дерево по моему желанию - добавлять ноды на разных уровнях, удалять их, менять текст названия, копировать и переносить узлы и подузлы. Все изменения сохраняются в файле типа txt. При запуске программы дерево читается из этого файла. Причем при попытке загрузить дерево из файла в Items Editor во время проектирования выдаются сплошные кракозябры. Можно еще создать новый класс на основе treeview и расширить DefineProperties. Также можно создать новый класс узла и добавить ему published свойства, тогда по идее они будут читаться и записываться автоматом Это для меня, если честно, темный лес. Попытался создать класс узла-наследника узла TreeNode: TSTreeNode = class(TTreeNode) и совсем запутался. И даже если я его создам, то как сделать так, чтобы узлы дерева принадлежали этому классу, а не TreeNode? |
Сообщ.
#8
,
|
|
|
Цитата newkaz @ Очень не хотелось бы тащить в текст узла Васю Пупкина и пр. В тексте этого храниться и не будет. Дополнительные данные добавляются к тексту узлов только на время сохранения |
Сообщ.
#9
,
|
|
|
Вопрос не совсем в тему, но хотелось бы узнать вот что: у узла TTreeNode есть свойство Data. Если у меня в Data не записано ничего, то как это определить? Проверял - Data не nil ($101B380). При обращении к Data - ошибка.
|
Сообщ.
#10
,
|
|
|
Если в Data ничего никогда не было, должен быть nil.
|
Сообщ.
#11
,
|
|
|
А если было - как уничтожить данные?
|
Сообщ.
#12
,
|
|
|
Уничтожить - в зависимости о того, как они создавались.
А после уничтожения в любом случае Data можно назначить nil |
Сообщ.
#13
,
|
|
|
Если программа твоя, и все равно содержимое сохраняется в txt, то самым простым вариантом будет сохранение дополнительных данных узлов в этом txt либо еще в каком-то виде. Если в этом месте невозможно встроиться, то можно сохранять еще один файл и восстанавливать соответствие данных и узлов при запуске.
Самый дубовый пример такого файла: root_data =node1_lvl1_data ==node_lvl2_data =node2_lvl1_data ... Пример уязвим к рассинхронизации со структурой дерева. Но в общем случае я бы порекомендовал совместимые форматы, вроде xml или json, куда записывать как структуру дерева, так и данные. |