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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.11.2018, 14:58
duke2003 duke2003 вне форума
Прохожий
 
Регистрация: 14.04.2014
Сообщения: 13
Версия Delphi: Delphi 2007
Репутация: 10
По умолчанию Показать картинки иерархически

здравствуйте! нужно вывести картинки примерно таким иерархическим видом (данная картинка как пример), потому что количество и иерархия картинок будет различна и должна будет строиться динамически.

images.jpg

подскажите с помощью каких компонентов или вообще как возможно вывести в таком виде или может есть примеры реализации подобных вещей.

Последний раз редактировалось duke2003, 12.11.2018 в 15:02.
Ответить с цитированием
  #2  
Старый 13.11.2018, 03:12
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,055
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, такого стандартного компонента, вроде, не видел.
Тут такой вопрос - а что надо уметь делать с этим деревом, кроме как показать? Если только показать, то можно и вручную отрисовать. Если надо уметь что-то делать (типа передвигать ноды, удалять, добавлять и т.д.), то надо будет искать какой-нить навороченный компонент или писать свой.

Ну и еще вопрос - а не лучше ли будет диаграмма Ганта? Вроде для Ганта есть компонент в DevExpress.
Ответить с цитированием
  #3  
Старый 13.11.2018, 18:28
duke2003 duke2003 вне форума
Прохожий
 
Регистрация: 14.04.2014
Сообщения: 13
Версия Delphi: Delphi 2007
Репутация: 10
По умолчанию

здравствуйте! про диаграмму Ганта почитаю.
а пока начал делать с помощью TImage. Картинки хранятся в базе SQL.
Таблица со столбцами - ID, Parent_ID, Image, Levels.
сделал пока пробный вариант:

Код:
private
    _Massiv_Image: array of TImage;
    _Param_Level: Integer;
    _NumberLeft: Integer;
    procedure CreateImage(_Number_Image, _Level: Integer; _Image: TStream);

procedure TfMain.FormShow(Sender: TObject);
var
  _Stream: TStream;
  _Param_Number_Image: Integer;
begin
  _Param_Level := -1;

  qImage.Close;
  qImage.Open;

  SetLength(_Massiv_Image, qImage.RecordCount);
  _Stream := TStream.Create;
  _Param_Number_Image := 1;
  while not qImage.Eof do
  begin
    _Stream := qImage.CreateBlobStream(qImageImage, bmRead);

    CreateImage(_Param_Number_Image, qImageLevel_Image.AsInteger, _Stream);

    _Param_Number_Image := _Param_Number_Image + 1;
    qImage.Next;
  end;

  _Stream.Free;
end;

procedure TfMain.CreateImage(_Number_Image, _Level: Integer; _Image: TStream);
begin
  _Massiv_Image[_Level] := TImage.Create(ScrollBox);

  _Massiv_Image[_Level].Parent := ScrollBox;
  _Massiv_Image[_Level].Picture.Graphic := TJPEGImage.Create;
  _Massiv_Image[_Level].Picture.Graphic.LoadFromStream(_Image);
  _Massiv_Image[_Level].Height := 100;
  _Massiv_Image[_Level].Width := 100;

  if _Level = _Param_Level then
    _NumberLeft := _NumberLeft + 1
  else
    _NumberLeft := 0;

  _Massiv_Image[_Level].Left := (_NumberLeft * 100 + _NumberLeft * 10) + 10;
  // Round((fMain.Width / (2 * _Count)) - (_Massiv_Image[_Number_Image].Width / 2));
  _Massiv_Image[_Level].Top := (_Level * 100 + _Level * 10) + 10;
  _Massiv_Image[_Level].Stretch := True;

  _Param_Level := _Level;
end;

в этом примере получилось вот так:
602 .jpg
а должно в данном случае получиться:
603.jpg
и варианты различны, есть такие в которых итог должен быть такой:
604.jpg

и вот вопросы:
в правильном ли я направлении двигаюсь?
возможны ли универсальные варианты по расположению TImage (не знаю как правильно задать вопрос), короче как их расставить на нужные места.
И как от родителя к чайлду нарисовать связи (полосы как на картинке).

Последний раз редактировалось duke2003, 13.11.2018 в 18:32.
Ответить с цитированием
  #4  
Старый 14.11.2018, 02:09
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,055
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, в принципе, в правильном.
Как я понимаю, у тебя размер картинок одинков?
Тогда так:
1. Загружаем все, повторяю ВСЕ, картинки в память. Можно, конечно, не грузить, просто нужно кол-во картинок на каждом уровне.
2. Ищем самый "широкий" уровень (где больше всего картинок) и запоминаем его общую ширину (включая промежутки между картинками).
3. Теперь рисуем поуровнево. Для текущего уровня опять считаем общую ширину картикок с промежутками и рисуем их от позиции Х как (Wmax - Wlvl)/2 (т.е. ширина уровня с наибольшим кол-вом картинок минус ширина текущено уровня деленная пополам - по сути, ценкровка картинок уровня).
Ответить с цитированием
  #5  
Старый 14.11.2018, 08:11
duke2003 duke2003 вне форума
Прохожий
 
Регистрация: 14.04.2014
Сообщения: 13
Версия Delphi: Delphi 2007
Репутация: 10
По умолчанию

искать ширину я пробовал, проблема в том что есть варианты, по типу таких
605.jpg
потому что центрируется по "родитель (Parent_ID) - чайлд (ID)", а у меня пока Parent_ID вообще не задействован и я не понимаю как его использовать в данной задачи для расчета расположения.
Ответить с цитированием
  #6  
Старый 14.11.2018, 19:22
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,055
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, как ты понимаешь, заложиться на все варианты не получится.
Как вариант, можно попробовать в случае, если ParentID только один, то располагать под соотв. родителем. Правда тут могут быть проблемы, если у других квадратиков паренты будут с разных сторон от того, у которого парент один. Сумбурно немного, но, надеюсь, понятно.

Вариант - центровку делаем все равно так же (по крайней мере для 1-го уровня). Потом пытаемся центровать квадратики по родителям. Только учти вариант, когда детей больше, чем родителей. В принципе, я бы в памяти просто строил бы это дерево, сохраняя координаты, потом бы просто по построенному дереву "выплевывал" бы на канву.
Ответить с цитированием
  #7  
Старый 14.11.2018, 19:41
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Для реализации этого дела вам сначала надо решить несколько частных задач. Сделать графический объект "узел" у которого будут свои координаты на канве, а так-же точки соединения с другими узлами.
Сделать графический объект "соединение" которое имеет свои координаты, а так-же пару ссылок на объект "узел". Сделайте пару узлов и свяжите их объектом "соединение". Протестируйте на предмет произвольного расположения на канве этих объектов. А вот когда у вас получится заставить работать такую связку, можно и диаграмму строить любой сложности.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #8  
Старый 15.11.2018, 01:53
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,055
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Страдалецъ, если динамика не нужна, то и не обязательно делать отдельные классы граф. примитивов. Можно строить виртуальное дерево и его потом отрисовывать. собственно об этом был один из моих первых вопросов. Тут скорее проблема в том, что эту картинку надо строить полностью автоматически (как я понял задачу). Нет возможности построить хоть как-то, а потом попросить юзера поправить и сохранить для последующегь использования. Отсюда и все заморочки.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter