На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> TTreeView - сохранение данных
Всем добрый день.
Возник такой вопрос: есть дерево TreeView, к узлам которого в поле Data привязаны определенные данные. При сохранении дерева через TFileStream и WriteComponent структура дерева сохраняется и в дальнейшем восстанавливается посредством TFileStream и ReadComponent. Все прекрасно, но вопрос - как сохранить поле Data для каждого узла, чтобы при восстановлении дерева оно также восстанавливалось? Может как-то через базу данных? Но как? Не силен в таких вопросах. Может кто-нибудь помочь?
Что за данные хранятся в узлах?
Integer, String (переменная типа record).
Сообщение отредактировано: newkaz -
Для данных такого рода, чтобы не вводить свои механизмы сохранения-восстановления, можно использовать простой приём - добавить строковое представление числа и строку данных к тексту узла перед сохранением через разделитель. А при загрузке разделить текст на три части по разделителю, и создать данные.

Было: 'NodeText', данные (42, 'Вася Пупкин')
Перед сохранением превратить в 'NodeText|42|Вася Пупкин'
После загрузки с помощью DelimitedText получить TStringList с тремя строками и воостановить всё.

Собственно, понадобится две процедуры - условно NodeToText и TextToNode (если применять к каждому узлу отдельно)
Сообщение отредактировано: MBo -
Можно еще создать новый класс на основе treeview и расширить DefineProperties. Также можно создать новый класс узла и добавить ему published свойства, тогда по идее они будут читаться и записываться автоматом
Codero ergo sum
// Программирую — значит, существую
Очень не хотелось бы тащить в текст узла Васю Пупкина и пр.
Сообщение отредактировано: newkaz -
Если поподробнее, то ситуация такая:
есть у меня программа, которая позволяет мне формировать дерево по моему желанию - добавлять ноды на разных уровнях, удалять их, менять текст названия, копировать и переносить узлы и подузлы. Все изменения сохраняются в файле типа txt. При запуске программы дерево читается из этого файла. Причем при попытке загрузить дерево из файла в Items Editor во время проектирования выдаются сплошные кракозябры.
Можно еще создать новый класс на основе treeview и расширить DefineProperties. Также можно создать новый класс узла и добавить ему published свойства, тогда по идее они будут читаться и записываться автоматом
Это для меня, если честно, темный лес. Попытался создать класс узла-наследника узла TreeNode: TSTreeNode = class(TTreeNode) и совсем запутался. И даже если я его создам, то как сделать так, чтобы узлы дерева принадлежали этому классу, а не TreeNode?
Сообщение отредактировано: newkaz -
Цитата newkaz @
Очень не хотелось бы тащить в текст узла Васю Пупкина и пр.


В тексте этого храниться и не будет. Дополнительные данные добавляются к тексту узлов только на время сохранения
Вопрос не совсем в тему, но хотелось бы узнать вот что: у узла TTreeNode есть свойство Data. Если у меня в Data не записано ничего, то как это определить? Проверял - Data не nil ($101B380). При обращении к Data - ошибка.
Если в Data ничего никогда не было, должен быть nil.
А если было - как уничтожить данные?
Уничтожить - в зависимости о того, как они создавались.
А после уничтожения в любом случае Data можно назначить nil
Если программа твоя, и все равно содержимое сохраняется в txt, то самым простым вариантом будет сохранение дополнительных данных узлов в этом txt либо еще в каком-то виде. Если в этом месте невозможно встроиться, то можно сохранять еще один файл и восстанавливать соответствие данных и узлов при запуске.
Самый дубовый пример такого файла:
ExpandedWrap disabled
    root_data
    =node1_lvl1_data
    ==node_lvl2_data
    =node2_lvl1_data
    ...

Пример уязвим к рассинхронизации со структурой дерева.
Но в общем случае я бы порекомендовал совместимые форматы, вроде xml или json, куда записывать как структуру дерева, так и данные.
Codero ergo sum
// Программирую — значит, существую
1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
0 пользователей:


Рейтинг@Mail.ru
[ Script Execution time: 0,1160 ]   [ 20 queries used ]   [ Generated: 23.07.18, 17:33 GMT ]