Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.07.2015, 15:01
Аватар для ___toha___
___toha___ ___toha___ вне форума
Прохожий
 
Регистрация: 18.12.2012
Адрес: Сасово
Сообщения: 23
Версия Delphi: 7
Репутация: 10
Восклицание Занесение данных в TreeView

Здравствуйте! У меня возникла проблема. Никогда не работал с 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  
Старый 23.07.2015, 15:58
Аватар для ___toha___
___toha___ ___toha___ вне форума
Прохожий
 
Регистрация: 18.12.2012
Адрес: Сасово
Сообщения: 23
Версия Delphi: 7
Репутация: 10
По умолчанию

Вроде удалось реализовать, но метод не очень быстрый. Если кто найдет способ быстрее, то пишите!
Сейчас опишу на том примере решение:

Код:
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  
Старый 24.07.2015, 11:41
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Замечания:

Ну прям 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  
Старый 24.07.2015, 13:03
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Лучше использовать классы, вместо рекордов.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:47.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025