Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/91: Рейтинг темы: голосов - 91, средняя оценка - 4.95
0 / 0 / 1
Регистрация: 10.03.2011
Сообщений: 7
1

Обработка прокрутки мышью

10.03.2011, 23:18. Показов 18185. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
У меня не работает обработка события от прокрутки колёсика мыши (OnMouseWheelDown и OnMouseWheelUp) в компоненте TImage. Я хочу изменять размер изображения карты нажатием Ctrl + колёсико мыши. Причем, у компонента TForm все это работает, а у TScrollBox не работает. В чем дело?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.03.2011, 23:18
Ответы с готовыми решениями:

Обработка прокрутки колеса мыши
Всем доброго дня. Такая проблема: никак не могу обработать прокрутку колесом в компоненте...

Универсальная обработка клика мышью
Всем привет! Допустим, есть у меня 10 каких-либо объектов на форме. Пусть для примера это будет 10...

Работа с мышью. Обработка кликов
Обработка кликов мыши (0 - кликов нет, 1 - лкм, 2 - пкм). Знаю, что косяк в jmp progr - циклится...

Обработка повторного клика мышью в TextBox
Как оброботать повторное нажатие на TextBox ? private void textBox_Click(object sender,...

8
3218 / 2361 / 540
Регистрация: 11.09.2009
Сообщений: 8,602
10.03.2011, 23:25 2
Цитата Сообщение от E567 Посмотреть сообщение
В чем дело?
Видимо, в коде. Надо его тут показать.
2
160 / 159 / 13
Регистрация: 14.01.2010
Сообщений: 1,497
10.03.2011, 23:38 3
Кажется Image не принимает фокус, и ScrollBox с Image так же не принимает фокус. Вот поставь на ScrollBox кнопку и попробуй, должно получиться(кнопка в фокусе). Попробуй ScrollBox1.SetFocus.
1
0 / 0 / 1
Регистрация: 10.03.2011
Сообщений: 7
12.03.2011, 00:20  [ТС] 4
код простой ))) мне важно суть выяснить.
procedure TForm1.ScrollBox1MouseWheelDown(Sender: TObject;
Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
var i:integer;
begin
i:=MousePos.x;
end;
Вообще странно, вроде фокус здесь не при чем, ведь обработчик для OnMoseDown работает "без фокусов" ))). Хотя нет, кликая, мы заодно принимаем фокус. А в PaintBox фокусв нет, а обработчик
OnMouseDown работает.

