|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Показать картинки иерархически
здравствуйте! нужно вывести картинки примерно таким иерархическим видом (данная картинка как пример), потому что количество и иерархия картинок будет различна и должна будет строиться динамически.
images.jpg подскажите с помощью каких компонентов или вообще как возможно вывести в таком виде или может есть примеры реализации подобных вещей. Последний раз редактировалось duke2003, 12.11.2018 в 15:02. |
#2
|
|||
|
|||
Ну, такого стандартного компонента, вроде, не видел.
Тут такой вопрос - а что надо уметь делать с этим деревом, кроме как показать? Если только показать, то можно и вручную отрисовать. Если надо уметь что-то делать (типа передвигать ноды, удалять, добавлять и т.д.), то надо будет искать какой-нить навороченный компонент или писать свой. Ну и еще вопрос - а не лучше ли будет диаграмма Ганта? Вроде для Ганта есть компонент в DevExpress. |
#3
|
|||
|
|||
здравствуйте! про диаграмму Ганта почитаю.
а пока начал делать с помощью 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
|
|||
|
|||
Ну, в принципе, в правильном.
Как я понимаю, у тебя размер картинок одинков? Тогда так: 1. Загружаем все, повторяю ВСЕ, картинки в память. Можно, конечно, не грузить, просто нужно кол-во картинок на каждом уровне. 2. Ищем самый "широкий" уровень (где больше всего картинок) и запоминаем его общую ширину (включая промежутки между картинками). 3. Теперь рисуем поуровнево. Для текущего уровня опять считаем общую ширину картикок с промежутками и рисуем их от позиции Х как (Wmax - Wlvl)/2 (т.е. ширина уровня с наибольшим кол-вом картинок минус ширина текущено уровня деленная пополам - по сути, ценкровка картинок уровня). |
#5
|
|||
|
|||
искать ширину я пробовал, проблема в том что есть варианты, по типу таких
605.jpg потому что центрируется по "родитель (Parent_ID) - чайлд (ID)", а у меня пока Parent_ID вообще не задействован и я не понимаю как его использовать в данной задачи для расчета расположения. |
#6
|
|||
|
|||
Ну, как ты понимаешь, заложиться на все варианты не получится.
Как вариант, можно попробовать в случае, если ParentID только один, то располагать под соотв. родителем. Правда тут могут быть проблемы, если у других квадратиков паренты будут с разных сторон от того, у которого парент один. Сумбурно немного, но, надеюсь, понятно. Вариант - центровку делаем все равно так же (по крайней мере для 1-го уровня). Потом пытаемся центровать квадратики по родителям. Только учти вариант, когда детей больше, чем родителей. В принципе, я бы в памяти просто строил бы это дерево, сохраняя координаты, потом бы просто по построенному дереву "выплевывал" бы на канву. |
#7
|
||||
|
||||
Для реализации этого дела вам сначала надо решить несколько частных задач. Сделать графический объект "узел" у которого будут свои координаты на канве, а так-же точки соединения с другими узлами.
Сделать графический объект "соединение" которое имеет свои координаты, а так-же пару ссылок на объект "узел". Сделайте пару узлов и свяжите их объектом "соединение". Протестируйте на предмет произвольного расположения на канве этих объектов. А вот когда у вас получится заставить работать такую связку, можно и диаграмму строить любой сложности. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |