Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,898
RAD XE3+

Скроллинг в TScrollBox мышкой

31.05.2018, 14:58. Показов 5102. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Есть TScrollBox, а в нем большая карта. На ней в виде массива TImage расположены точки.
Так вот. Как сделать скроллинг по карте мышкой. Именно что зажимая левую кнопку мышку двигать карту. Точнее нужно сделать эффект движение карты на самом деле двигать ползунки. Я просто не силен в математки.
Подскажите пожалуйста формула расчета. Можно даже не кодом.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.05.2018, 14:58
Ответы с готовыми решениями:

Плавная прокрутка в TScrollBox
Собственно как сделать плавную прокрутку в скролбокс'е ?

В TScrollBox при появлении скролла смещаются компоненты
Я пользуюсь TScrollBox и когда появляется вертикальный ScrollBar смещаются все компоненты. Как это исправить?

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

27
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,670
Записей в блоге: 21
31.05.2018, 16:32
какая уж тут формула )
в OnMouseDown запомнить текущие значения ScrollBar'ов и мыши
поднять флаг назовите его например Dragging
в OnMouseMove если Dragging
то сравнивать текущую координату мыши с исходной DX=X-X0, DY=Y-Y0
и скроллбарам присваивать значение Xscroll=X0scroll+DX Yscroll=Y0scroll+DY
в OnMouseUp опустить флаг Dragging
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,898
31.05.2018, 16:55  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
какая уж тут формула )
в OnMouseDown запомнить текущие значения ScrollBar'ов и мыши
поднять флаг назовите его например Dragging
в OnMouseMove если Dragging
то сравнивать текущую координату мыши с исходной DX=X-X0, DY=Y-Y0
и скроллбарам присваивать значение Xscroll=X0scroll+DX Yscroll=Y0scroll+DY
в OnMouseUp опустить флаг Dragging
Не понял что у вас означают DX, X, X0, DY, Y, Y0
DX и DY это вроде координаты курсора
И еще. Только щас понял что срабатывание OnMouseMove нужно будет по карте ибо по scrollbox'у оно будет срабатывать

Добавлено через 6 минут
И еще. Только щас понял что срабатывание OnMouseMove нужно будет по карте ибо по scrollbox'у оно не будет срабатывать так как он перерыт картой
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,670
Записей в блоге: 21
31.05.2018, 21:05
вы в школе не учили формулы ?
X обычно обозначается текущее значение X
X0 - исходное значение
DX - дельта икс - рассчитаем по формуле DX=X-X0
что конкретно непонятно?
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,898
31.05.2018, 21:16  [ТС]
Чета я не правильно делаю
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
procedure TfrmMain.ScrollBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then
  begin
    ScrollX0 := ScrollBox1.HorzScrollBar.Position;
    ScrollY0 := ScrollBox1.VertScrollBar.Position;
    X0 := X;
    Y0 := Y;
    bDragging := True;
  end;
end;
 
procedure TfrmMain.ScrollBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var DX, DY: Integer;
begin
  if bDragging = false then Exit;
 
  DX := X - X0;
  DY := Y - Y0;
 
  ScrollBox1.HorzScrollBar.Position := ScrollX0 + DX;
 
  ScrollBox1.HorzScrollBar.Position := ScrollY0 + DY;
 
end;
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,670
Записей в блоге: 21
31.05.2018, 21:31
Лучший ответ Сообщение было отмечено Alexandr_7 как решение

Решение

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

Добавлено через 9 минут
вот вся моя программа
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
  TMainForm = class(TForm)
    ScrollBox1: TScrollBox;
    img1: TImage;
    procedure img1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure img1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure img1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    Dragging:boolean;
    P0:TPoint;
    V0:TPoint;
  end;
 
var
  MainForm: TMainForm;
 
implementation
uses Winapi.Windows;
 
{$R *.dfm}
 
{ TMainForm }
 
 
 
procedure TMainForm.img1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Dragging := true;
  P0 := Point(x,y);
  V0 := Point(ScrollBox1.HorzScrollBar.Position,ScrollBox1.VertScrollBar.Position);
end;
 
procedure TMainForm.img1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  d:TPoint;
  v:TPoint;
begin
  if not Dragging then
    exit;
 
  D := Point(X,Y) - P0;
  V := V0 - D;
  ScrollBox1.HorzScrollBar.Position := v.X;
  ScrollBox1.VertScrollBar.Position := v.Y;
end;
 
procedure TMainForm.img1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Dragging := false;
end;
1
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,898
01.06.2018, 15:22  [ТС]
Спасибо помогло но есть еще 1 вопрос.
Как переместить скролл на видимость выбранной метки.
Выбор происходит через CheckListBoxPackage
Точки на карте являются массивом TImage
Кто в курсе как это сделать.
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,670
Записей в блоге: 21
01.06.2018, 15:37
точки являются массивом точек
ну остыньте на секунду перестаньте кидать компоненты, нарисуйте на бумаге
вот абсолютно та же задача
Как сделать маркер на большом изображений Image?

Дано - оконные координаты объекта (где мы хотим его видеть в окне сейчас), мировые координаты объекта
Найти Offset
формула для 4-го класса:
Оконные = Мировые - Смещение_окна

Добавлено через 50 секунд
ну и предвосхищая
Image поверх Image тухлая идея
Просто рисуйте на PaintBox
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,898
01.06.2018, 17:22  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
ну и предвосхищая
Image поверх Image тухлая идея
Просто рисуйте на PaintBox
Я не предвосхищаю только мне просто события курсора над точкой нужны поэтому и выбрал Image а так можно в принципе и рисовать на Paint.
Вот с формулой не понял. Есть карта на ScrollBox нужно узнать позици скролинга так чтобы было видно точку когда ее выбираеш в CheckListBoxPackage
Также я не зря выбрал именно CheckListBox так как должна быть возможность скрывать точки что также имеет TImage в принципе можно заморочится с спрайтами только не знаю есть ли большой смысл. TImage какбы вместо спрайта. Просто так легче хотя по сути я использую отрисовку на Image точка тав виде картинке но поверх точки еще рисуется номер но это так. Подроности.
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,670
Записей в блоге: 21
01.06.2018, 20:04
вы когда ставите условие, вы переводите его на язык геометрии
что такое ВИДНО ТОЧКУ
это значит ее мировая координата больше смещения окна показа относительно начала карты но меньше этого значения плюс ширина окна

если вы знаете что точка должна быть в середине окна, то ее оконные координаты = ширина окна / 2 ; высота окна / 2
ее мировые координаты вы знаете
отсюда просто вычесть одно из другого и получим нужные значения Offset, т.е. смещения окна относительно карты
они же есть позиции скроллбаров
Миниатюры
Скроллинг в TScrollBox мышкой  
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,898
01.06.2018, 21:07  [ТС]
Очевидно я не правильно понял.
Delphi
1
2
ScrollBox1.HorzScrollBar.Position := ImgArrayPackage[CheckListBoxPackage.ItemIndex].Left - ScrollBox1.HorzScrollBar.Position;
ScrollBox1.VertScrollBar.Position := ImgArrayPackage[CheckListBoxPackage.ItemIndex].Top - ScrollBox1.VertScrollBar.Position;
А что означает Xoffset и Yoffset
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,670
Записей в блоге: 21
02.06.2018, 00:15
вы картинку видите?
найдите там Xoffset и смотрите что же он обозначает
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,898
04.06.2018, 10:17  [ТС]
Честно говоря не могу понять что означают Offset
Часть от размера карты. но нет. Для расчетов нельзя использовать позицию скрола так как кликнуть на checkbox можно и 2 раза на одном и томже месте

Добавлено через 2 минуты
Ну вот так попробывал но не работает
Delphi
1
2
ScrollBox1.HorzScrollBar.Position := ImgArrayPackage[CheckListBoxPackage.ItemIndex].Left - (ImgMap.Left - ScrollBox1.HorzScrollBar.Position);
  ScrollBox1.VertScrollBar.Position := ImgArrayPackage[CheckListBoxPackage.ItemIndex].Top - (ImgMap.Top - ScrollBox1.VertScrollBar.Position);
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,670
Записей в блоге: 21
04.06.2018, 10:36
1. карта (розовая) большая, в окно не влазит
2. значит окно (белое) смещено относительно начала карты и по X и по Y
3. смещение по-нерусски - Offset
4. значения xxScrollBar.Position это и есть Offset.X и Offset.Y

а вот это вообще не понял о чем.
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
ля расчетов нельзя использовать позицию скрола так как кликнуть на checkbox можно и 2 раза на одном и томже месте
задача состоит в том, как УЗНАТЬ нужную позицию скролла
в разделе Дано: при выборе в CheckList мы получаем координаты объекта относительно карты
координаты объекта относительно окна я уже говорил, зависят, где этот объект в окне вы хотите увидеть
в центре, в углу, сбоку. Откуда я знаю, что вы имели в виду
переместить скролл на видимость выбранной метки.
не бывает просто "видимости", нужно сказать где конкретно
центр окна = (ширина/2;высота/2)
верхний левый угол = (0;0)

имея два числа из трех в формуле, третье вычислить крайне легко
вот это значение и подставить в Scroll.Positiokn
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,898
04.06.2018, 17:23  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
4. значения xxScrollBar.Position это и есть Offset.X и Offset.Y
Ну это вот вариант
ScrollBox1.HorzScrollBar.Position := ImgArrayPackage[CheckListBoxPackage.ItemIndex].Left - ScrollBox1.HorzScrollBar.Position;
ScrollBox1.VertScrollBar.Position := ImgArrayPackage[CheckListBoxPackage.ItemIndex].Top - ScrollBox1.VertScrollBar.Position;
Но он не корректно работает. Например если по 1 номеру кликнуть 2 раз
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,670
Записей в блоге: 21
04.06.2018, 17:47
зрение так себе, я вижу.
помогу
Цитата Сообщение от krapotkin Посмотреть сообщение
4. значения xxScrollBar.Position это и есть Offset.X и Offset.Y
в ваше выражение
ScrollBox1.HorzScrollBar.Position := ImgArrayPackage[CheckListBoxPackage.ItemIndex].Left - ScrollBox1.HorzScrollBar.Position
подставим вместо ScrollBox1.HorzScrollBar.Position offset.X
получим
Delphi
1
offset.X :=  ImgArrayPackage[CheckListBoxPackage.ItemIndex].Left - offset.X;
покажите мне пожалуйста, где я показывал такую формулу
а если более обидно, вообще формулу, в которой переменная зависит сама от себя???

ваша координата
ImgArrayPackage[CheckListBoxPackage.ItemIndex].Left
это координата относительно карты

то место, где в окне БУДЕТ показан ваш Image - координата относительно ОКНА

осталось только определить, насколько окно смещено относительно карты

где в вашей формуле КООРДИНАТЫ МЕСТА ГДЕ БУДЕТ ОТОБРАЖАТЬСЯ Image относительно НАЧАЛА ОКНА?
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,898
04.06.2018, 18:59  [ТС]
Ну так тогда что у вас XW и YW
Ведь нужно указывать позицию не точки а скролла чтобы эту тачку стало видно. Точки уже имеют позицию и менятся они не будут
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,670
Записей в блоге: 21
04.06.2018, 19:36
ну на картинке же помечено все
если трудно в 2d перейдем в 1d
я прямо старался
Миниатюры
Скроллинг в TScrollBox мышкой  
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,898
05.06.2018, 04:41  [ТС]
Ну ладно Xm по идеи должен быть ImgMap а Xw это точка.
но менять нужно не позицию точки. Точка должна быть на одном месте

Добавлено через 7 минут
Судя по всем так
Delphi
1
2
ScrollBox1.HorzScrollBar.Position := ImgArrayPackage[CheckListBoxPackage.ItemIndex].Left - ImgMap.Left;
  ScrollBox1.VertScrollBar.Position := ImgArrayPackage[CheckListBoxPackage.ItemIndex].Top - ImgMap.Top;
Точку конечно видно при таком варианте но не по центру.
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,670
Записей в блоге: 21
05.06.2018, 15:20
пусть у вас Image лежит на scrollbox и его координата Left = 1000 (ImgArrayPackage[nnn].Left)
тогда если вы сделаете ScrollBox.HorzScrollBar.Position = 1000 то этот Image будет в вашем окне у самого левого края
что не так??
Вложения
Тип файла: rar VCLProject.rar (2.52 Мб, 9 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.06.2018, 15:20
Помогаю со студенческими работами здесь

Позиция в TScrollBox
Здравствуйте. Я динамически создаю TImage на TScrollBox. Позицию картинки TImage указываю так: ..... TImage *img = new...

Перехват события прокрутки в TScrollBox
Как сделать перехват сообщения прокрутки для ScroolBox?

Управление TScrollBox через TScrollBar
Здраствуйте. У меня есть пара вопросов по TScrollBox и TScrollBar 1. Как узнать ваообще появилась ли прокурутка в TScrollBox 2. Так как...

Удаление под элементов компонента TScrollBox
Привет Всем Форумчан! Я нависал маленький код для андроид приложения. Там внутри СкролБокс Создаются автоматом Баттоны и хочу после...

TScrollBox, рассчитать позицию компонента на нем
На TScrollBox создаю подряд ряд панелей. По нажатию на панель, раскрывается TMemo. Как можно вычислить и передвинуть скролл TScrollBox. так...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru