Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Растягивание TPanel через ScrollBar 
:(
    Опции темы
Delphist
  Дата 26.9.2005, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: 2
Всего: 3



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


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Rennigth
Дата 26.9.2005, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



что-то доконца непонял что ты хотешь, но может ScrollBox тебе поможет.


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Albinos_x
Дата 26.9.2005, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата
что-то доконца непонял что ты хотешь,

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


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Samhein
Дата 26.9.2005, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Башзэфашовец
**


Профиль
Группа: Участник
Сообщений: 282
Регистрация: 27.6.2005

Репутация: нет
Всего: 3



По моему лучше увиличевать с помощью кнопок

Это сообщение отредактировал(а) Samhein - 26.9.2005, 21:25


--------------------
Знаю форум наизусть, но писать еще боюсь
PM   Вверх
Albinos_x
Дата 26.9.2005, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



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

Это сообщение отредактировал(а) Girder - 5.10.2005, 02:11


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Samhein
Дата 26.9.2005, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Башзэфашовец
**


Профиль
Группа: Участник
Сообщений: 282
Регистрация: 27.6.2005

Репутация: нет
Всего: 3



Я не понимаю, надо увиличевать панель с картинкой или прокручивать картинку в панели?


--------------------
Знаю форум наизусть, но писать еще боюсь
PM   Вверх
Albinos_x
Дата 26.9.2005, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



а вот пример со скрулами:
Код
...
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;
...



--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
ДЫМ
Дата 27.9.2005, 01:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 6.1.2004

Репутация: 8
Всего: 8



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

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

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

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


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

PM MAIL WWW   Вверх
Delphist
  Дата 30.9.2005, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: 2
Всего: 3



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

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

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

Это сообщение отредактировал(а) Delphist - 4.10.2005, 11:11


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
p0s0l
Дата 30.9.2005, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



А чем все-таки не подходит TScrollBox (взамен главной TPanel) ?



--------------------
С уважением, г-н Посол.
PM   Вверх
ДЫМ
Дата 3.10.2005, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 6.1.2004

Репутация: 8
Всего: 8



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

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


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


PM MAIL WWW   Вверх
Delphist
  Дата 4.10.2005, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: 2
Всего: 3



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

Это сообщение отредактировал(а) Delphist - 4.10.2005, 11:24


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
ДЫМ
Дата 9.10.2005, 03:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 6.1.2004

Репутация: 8
Всего: 8



Привет, 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).

PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0641 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.