Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,814
1
RAD XE3+

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

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

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

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

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

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

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

27
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
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,814
31.05.2018, 16:55  [ТС] 3
Цитата Сообщение от 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
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
31.05.2018, 21:05 4
вы в школе не учили формулы ?
X обычно обозначается текущее значение X
X0 - исходное значение
DX - дельта икс - рассчитаем по формуле DX=X-X0
что конкретно непонятно?
0
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,814
31.05.2018, 21:16  [ТС] 5
Чета я не правильно делаю
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
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
31.05.2018, 21:31 6
Лучший ответ Сообщение было отмечено 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
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,814
01.06.2018, 15:22  [ТС] 7
Спасибо помогло но есть еще 1 вопрос.
Как переместить скролл на видимость выбранной метки.
Выбор происходит через CheckListBoxPackage
Точки на карте являются массивом TImage
Кто в курсе как это сделать.
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
01.06.2018, 15:37 8
точки являются массивом точек
ну остыньте на секунду перестаньте кидать компоненты, нарисуйте на бумаге
вот абсолютно та же задача
Как сделать маркер на большом изображений Image?

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

Добавлено через 50 секунд
ну и предвосхищая
Image поверх Image тухлая идея
Просто рисуйте на PaintBox
0
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,814
01.06.2018, 17:22  [ТС] 9
Цитата Сообщение от krapotkin Посмотреть сообщение
ну и предвосхищая
Image поверх Image тухлая идея
Просто рисуйте на PaintBox
Я не предвосхищаю только мне просто события курсора над точкой нужны поэтому и выбрал Image а так можно в принципе и рисовать на Paint.
Вот с формулой не понял. Есть карта на ScrollBox нужно узнать позици скролинга так чтобы было видно точку когда ее выбираеш в CheckListBoxPackage
Также я не зря выбрал именно CheckListBox так как должна быть возможность скрывать точки что также имеет TImage в принципе можно заморочится с спрайтами только не знаю есть ли большой смысл. TImage какбы вместо спрайта. Просто так легче хотя по сути я использую отрисовку на Image точка тав виде картинке но поверх точки еще рисуется номер но это так. Подроности.
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
01.06.2018, 20:04 10
вы когда ставите условие, вы переводите его на язык геометрии
что такое ВИДНО ТОЧКУ
это значит ее мировая координата больше смещения окна показа относительно начала карты но меньше этого значения плюс ширина окна

если вы знаете что точка должна быть в середине окна, то ее оконные координаты = ширина окна / 2 ; высота окна / 2
ее мировые координаты вы знаете
отсюда просто вычесть одно из другого и получим нужные значения Offset, т.е. смещения окна относительно карты
они же есть позиции скроллбаров
Миниатюры
Скроллинг в TScrollBox мышкой  
0
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,814
01.06.2018, 21:07  [ТС] 11
Очевидно я не правильно понял.
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
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
02.06.2018, 00:15 12
вы картинку видите?
найдите там Xoffset и смотрите что же он обозначает
0
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,814
04.06.2018, 10:17  [ТС] 13
Честно говоря не могу понять что означают 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
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
04.06.2018, 10:36 14
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
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,814
04.06.2018, 17:23  [ТС] 15
Цитата Сообщение от 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
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
04.06.2018, 17:47 16
зрение так себе, я вижу.
помогу
Цитата Сообщение от 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
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,814
04.06.2018, 18:59  [ТС] 17
Ну так тогда что у вас XW и YW
Ведь нужно указывать позицию не точки а скролла чтобы эту тачку стало видно. Точки уже имеют позицию и менятся они не будут
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
04.06.2018, 19:36 18
ну на картинке же помечено все
если трудно в 2d перейдем в 1d
я прямо старался
Миниатюры
Скроллинг в TScrollBox мышкой  
0
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,814
05.06.2018, 04:41  [ТС] 19
Ну ладно 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
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
05.06.2018, 15:20 20
пусть у вас Image лежит на scrollbox и его координата Left = 1000 (ImgArrayPackage[nnn].Left)
тогда если вы сделаете ScrollBox.HorzScrollBar.Position = 1000 то этот Image будет в вашем окне у самого левого края
что не так??
Вложения
Тип файла: rar VCLProject.rar (2.52 Мб, 9 просмотров)
0
05.06.2018, 15:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.06.2018, 15:20
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru