Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Растягивание TPanel через ScrollBar


Автор: Delphist 26.9.2005, 14:29
Компонент TPanel я использую в качестве поля для размещения TImage компонентов (рисунки оборудования сельского хозяйства) при перемещении этих компонентов по TPanel мне неоходимо сделать так, что если компонент выходит за границы TPanel, то у нее появлялся бы ScrollBar, который мог бы ее разтягивать хоть до бесконечности, что позволило иметь сколь угодно большие размеры TPanel для построения схемы из TImage. Как это сделать?

Автор: Rennigth 26.9.2005, 15:13
что-то доконца непонял что ты хотешь, но может ScrollBox тебе поможет.

Автор: Albinos_x 26.9.2005, 15:22
Цитата
что-то доконца непонял что ты хотешь,

скрулы можно и так к картинке привязать...

Автор: Samhein 26.9.2005, 21:23
По моему лучше увиличевать с помощью кнопок

Автор: Albinos_x 26.9.2005, 21:25
если правиль понял, то у него может быть картинка больше размера панели, а сжимать её он до этих вот размеров не хочет. Вот он и спрашивает, можно ли организовать прокрутку для этой картинки.
Вот мы ему и говорим, что это легко делается через ScrollBox или обычные скрулы

Автор: Samhein 26.9.2005, 21:34
Я не понимаю, надо увиличевать панель с картинкой или прокручивать картинку в панели?

Автор: Albinos_x 26.9.2005, 21:39
а вот пример со скрулами:
Код
...
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
IF openpicturedialog1.Execute
 then
 begin
 image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
 if Image1.picture<>nil then
  begin
  if (Image1.Picture.Width> ScrollBar1.Max) or
     (Image1.Picture.Height>ScrollBar2.Max) then
   begin
   ScrollBar1.max:=Image1.picture.width-panel1.width;
   scrollbar2.max:=image1.picture.height-panel1.height;
   end;
  end;
 end;
end;

procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
Image1.Left:=-scrollbar1.Position;
end;

procedure TForm1.ScrollBar2Change(Sender: TObject);
begin
Image1.top:=-scrollbar2.Position;
end;
...

Автор: ДЫМ 27.9.2005, 01:50
Delphist , я тут обратил внимание на твои твои посты и вобщем у меня сложилось представление о проекте, который ты делаешь. Насколько я понял, ты пишешь что-то вроде редактора схем. Так вот, позволь дать тебе совет. Каждый редактор подразумевает рабочий документ, ведь тебе надо сохранять и и загружать ранее созданные схемы. У тебя роль документа выполняет Canvas панели, а элементы документа - экземпляры TImage. Это очень нерационально и коряво.

Лучше сделай так - создай в памяти объект TBitmap (можешь и метафайл, но с ним мороки больше), и на его канве уже рисуй схему в том числе и картинки (обойдешься без TImage). А сохранять можно будет в векторном формате, - например, в таблице базы данных сохраняй координаты соединительных линий, элементы-картинки храни отдельно, а в таблице - ссылки на них. К тому же появлятся возможность масштабирования схемы через координаты.

А что касается вывода документа на панель, то тут может быть несколько вариантов. Лучше всего копировать куски документа по размеру панели, а к самой панели пристегнуть ScrollBar`ы, которые отслеживают положение базовой точки.
Можно панель поместить в ScrollBox, и установить свойство панели AutoSize в True, но тут будут проблемы с навигацией.
Цитата

который мог бы ее разтягивать хоть до бесконечности, что позволило иметь сколь угодно большие размеры TPanel


Хотел бы тебя предостеречь, если ты хочешь увеличивать размеры панели "до бесконечности", то память у тебя кончится намного раньше, ведь рисуя на панели ты имеешь дело все с тем же Bitmap`ом.
Для справки Bitmap размером 3000/2000 (у меня на нем только примитивы нарисованы) требует порядка 20 метров.

Автор: Delphist 30.9.2005, 12:51
Цитата
Delphist Насколько я понял, ты пишешь что-то вроде редактора схем. Так вот, позволь дать тебе совет. Каждый редактор подразумевает рабочий документ, ведь тебе надо сохранять и и загружать ранее созданные схемы. У тебя  роль документа выполняет Canvas панели, а элементы документа - экземпляры TImage. Это очень нерационально и коряво.

Вообщем на счет редактора ты прав. Но работает не совсем так ка ты описал. Редактор состоит следующим образом. Есть главный TPanel на нем размещен TPaintBox(для рисования всяких там наворотов: координатная сетка линии для соединения моих объектов и т.п.). На этот главный ТPanel размещаются мои объекты (технологическе оборудование). Каждый мой объект наследуется от TObject и состоит из TPanel'и и TImage расположенной на этой TPanel'и. В Timage размещается рисунок (metafile) отображающий вид технологического оборудования. Каждый мой объект можно размещать на главный TPanel и перемещать его.

Теперь встали 2 задачи следующего содержания:
1) мне необходимо сделать так, что если мой объект выходит за границу главного TPanel'a, должен появится ScrollBar который разширяет ширину или высоту главного TPanel'a тем самым даёт возможность моему объекту без ограничения перемещаться.
2) мне необходимо сделать соединение между моими объетоми через линию, которая бы красиво изгибалась при перемещении моих объктов (может чего посоветуете в этом направлении)

Автор: p0s0l 30.9.2005, 16:38
А чем все-таки не подходит TScrollBox (взамен главной TPanel) ?

Автор: ДЫМ 3.10.2005, 01:25
Вот хоть убей не пойму, зачем тебе в качестве элементов схемы матрешки из объектов-контролов. Делай все через координаты. То есть у тебя есть какой-то виртуальный холст, а элементы схемы - это прямоугольные области, положение которых на виртуальном холсте определяются координатами левого верхнего угла и высотой/шириной прямоугольника. Эти прямоугольники потом и соединяешь линиями. Это все хозяйство выводишь в окно кусками, а чтобы знать положение фрагмента заведи базовую точку. Ну еще чтобы таскать элементы - отслеживай положение указателя мыши относительно базовой точки и если указатель попадает в прямоугольник элемента, начинай тянуть (изменять координаты прямоугольника) и перерисовывай текщий кусок схемы. Вроде понятно изложил.

Цитата
1) мне необходимо сделать так, что если мой объект выходит за границу главного TPanel'a, должен появится ScrollBar который разширяет ширину или высоту главного TPanel'a тем самым даёт возможность моему объекту без ограничения перемещаться.


Вот именно, что слишком расширить панель, а тем более "без ограничения" не получится. Память не резиновая.
Все равно придется решать задачу в координатах. Может и не тем путем, который я описал. Но вот просто взять и увеличить размер панели по размеру схемы не годится.


Автор: Delphist 4.10.2005, 11:22
После прочтения твоей статьи возникли вопросы:
1) Как создается виртуальный холст;
2) Что за прямоугольные области и как в нее запихнуть рисунок моего технологического оборудования без объектов-контролов;
3) Как прямоугольник выводить в окно кусками;

Автор: ДЫМ 9.10.2005, 03:15
Привет, Delphist. Получил тут твое письмо. На всякий случай дублирую на форуме.

Постараюсь ответить по пунктам.
1) Как создается виртуальный холст;
Дело в том, что "виртуальный холст" никак не создается. Если хочешь, - это
такая "фигура речи".
Просто подразумевается, что вся графика хранится в векторном формате.
Например, треугольник - как набор трех точек (имеются в виду координаты).
Скажем, для того чтобы, переместить треугольник вправо надо ко всем
абсциссам прибавть шаг смещения и получим новые координаты. А собственно,
"виртуальный холст" - это текущий размер документа (схемы) в соответсвии с
масштабом, в общем случае - вся плоскость XY.
Я в свое время писал карту-схему города, но обычно любые схемы делаются в
векторном формате. Твоя задача, мне кажется, - не исключение.

> 2) Что за прямоугольные области и как в нее запихнуть рисунок моего
технологического оборудования без объектов-контролов;
> 3) Как прямоугольник выводить в окно кусками;

Давай лучше на твоем примере. Допустим, в самом простом случае, у тебя две
картинки соединяются прямой линией. В векторном формате - это два
прямоугольника по размеру картинок, положение каждого на плоскости
определяется координатами левого верхнего угла, его высотой и шириной. Как
ты их будешь соединять - твое дело, можно вычислить координаты середин
каких-то двух сторон, а затем соединить эти точки, можно соединять середины
прямоугольников. Чтобы нарисовать собственно картинку, используй метод
TCanvas.Draw(X,Y,Picture), где X,Y - текущие координаты картинки.
А для того, чтобы выводить схему в окно кусками - надо завести базовую
точку, которая будет определять положение прямоугольника окна относительно
схемы.
Например, базовая точка, пусть (700, 500), ширина окна 300, высота 400.
Значит ты должен нарисовать на канве объекты схемы, которые находятся (может
даже частично) в прямоугольнике (700,500,1000,900). Допустим есть картинка,
левый верхний угол которой (800, 650), она попадает в окно, значит рисуем ее
на канве. Для этого вычитаем координаты базовой точки из координат левого
верхнего угла картинки, то есть
Canvas.Draw(100, 150, MyPicture). Причем не надо волноваться, если
координаты получатся отрицательными,
GDI сама произведет отсечение. Если объектов не много, можно и не
использовать пространственное индексирование (определять, попадают объекты в
окно или нет), просто вычитай из всех координат объектов координаты базовой
точки и рисуй на канве окна.

Аналогично осуществляется и "обратная связь" - положение курсора мыши на
схеме рассчитываем относительно базовой точки (прибавляем к координатам
курсора координаты базовой точки), а потом уже смотрим над каким элементом
схемы находится мышь (для прямоугольных элементов используем функцию
PtInRect).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)