![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
||||
|
||||
|
Для реализации этого дела вам сначала надо решить несколько частных задач. Сделать графический объект "узел" у которого будут свои координаты на канве, а так-же точки соединения с другими узлами.
Сделать графический объект "соединение" которое имеет свои координаты, а так-же пару ссылок на объект "узел". Сделайте пару узлов и свяжите их объектом "соединение". Протестируйте на предмет произвольного расположения на канве этих объектов. А вот когда у вас получится заставить работать такую связку, можно и диаграмму строить любой сложности. |