Ура! Вставил кнопку в ScrollBox и обработчик заработал. Вообще-то я сварганил следующую штуку, чтобы масштабировать растровую карту. В ScrollBox поместил Tpanel и задал свойство align=alClient, на панель положил TPaintBox и тоже align=alClient. Первоначальный размер Tpanel задаю по размеру изображения, которое всасываю через TBitMap, а масштабирую пропорциональным изменением размера TPanel, размер изображения, при этом послушно подстраивается под панель. Изображение рисую процедурой
with pbWorld do
canvas.StretchDraw(rect(0,0,width,height),FBMP);
Вот и хотелось бы колёсико задействовать. Буду экспериментировать ...
0
3218 / 2361 / 540
Регистрация: 11.09.2009
Сообщений: 8,602
12.03.2011, 01:00 5
Цитата Сообщение от E567 Посмотреть сообщение
procedure TForm1.ScrollBox1MouseWheelDown(Sender: TObject;
Delphi
1
2
3
4
5
Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
var i:integer;
begin
i:=MousePos.x;
end;
Я же говорил, что дело в коде.
Как вам ни покажется странным, но этот маленький кусочек кода "с подвохом".
Во-первых, он и так ничего не делает, а самое главное, вы и в отладчике ничего не проверите.
Дело в том, что вы что-то присваиваете локальной переменной "i", но потом её не используете. В Delphi встроен оптимизатор кода, который по-умолчанию включен. Он уберёт этот кусок кода совсем.
Если у вас весь код написан в таком стиле, то удивляться не стОит...
0
0 / 0 / 1
Регистрация: 10.03.2011
Сообщений: 7
12.03.2011, 01:05  [ТС] 6
Цитата Сообщение от i8085 Посмотреть сообщение
Я же говорил, что дело в коде.
................................................................................ ............
Если у вас весь код написан в таком стиле, то удивляться не стОит...
чтобы не было подвоха, я зашел и убрал Оптимизатор. Дело - не в коде. Код нормальный, мне важно в принципе зайти в обработчик. Тот же самый код работает для формы, для скроллера (если туда засунуть кнопку)
0
3218 / 2361 / 540
Регистрация: 11.09.2009
Сообщений: 8,602
12.03.2011, 01:43 7
E567, с поиском ошибок в тайном коде - это вам не на этот форум. Это на "Форум потомственных гадалок на кофейной гуще", "Ясновидение"...
0
160 / 159 / 13
Регистрация: 14.01.2010
Сообщений: 1,497
12.03.2011, 09:39 8
Проверь находится ли курсор над ScrollBox(если он не в фокусе) и при прокручивании мыши обрабатывай либо событием формы либо передавай фокус ScrollBox, хотя мне думается лучше событие формы.
1
0 / 0 / 1
Регистрация: 10.03.2011
Сообщений: 7
12.03.2011, 13:12  [ТС] 9
Цитата Сообщение от turboq Посмотреть сообщение
при прокручивании мыши обрабатывай либо событием формы ....... .. мне думается лучше событие формы.
Я не умею это делать.

Моя конечная цель - поймать событие когда прокрутка над объектом TPaintBox. А Объекты TScrollBox и пр. я взял в качестве эксперимента. Над формой всё работает, даже "пустой" код, который так не нравится i8085, над ScrollBox - работает при помещении кнопки (ее ведь можно сделать невидимой, если нужен будет именно TScrollBox).

Добавлено через 16 минут
Кстати о коде, который не хочет ловить событие мышиной прокрутки.

Породил потомок от TPaintBox с опубликованными событиями

Delphi
1
2
3
4
5
6
TMyPaintBox=class(TPaintBox)
   public
    property  OnMouseWheel;
    property  OnMouseWheelDown;
    property  OnMouseWheelUp;
  end;
Ввел переменную

Delphi
1
pbImgWorld : TMyPaintBox;
В качестве обработчика написал процедуру, отключив оптимизацию в компиляторе:

Delphi
1
2
3
4
5
6
7
8
procedure TForm1.msWeelDown(Sender: TObject; Shift: TShiftState;
       MousePos: TPoint; var Handled: Boolean);
var i,j:integer;
begin
  i:=MousePos.X;
  j:=MousePos.Y;
  i:=10;
end;
и вставил обработчик в нужное гнездо.

Delphi
1
pbImgWorld.OnMouseWheelDown:=msWeelDown;
Добавлено через 21 минуту

Всё, спасибо, получилось.

Оказывается, несмотря на то, что событие проходит над TPaintBox, обработчик мышиной пркрутки у формы тоже откликается.
0
12.03.2011, 13:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.03.2011, 13:12
Помогаю со студенческими работами здесь

Обработка прокрутки не полностью заполненного RecyclerView
Есть фрагмент с RecyclerView он используется в ViewPager. Основной фрагмент содержащий...

Обработка событий горизонтальной прокрутки в listView
Подскажите, как создать слушатель событий горизонтальной прокрутки в listView (режим отображения -...

Размер userform и обработка события нажатия мышью на контроллеры
Всем добрый день! При работе с userform обнаружила две проблемы, которые не нашла как красиво...

Обработка сообщений от поля Edit, размещенного на GroupBox с полосами прокрутки
Здравствуйте. Я недавно начал изучать Win API. Пока в интернете не могу найти решение моей...


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

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