Реализовать Сохранение И Загрузку Treeview

Тема в разделе "Delphi - Система", создана пользователем ilya00, 28 фев 2013.

  1. ilya00

    ilya00 Member

    Регистрация:
    13 янв 2013
    Сообщения:
    23
    Симпатии:
    0
    реализую пару процедур для загрузки и сохранения TreeView в текстовый файл
    по мере реализации могут возникнуть еще вопросы, но сейчас интересует:
    1. как сделать проверку на дочернюю ветку? т.е. если есть дочерняя ветка то сохранять по другому
    2. как реализовать индексацию? необходимо при каждой ветке вставить ее порядковый номер, только нумерация начинается с 1, а не нуля

    п.с. а да, самое главное забыл ;) не предлагать стандартные процедуры ! (TreeView.SaveToFile, TreeView.LoadFromFile) тут этот файл потом будет использовать другая программа, в общем там немного не стандартный синтаксис будет, поэтому пишу специально процедуры
     
  2. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Код (Delphi):
    var Node: TTreeNode;
    // ...
    Node := TreeView1.Items.GetFirstNode;
    // ...
    Node := Node.getNextSibling;
    // ...
    if Node.HasChildren then
    Node := Node.getFirstChild
    else
    // bla bla
    Как интересно Вы это себе представляете?... Куда вы собираетесь этот "порядковый номер" пихать? И самое главное, как потом использовать?
    Этож дерево... ;) Имеют значения только, родитель, сестры и дети... Ну пронумеровали вы их по порядку... а через секунду пользователь сменил режим сортировки узла (или всего дерева)... и что дальше с Вашей порядковой нумерацией?
     
  3. ilya00

    ilya00 Member

    Регистрация:
    13 янв 2013
    Сообщения:
    23
    Симпатии:
    0
    1. спасибо попробую
    2. в StringList, а потом StringList.SaveToFile и делов то... по поводу индексации, мне нужно так: допустим идет нумерация сверху: 1,2,3, третья ветка допустим оказалась с дочерними ветками, окей, нумерация ждет, нумерацию дочерних веток третьей ветки опять начинаем с 1, и т.д. для любой вложенности, уж поверьте я найду как использовать... что кстати за режим сортировки? (не работал раньше с этим компонентом)
     
  4. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Работали... думаю каждый день по многу раз... :rolleyes:
    Нажмите "Пуск -> Выполнить (Run)..." Наберите "explorer". Вот он TreeView. Узнали? :rolleyes:
    Выберите узел... Ну например "C:\Program Files"... "дети" есть в узле? :) Отсортированы по алфавиту? Вас не удивляет что они "пронумерованы" не в том порядке как Вы программы устанавливали на компьютер? :)
    Нажмите "Вид (View) -> Сортировать иконки по... (Arrange Icons by)" по дате модификации...
    Ну? куда делась Ваша "нумерация дочерних веток третьей ветки"? И где собственно теперь ветка которую Вы пронумеровали как "ветка номер 3"?
    Все что есть уникального у ветки это:
    1) Узел родитель (Node.Parent)
    2) Уровень вложенности относительно корня (Node.Level)
    3) Индекс в "куче узлов" (Node.Index)
    ну и скорее всего какие-то данные связанные с этим узлом (Node.Data).
    И даже Node.Index ничего не сможет Вам сказать о месте расположения узла в дереве...
    Скажем Вы перемещаете подкаталог "C" из каталога "A" в каталог "B"... У "C" поменяется Node.Parent и может быть Node.Level. Node.Index останется тот же.
    Понимаете о чем я? Какая может быть индексация и как ее на практике использовать (какой в ней смысл), если Все равно каждый раз, чтобы добраться до узла "C", Вам придется "бежать" от корня (TreeView1.Items.GetFirstNode;) вызывая Node.GetNext, до тех пор пока по каким-то "частным" параметрам Вам не попадется нода "оочень похожая" на ноду "C". Говорю похожая, потому что (чтобы окончательно убедиться что это именно она) Вам придется делать дополнительные проверки... Возможно даже добежать до конца и проверить нету ли еще узлов с такими-же параметрами...
    Ведь никто не даст Вам гарантии что в соседних папках не окажутся подпапки с одинаковыми именами или даже файлами... :)
    Нет... конечно (на короткое время) можно создать некий индексный массив. Например создать экземпляр класса TList и добавить туда ссылки на определенные узлы (метод TList.Add). Вот в этом есть определенный смысл... чтобы не бегать по дереву а обращаться к определенному узлу... типа (List as TTreeNode).Data.
    Но индексировать дерево? :)
     
  5. ilya00

    ilya00 Member

    Регистрация:
    13 янв 2013
    Сообщения:
    23
    Симпатии:
    0
    ох епт загрузил... :rolleyes: ты скажи это Valve создавшей CS 1.6 с такой структурой commandmenu... программа будет упрощать создание менюшки... синтаксис там геморный... и да кстати будут 2 параллельных дерева с именами пунктов меню и коммандами, а индексация сам посмотри для чего... и да кстати, фактически индексировать надо будет 1 раз при закрытии/сохранении файла...
     

    Вложения:

    • commandmenu.txt
      Размер файла:
      8,4 КБ
      Просмотров:
      7
  6. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Да. посмотрел. синтаксис геморойный но не "смертельный"...
    Скажите, я надеюсь Вы же не собираетесь эти данные "пихать" из файла прямо в компонент TreeView? :rolleyes:
    Правда ж ведь, Вы внимательно почитаете описание и создадите по нему класс-контейнер для элементов (которые у Вас описаны в "Basic Format")...
    И у этого класса реализуете методы LoadFromFile и SaveToFile... и в нем будете загружать/создавать/редактировать менюшки...
    А TreeView будете использовать только для отображения Вашей структуры?
    Я угадал? У Вас ведь типа такого что-то должно получиться? :)
    Код (Delphi):
    type
    //Map Specific
    TMapSpecific = ( cs_siege, de_train, de_vertigo, de_prodigy, de_aztec, de_inferno,
    cs_office, cs_backalley, cs_747, as_oilrig, cs_assault, de_nuke,
    de_cbble, de_dust, de_dust2, cs_italy, cs_estate, as_tundra,
    cs_militia);

    // Basic Format: "<Bound Key>" "<Button Text>" "<Command sent to server>"
    TBasicButton = class(TObject)
    public
    BoundKey: string;
    ButtonText: string;
    CommandText: string;
    Custom: Boolean; // Buttons preceded with "CUSTOM" are handled in special ways. They can only be moved around or deleted.
    procedure Read(var sFrom: string); virtual;
    procedure Write(var sTo: string); virtual;
    end;

    // Buttons can also open up submenus, as follows:
    TBasicButtonList = class(Tlist)
    private
    function Get(Index: Integer): TBasicButton;
    procedure Put(Index: Integer; const Value: TBasicButton);
    public
    property Items[Index: Integer]: TBasicButton read Get write Put; default;
    end;

    TBasicButtonMap = class(TBasicButton)
    public
    MapSpecific: TMapSpecific;
    SubMenus: TBasicButtonList;
    procedure Read(var sFrom: string); virtual;
    procedure Write(var sTo: string); virtual;
    end;

    TButtonStructure = class (TObject)
    public
    Buttons: TBasicButtonList;
    procedure LoadFromFile(FileName: string);
    procedure SaveToFile(FileName: string);
    procedure ShowOnTreeView(tv: TTreeView);
    end;
    И зачем Вам тогда индексировать TreeView? И как (повторяюсь) Вы собираетесь использовать Ваши индексы?
     
Загрузка...

Поделиться этой страницей