![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Здравствуйте! У меня возникла проблема. Никогда не работал с TreeView. Вроде там все просто, но нормально реализовать не могу.
Вот смотрите. Допустим, я имею 3 структуры данных: Код:
TR1 = record Name: string; end; TR2 = record Name: string; R1: array of TR1; end; TR3 = record Name: string; R2: array of TR2; R3: array of TR3; end; И мне нужно это как-то запихать в TreeView! То есть как это должно быть. Код:
Ну у нас 3 массива: R1: array of TR1; R2: array of TR2; R3: array of TR3; Например, имеется 3 элемента R3. Они должны быть на 0 уровне дерева -0 элемент R3 -1 элемент R3 -2 элемент R3 Например, 1 элемент массива R3, содержит 2 элемента R1 -0 элемент R3 -1 элемент R3 --0 элемент R1 --1 элемент R1 -2 элемент R3 И например еще, 0 элемент массива R3, содержит 1 элемент R2 -0 элемент R3 --0 элемент R2 -1 элемент R3 --0 элемент R1 --1 элемент R1 -2 элемент R3 И еще, 0 элемент массива R2, которая находится в 0 элементе R3, содержит 2 элемента R1 -0 элемент R3 --0 элемент R2 ---0 элемент R1 ---1 элемент R1 -1 элемент R3 --0 элемент R1 --1 элемент R1 -2 элемент R3 Может понять сразу нельзя, но я думал, так хранить данные удобнее, а начал выводить на TreeView и сел. Несколько раз получалось добиться нужного, но на такой код самому смотреть стыдно. Использовал много дополнительных переменных и т.д. Может есть какой-нибудь способ быстро или удобно это распределить? P.S. При чем, строку такого вида из массивов: -0 элемент R3 --0 элемент R2 ---0 элемент R1 ---1 элемент R1 -1 элемент R3 --0 элемент R1 --1 элемент R1 -2 элемент R3 Я могу получить! А ПРОСТО ЗАПИСАТЬ В ДЕРЕВО нет ![]() Последний раз редактировалось ___toha___, 23.07.2015 в 15:46. |
|
#2
|
||||
|
||||
|
Вроде удалось реализовать, но метод не очень быстрый. Если кто найдет способ быстрее, то пишите!
Сейчас опишу на том примере решение: Код:
for i := 0 to Length(R3) - 1 do
begin
Level := 0;
TreeView.Items.AddChild(TreeView.Items[FindItem(Level)], R3[i].Name);
for j := 0 to Length(R3[i].R2)-1 do
begin
Level := 1;
TreeView.Items.AddChild(TreeView.Items[FindItem(Level)], R3[i].R2.Name);
for k := 0 to Length(R3[i].R2[j].R1)-1 do
begin
Level := 2;
TreeView.Items.AddChild(TreeView.Items[FindItem(Level)], R3[i].R2[j].R1[k].Name);
end;
end;
end;Где FindItem - функция, которая ищет элемент по уровню: Код:
function FindItem(Level: integer):integer;
var
Index: integer;
begin
Index := CodeEditorForm.Structure.Items.Count - 1;
while index > 0 do
begin
if TreeView.Items[index].Level = Level then
break
else
Index := Index - 1;
end;
result := index;
end; |
|
#3
|
||||
|
||||
|
Замечания:
Ну прям 4-я ул. 8-го Марта с этими типами у вас получилась, ничего себе "удобнее" , да и такоеКод:
TR3 = record // <<< Name: string; R2: array of TR2; R3: array of TR3; // <<< end; а бегать по ячейкам массива лучше так Код:
for i := Low(R1) to High(R1) do В образную структуру записей что в первом посте, въезжать из-за жары сил нету, хорошо бы конкретный пример данных, и как они должны в TreeView ложиться, тогда вроде можно и упростить алгоритм заполнения веток |
|
#4
|
||||
|
||||
|
Лучше использовать классы, вместо рекордов.
|