На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное 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 свойства, тогда по идее они будут читаться и записываться автоматом
              Очень не хотелось бы тащить в текст узла Васю Пупкина и пр.
              Сообщение отредактировано: 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, куда записывать как структуру дерева, так и данные.
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0718 ]   [ 17 queries used ]   [ Generated: 28.03.24, 20:26 GMT ]