46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,771
|
|
1 | |
RAD XE3+ Скроллинг в TScrollBox мышкой31.05.2018, 14:58. Показов 3481. Ответов 27
Метки нет Все метки)
(
Здравствуйте.
Есть TScrollBox, а в нем большая карта. На ней в виде массива TImage расположены точки. Так вот. Как сделать скроллинг по карте мышкой. Именно что зажимая левую кнопку мышку двигать карту. Точнее нужно сделать эффект движение карты на самом деле двигать ползунки. Я просто не силен в математки. Подскажите пожалуйста формула расчета. Можно даже не кодом.
0
|
|
31.05.2018, 14:58 | |
Ответы с готовыми решениями:
27
В TScrollBox при появлении скролла смещаются компоненты Как реализовать скроллинг больших изображений мышкой
|
31.05.2018, 16:32 | 2 |
какая уж тут формула )
в OnMouseDown запомнить текущие значения ScrollBar'ов и мыши поднять флаг назовите его например Dragging в OnMouseMove если Dragging то сравнивать текущую координату мыши с исходной DX=X-X0, DY=Y-Y0 и скроллбарам присваивать значение Xscroll=X0scroll+DX Yscroll=Y0scroll+DY в OnMouseUp опустить флаг Dragging
0
|
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,771
|
|
31.05.2018, 16:55 [ТС] | 3 |
Не понял что у вас означают DX, X, X0, DY, Y, Y0
DX и DY это вроде координаты курсора И еще. Только щас понял что срабатывание OnMouseMove нужно будет по карте ибо по scrollbox'у оно будет срабатывать Добавлено через 6 минут И еще. Только щас понял что срабатывание OnMouseMove нужно будет по карте ибо по scrollbox'у оно не будет срабатывать так как он перерыт картой
0
|
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,771
|
||||||
31.05.2018, 21:16 [ТС] | 5 | |||||
Чета я не правильно делаю
0
|
31.05.2018, 21:31 | 6 | |||||
![]() Решение
а выглядит ничего так, правильно )
я конечно мог со знаком ошибиться, так легко проверить Добавлено через 9 минут вот вся моя программа Кликните здесь для просмотра всего текста
1
|
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,771
|
|
01.06.2018, 15:22 [ТС] | 7 |
Спасибо помогло но есть еще 1 вопрос.
Как переместить скролл на видимость выбранной метки. Выбор происходит через CheckListBoxPackage Точки на карте являются массивом TImage Кто в курсе как это сделать.
0
|
01.06.2018, 15:37 | 8 |
точки являются массивом точек
ну остыньте на секунду перестаньте кидать компоненты, нарисуйте на бумаге вот абсолютно та же задача Как сделать маркер на большом изображений Image? Дано - оконные координаты объекта (где мы хотим его видеть в окне сейчас), мировые координаты объекта Найти Offset формула для 4-го класса: Оконные = Мировые - Смещение_окна Добавлено через 50 секунд ну и предвосхищая Image поверх Image тухлая идея Просто рисуйте на PaintBox
0
|
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,771
|
|
01.06.2018, 17:22 [ТС] | 9 |
Я не предвосхищаю только мне просто события курсора над точкой нужны поэтому и выбрал Image а так можно в принципе и рисовать на Paint.
Вот с формулой не понял. Есть карта на ScrollBox нужно узнать позици скролинга так чтобы было видно точку когда ее выбираеш в CheckListBoxPackage Также я не зря выбрал именно CheckListBox так как должна быть возможность скрывать точки что также имеет TImage в принципе можно заморочится с спрайтами только не знаю есть ли большой смысл. TImage какбы вместо спрайта. Просто так легче хотя по сути я использую отрисовку на Image точка тав виде картинке но поверх точки еще рисуется номер но это так. Подроности.
0
|
01.06.2018, 20:04 | 10 |
вы когда ставите условие, вы переводите его на язык геометрии
что такое ВИДНО ТОЧКУ это значит ее мировая координата больше смещения окна показа относительно начала карты но меньше этого значения плюс ширина окна если вы знаете что точка должна быть в середине окна, то ее оконные координаты = ширина окна / 2 ; высота окна / 2 ее мировые координаты вы знаете отсюда просто вычесть одно из другого и получим нужные значения Offset, т.е. смещения окна относительно карты они же есть позиции скроллбаров
0
|
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,771
|
||||||
01.06.2018, 21:07 [ТС] | 11 | |||||
Очевидно я не правильно понял.
0
|
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,771
|
||||||
04.06.2018, 10:17 [ТС] | 13 | |||||
Честно говоря не могу понять что означают Offset
Часть от размера карты. но нет. Для расчетов нельзя использовать позицию скрола так как кликнуть на checkbox можно и 2 раза на одном и томже месте Добавлено через 2 минуты Ну вот так попробывал но не работает
0
|
04.06.2018, 10:36 | 14 |
1. карта (розовая) большая, в окно не влазит
2. значит окно (белое) смещено относительно начала карты и по X и по Y 3. смещение по-нерусски - Offset 4. значения xxScrollBar.Position это и есть Offset.X и Offset.Y а вот это вообще не понял о чем. задача состоит в том, как УЗНАТЬ нужную позицию скролла в разделе Дано: при выборе в CheckList мы получаем координаты объекта относительно карты координаты объекта относительно окна я уже говорил, зависят, где этот объект в окне вы хотите увидеть в центре, в углу, сбоку. Откуда я знаю, что вы имели в виду центр окна = (ширина/2;высота/2) верхний левый угол = (0;0) имея два числа из трех в формуле, третье вычислить крайне легко вот это значение и подставить в Scroll.Positiokn
0
|
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,771
|
|
04.06.2018, 17:23 [ТС] | 15 |
Ну это вот вариант
ScrollBox1.HorzScrollBar.Position := ImgArrayPackage[CheckListBoxPackage.ItemIndex].Left - ScrollBox1.HorzScrollBar.Position; ScrollBox1.VertScrollBar.Position := ImgArrayPackage[CheckListBoxPackage.ItemIndex].Top - ScrollBox1.VertScrollBar.Position; Но он не корректно работает. Например если по 1 номеру кликнуть 2 раз
0
|
04.06.2018, 17:47 | 16 | |||||
зрение так себе, я вижу.
помогу в ваше выражение ScrollBox1.HorzScrollBar.Position := ImgArrayPackage[CheckListBoxPackage.ItemIndex].Left - ScrollBox1.HorzScrollBar.Position подставим вместо ScrollBox1.HorzScrollBar.Position offset.X получим
а если более обидно, вообще формулу, в которой переменная зависит сама от себя??? ваша координата ImgArrayPackage[CheckListBoxPackage.ItemIndex].Left это координата относительно карты то место, где в окне БУДЕТ показан ваш Image - координата относительно ОКНА осталось только определить, насколько окно смещено относительно карты где в вашей формуле КООРДИНАТЫ МЕСТА ГДЕ БУДЕТ ОТОБРАЖАТЬСЯ Image относительно НАЧАЛА ОКНА?
0
|
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,771
|
|
04.06.2018, 18:59 [ТС] | 17 |
Ну так тогда что у вас XW и YW
Ведь нужно указывать позицию не точки а скролла чтобы эту тачку стало видно. Точки уже имеют позицию и менятся они не будут
0
|
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,771
|
||||||
05.06.2018, 04:41 [ТС] | 19 | |||||
Ну ладно Xm по идеи должен быть ImgMap а Xw это точка.
но менять нужно не позицию точки. Точка должна быть на одном месте Добавлено через 7 минут Судя по всем так
0
|
05.06.2018, 15:20 | 20 |
пусть у вас Image лежит на scrollbox и его координата Left = 1000 (ImgArrayPackage[nnn].Left)
тогда если вы сделаете ScrollBox.HorzScrollBar.Position = 1000 то этот Image будет в вашем окне у самого левого края что не так??
0
|
05.06.2018, 15:20 | |
Помогаю со студенческими работами здесь
20
Перехват события прокрутки в TScrollBox Управление TScrollBox через TScrollBar Удаление под элементов компонента TScrollBox
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |