![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: 2 Всего: 3 |
Компонент TPanel я использую в качестве поля для размещения TImage компонентов (рисунки оборудования сельского хозяйства) при перемещении этих компонентов по TPanel мне неоходимо сделать так, что если компонент выходит за границы TPanel, то у нее появлялся бы ScrollBar, который мог бы ее разтягивать хоть до бесконечности, что позволило иметь сколь угодно большие размеры TPanel для построения схемы из TImage. Как это сделать?
-------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 49 Всего: 76 |
что-то доконца непонял что ты хотешь, но может ScrollBox тебе поможет.
-------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 26 Всего: 108 |
скрулы можно и так к картинке привязать... -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
| Samhein |
|
|||
|
Башзэфашовец ![]() ![]() Профиль Группа: Участник Сообщений: 282 Регистрация: 27.6.2005 Репутация: нет Всего: 3 |
По моему лучше увиличевать с помощью кнопок
Это сообщение отредактировал(а) Samhein - 26.9.2005, 21:25 -------------------- Знаю форум наизусть, но писать еще боюсь |
|||
|
||||
| Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 26 Всего: 108 |
если правиль понял, то у него может быть картинка больше размера панели, а сжимать её он до этих вот размеров не хочет. Вот он и спрашивает, можно ли организовать прокрутку для этой картинки.
Вот мы ему и говорим, что это легко делается через ScrollBox или обычные скрулы Это сообщение отредактировал(а) Girder - 5.10.2005, 02:11 -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
| Samhein |
|
|||
|
Башзэфашовец ![]() ![]() Профиль Группа: Участник Сообщений: 282 Регистрация: 27.6.2005 Репутация: нет Всего: 3 |
Я не понимаю, надо увиличевать панель с картинкой или прокручивать картинку в панели?
-------------------- Знаю форум наизусть, но писать еще боюсь |
|||
|
||||
| Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 26 Всего: 108 |
а вот пример со скрулами:
-------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
| ДЫМ |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 224 Регистрация: 6.1.2004 Репутация: 8 Всего: 8 |
Delphist , я тут обратил внимание на твои твои посты и вобщем у меня сложилось представление о проекте, который ты делаешь. Насколько я понял, ты пишешь что-то вроде редактора схем. Так вот, позволь дать тебе совет. Каждый редактор подразумевает рабочий документ, ведь тебе надо сохранять и и загружать ранее созданные схемы. У тебя роль документа выполняет Canvas панели, а элементы документа - экземпляры TImage. Это очень нерационально и коряво.
Лучше сделай так - создай в памяти объект TBitmap (можешь и метафайл, но с ним мороки больше), и на его канве уже рисуй схему в том числе и картинки (обойдешься без TImage). А сохранять можно будет в векторном формате, - например, в таблице базы данных сохраняй координаты соединительных линий, элементы-картинки храни отдельно, а в таблице - ссылки на них. К тому же появлятся возможность масштабирования схемы через координаты. А что касается вывода документа на панель, то тут может быть несколько вариантов. Лучше всего копировать куски документа по размеру панели, а к самой панели пристегнуть ScrollBar`ы, которые отслеживают положение базовой точки. Можно панель поместить в ScrollBox, и установить свойство панели AutoSize в True, но тут будут проблемы с навигацией.
Хотел бы тебя предостеречь, если ты хочешь увеличивать размеры панели "до бесконечности", то память у тебя кончится намного раньше, ведь рисуя на панели ты имеешь дело все с тем же Bitmap`ом. Для справки Bitmap размером 3000/2000 (у меня на нем только примитивы нарисованы) требует порядка 20 метров. |
|||
|
||||
| Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: 2 Всего: 3 |
Вообщем на счет редактора ты прав. Но работает не совсем так ка ты описал. Редактор состоит следующим образом. Есть главный 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-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
А чем все-таки не подходит TScrollBox (взамен главной TPanel) ?
-------------------- С уважением, г-н Посол. |
|||
|
||||
| ДЫМ |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 224 Регистрация: 6.1.2004 Репутация: 8 Всего: 8 |
Вот хоть убей не пойму, зачем тебе в качестве элементов схемы матрешки из объектов-контролов. Делай все через координаты. То есть у тебя есть какой-то виртуальный холст, а элементы схемы - это прямоугольные области, положение которых на виртуальном холсте определяются координатами левого верхнего угла и высотой/шириной прямоугольника. Эти прямоугольники потом и соединяешь линиями. Это все хозяйство выводишь в окно кусками, а чтобы знать положение фрагмента заведи базовую точку. Ну еще чтобы таскать элементы - отслеживай положение указателя мыши относительно базовой точки и если указатель попадает в прямоугольник элемента, начинай тянуть (изменять координаты прямоугольника) и перерисовывай текщий кусок схемы. Вроде понятно изложил.
Вот именно, что слишком расширить панель, а тем более "без ограничения" не получится. Память не резиновая. Все равно придется решать задачу в координатах. Может и не тем путем, который я описал. Но вот просто взять и увеличить размер панели по размеру схемы не годится. |
|||
|
||||
| Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: 2 Всего: 3 |
После прочтения твоей статьи возникли вопросы:
1) Как создается виртуальный холст; 2) Что за прямоугольные области и как в нее запихнуть рисунок моего технологического оборудования без объектов-контролов; 3) Как прямоугольник выводить в окно кусками; Это сообщение отредактировал(а) Delphist - 4.10.2005, 11:24 -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
| ДЫМ |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 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). |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |