Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.08.2009, 16:18   #1
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию Почему обработчики OnMouseWheel происходят несколько раз подряд? (Delphi7)

Делал я однажды программу... И заметил что масштабирование с помощью колёсика мыши работает как-то не так...
Если точнее - "прыжки" в 2 раза больше чем должно быть...

Стал разбираться... Поставил точку останова на одном из событий OnMouseWheel и выяснилось, что обработчик почему-то вызывается дважды подряд...
Код:
Procedure TForm1.FormMouseWheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; Var Handled: BooLean);
Begin
If (H>1) Then H:=H-0.1;
End;

Procedure TForm1.FormMouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; Var Handled: BooLean);
Begin
If (H<4) Then H:=H+0.1;
End;
Создав новый проект и немного поэкспериментировав обнаружил, что так происходит только если кинуть на форму TButton (если на форме пусто, то всё как надо)...
Точнее - когда этот контрол в фокусе... А в моём проекте как раз одна кнопка...

Так же происходит с TEdit, TBitBtn, TCheckBox, TRadioButton, TScrollBar, TMaskEdit и другими...

Должно ли так происходить и почему? Ни в одном из моих самоучителей про это ни слова, а ошибки-то лезут...
Или это с моей Делфи что-то не так?



P.S.

Вышел из ситуации заменив свою кнопку на TSpeedButton...

Хотя можно было наверное ещё и через Application.OnMessage сделать, но поменять кнопку было быстрее...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 23.08.2009, 16:27   #2
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

А попробуй поменять настройки мыши, а именно "прокручивание на N строк". Может эта системная функция вызывается так:
Цитата:
...
For I:=1 to N do prokrutit;
...
Procedure prokrutit;
Begin
Прокрутка на одну строку
End;
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 23.08.2009, 16:35   #3
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

А если положить на форму TPanel, в него ещё один TPanel, а уже во второй положить TButton - то обработчики OnMouseWheel вызываются четырежды... О_О

Цитата:
А попробуй поменять настройки мыши
Это где такое? В Делфи?

Может когда класс TForm делали что-то с этим напутали:
Цитата:
Функция DefWindowProc передает сообщение родителю окна. Не должна быть никакой внутренней переадресации сообщения, так как DefWindowProc передает его вверх по цепочке родителей, пока функция не найдет окно, которое обработает его.
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 23.08.2009, 16:49   #4
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
Это где такое? В Делфи?
Неееет, это в настройке винды а именно в ПАНЕЛЬ УПРАВЛЕНИЯ>МЫШЬ>КОЛЕСИКО>ПРОКРУЧИВА ТЬ НА ... СТРОК
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 23.08.2009, 19:43   #5
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Код:
procedure TForm19.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
   //...
   Handled := true;  // Обработано!!!
end;
alexBlack вне форума Ответить с цитированием
Старый 23.08.2009, 22:11   #6
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Хм... Никогда не пользовался этой настройкой...

Ну это-то не должно влиять на Делфи... И к тому же на пустой форме-то работает как надо...

Вот сделал через Application.OnMessage (вроде всё правильно):
Код:
      Private
            { Private declarations }
            Procedure AppOnMessage(Var Msg: TMsg; Var Handled: BooLean);
      Public

...

Var Form1: TForm1; H: Real;

...

Procedure TForm1.AppOnMessage(Var Msg: TMsg; Var Handled: BooLean);
Begin
If Msg.Message=WM_MOUSEWHEEL Then
      Begin
      If (HIWORD(Msg.wParam)>32512) Then
            If (H>1) Then H:=H-0.1
            Else
      Else
            If (H<4) Then H:=H+0.1;
      End;
Form1.Caption:=FloatToStr(H); // для проверки как работает
End;

Procedure TForm1.FormCreate(Sender: TObject);
Begin
H:=1;
Application.OnMessage:=AppOnMessage;
End;
Так можно на форму всё что угодно класть - работает как часы...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему не работают модули в Delphi7: DXClass, DXSprite, DXDraws, ExtCtrls, StdCtrls Mclaren Помощь студентам 3 02.05.2009 15:13
Как зарегистрировать несколько раз в реестре Volkogriz Общие вопросы Delphi 5 14.01.2009 16:42
имя может встречаться несколько раз, как используя pos найти все вхождения имени в строку milton Паскаль, Turbo Pascal, PascalABC.NET 2 09.12.2008 22:34
по нажатию кнопки shape будет сдвигаться на несколько позиций в сторону (Delphi7) -HunteR- Gamedev - cоздание игр: Unity, OpenGL, DirectX 14 12.11.2007 20:37
обработчики в кучу CyberMerlin Общие вопросы Delphi 15 15.08.2007 13:42