![]() |
|
|
Регистрация | << Правила форума >> | 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
|
||||
|
||||
![]() Лучше использовать классы, вместо рекордов.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |