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

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

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

sinkopa

Well-Known Member
17.06.2009
344
9
#2
1. как сделать проверку на дочернюю ветку? т.е. если есть дочерняя ветка то сохранять по другому
Код:
var Node: TTreeNode;
// ...
Node := TreeView1.Items.GetFirstNode;
// ...
Node := Node.getNextSibling;
// ...
if Node.HasChildren then
Node := Node.getFirstChild
else
// bla bla
2. как реализовать индексацию? необходимо при каждой ветке вставить ее порядковый номер, только нумерация начинается с 1, а не нуля
Как интересно Вы это себе представляете?... Куда вы собираетесь этот "порядковый номер" пихать? И самое главное, как потом использовать?
Этож дерево... ;) Имеют значения только, родитель, сестры и дети... Ну пронумеровали вы их по порядку... а через секунду пользователь сменил режим сортировки узла (или всего дерева)... и что дальше с Вашей порядковой нумерацией?
 
13.01.2013
23
0
#3
1. спасибо попробую
2. в StringList, а потом StringList.SaveToFile и делов то... по поводу индексации, мне нужно так: допустим идет нумерация сверху: 1,2,3, третья ветка допустим оказалась с дочерними ветками, окей, нумерация ждет, нумерацию дочерних веток третьей ветки опять начинаем с 1, и т.д. для любой вложенности, уж поверьте я найду как использовать... что кстати за режим сортировки? (не работал раньше с этим компонентом)
 

sinkopa

Well-Known Member
17.06.2009
344
9
#4
2. в StringList, а потом StringList.SaveToFile и делов то... по поводу индексации, мне нужно так: допустим идет нумерация сверху: 1,2,3, третья ветка допустим оказалась с дочерними ветками, окей, нумерация ждет, нумерацию дочерних веток третьей ветки опять начинаем с 1, и т.д. для любой вложенности, уж поверьте я найду как использовать... что кстати за режим сортировки? (не работал раньше с этим компонентом)
Работали... думаю каждый день по многу раз... :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.
Но индексировать дерево? :)
 
13.01.2013
23
0
#5
ох епт загрузил... :rolleyes: ты скажи это Valve создавшей CS 1.6 с такой структурой commandmenu... программа будет упрощать создание менюшки... синтаксис там геморный... и да кстати будут 2 параллельных дерева с именами пунктов меню и коммандами, а индексация сам посмотри для чего... и да кстати, фактически индексировать надо будет 1 раз при закрытии/сохранении файла...
 

Вложения

sinkopa

Well-Known Member
17.06.2009
344
9
#6
ох епт загрузил... :rolleyes: ты скажи это Valve создавшей CS 1.6 с такой структурой commandmenu... программа будет упрощать создание менюшки... синтаксис там геморный... и да кстати будут 2 параллельных дерева с именами пунктов меню и коммандами, а индексация сам посмотри для чего... и да кстати, фактически индексировать надо будет 1 раз при закрытии/сохранении файла...
Да. посмотрел. синтаксис геморойный но не "смертельный"...
Скажите, я надеюсь Вы же не собираетесь эти данные "пихать" из файла прямо в компонент TreeView? :rolleyes:
Правда ж ведь, Вы внимательно почитаете описание и создадите по нему класс-контейнер для элементов (которые у Вас описаны в "Basic Format")...
И у этого класса реализуете методы LoadFromFile и SaveToFile... и в нем будете загружать/создавать/редактировать менюшки...
А TreeView будете использовать только для отображения Вашей структуры?
Я угадал? У Вас ведь типа такого что-то должно получиться? :)
Код:
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? И как (повторяюсь) Вы собираетесь использовать Ваши индексы?