powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как отключить реакцию Combobox-а на колесо мыши?
21 сообщений из 21, страница 1 из 1
Как отключить реакцию Combobox-а на колесо мыши?
    #38843460
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опасный элемент в плане того, что на форме пользователь может случайно задеть колесо мыши, глядя совершенно на другое поле ввода, а значение в комбобоксе поменяется, т.к. фокус был на нем, а пользователь не заметит.
Как отключить это поведение комбобокса?
...
Рейтинг: 0 / 0
Как отключить реакцию Combobox-а на колесо мыши?
    #38843463
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
type THack = class(TComboBox);
procedure TForm1.FormCreate(Sender: TObject);
begin
  THack(ComboBox1).OnMouseWheel := MyMouseWheel;
end;

procedure TForm1.MyMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
  Handled := true;
end;
...
Рейтинг: 0 / 0
Как отключить реакцию Combobox-а на колесо мыши?
    #38843464
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или так
Код: pascal
1.
2.
3.
4.
5.
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
  Handled :=  ActiveControl = ComboBox1;
end;
...
Рейтинг: 0 / 0
Как отключить реакцию Combobox-а на колесо мыши?
    #38843484
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr, класс, первый способ работает, второй нет.
...
Рейтинг: 0 / 0
Как отключить реакцию Combobox-а на колесо мыши?
    #38844342
Людмila
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подобное явление тоже наблюдалось!
Избавилась применив второй способ:
Handled := (ActiveControl = ComboBox1) or (ActiveControl = ComboBox2);
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как отключить реакцию Combobox-а на колесо мыши?
    #39528978
У меня только так заработало:
Handled := (ActiveControl = ComboBox1 = Handled = True);

С помощью "ApplicationEvents":
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure TForm3.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
   if Msg.Message=WM_MOUSEWHEEL then
    if Msg.wParam>0 then
   Handled := (ActiveControl = ComboBox1 = Handled = True);
end;
...
Рейтинг: 0 / 0
Как отключить реакцию Combobox-а на колесо мыши?
    #39529009
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Необразованный
Код: pascal
1.
   Handled := (ActiveControl = ComboBox1 = Handled = True);




Это в какой версии Delphi так можно писать и какой вообще смысл в этом ?
...
Рейтинг: 0 / 0
Как отключить реакцию Combobox-а на колесо мыши?
    #39529014
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiНеобразованный
Код: pascal
1.
   Handled := (ActiveControl = ComboBox1 = Handled = True);




Это в какой версии Delphi так можно писать и какой вообще смысл в этом ?

Думаю что во всех. Это обычное присвоение по цепочки VALUE >> GET - SET
...
Рейтинг: 0 / 0
Как отключить реакцию Combobox-а на колесо мыши?
    #39529016
Handled := true; Не то пальто..
Некоторые компоненты, нужно чтобы двигались при прокрутке колесика, а другие, нет.
Решил через "ApplicationEvents" блокировать прокрутку на все объекты, за счет смены сообщения "WM_MOUSEWHEEL" на "0" , и дальше вписывать нужные мне компоненты, которые должны двигаться, если над ними курсор.

Код: pascal
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.
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
var
MP: TPoint; {координаты X,Y}
a: TComponent;
begin
  {Если прокручено колесико мыши}
   if Msg.Message=WM_MOUSEWHEEL then
   begin
    {Запретить прокрутку колеса, для всех объектов}
    Msg.Message:= 0;

    {Снять фокус с предыдущего, используемого, компонента}
    SetFocusedControl(Form1);

    {Получить координаты курсора}
    GetCursorPos(MP);

    {Найти компонент под курсором. True или False - определяют,
     будут ли учитываться заблокированные (disabled) объекты}
    a:= (FindDragTarget (MP,false));

    {Разрешить прокручивание колеса для компонента,
     по имени, к примеру, "ComboBox5"}
    if a.Name='ComboBox5' then
    Msg.Message:= WM_MOUSEWHEEL ;

    {Разрешить прокручивание колеса для всех компонентов типа "TrackBar"}
    if a.ClassType=TTrackBar then
    Msg.Message:= WM_MOUSEWHEEL ;
   end;
end;



Только, вот, ScrollBar-ам наплевать на Msg.Message:= 0 , они продолжают двигаться как ни в чем не бывало...
...
Рейтинг: 0 / 0
Как отключить реакцию Combobox-а на колесо мыши?
    #39529026
Предыдущий код, выдает ошибку, если разворачиваешь список "ComboBox" и крутишь на нем колесико мыши...
Нужно чтобы условие " if Msg.Message=WM_MOUSEWHEEL ", выполнялось, если "ComboBox" не выделен - "if ActiveControl.ClassType <> TComboBox then" ... Тогда условие выполняется без ошибок.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
var
MP: TPoint;
a: TComponent;
begin
   if ActiveControl.ClassType <> TComboBox then {Если "ComboBox" не выделен}
   if Msg.Message=WM_MOUSEWHEEL then            {Если прокручено колесико мыши}
   begin
    Msg.Message:= 0;                  {Запретить прокрутку колеса, для всех объектов}
    SetFocusedControl(Form1);         {Снять фокус с предыдущего, используемого, компонента}
    GetCursorPos(MP);                 {Получить координаты курсора}
    a:=(FindDragTarget(MP,false));    {Найти компонент под курсором. True или False - определяют,
                                       будут ли учитываться заблокированные (disabled) объекты}
    if a.Name='ComboBox5' then        {Разрешить прокручивание колеса для компонента,}
    Msg.Message:= WM_MOUSEWHEEL ;     {по имени, к примеру, "ComboBox5"}

    if a.ClassType=TTrackBar then     {Разрешить прокручивание колеса для всех компонентов типа "TrackBar"}
    Msg.Message:= WM_MOUSEWHEEL ;
   end;
end;
...
Рейтинг: 0 / 0
Как отключить реакцию Combobox-а на колесо мыши?
    #39529040
Код: pascal
1.
SetFocusedControl(Form1);

плохо снимает выделение..

Надежнее перевести фокус, на другой компонент.
Код: pascal
1.
ActiveControl:=ScrollBox1;
...
Рейтинг: 0 / 0
Как отключить реакцию Combobox-а на колесо мыши?
    #39529095
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiЭто в какой версии Delphi так можно писать и какой вообще смысл в этом ?Во всех. Другое дело, что код (цепочка) глупый, проще было сразу False присвоить.
...
Рейтинг: 0 / 0
Как отключить реакцию Combobox-а на колесо мыши?
    #39529246
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамschiЭто в какой версии Delphi так можно писать и какой вообще смысл в этом ?Во всех. Другое дело, что код (цепочка) глупый, проще было сразу False присвоить.

Фигасе. Не знал.
...
Рейтинг: 0 / 0
Как отключить реакцию Combobox-а на колесо мыши?
    #39529366
Ну вот, теперь без косяков...
Код: pascal
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 TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
var
MP: TPoint; {координаты X,Y}
a: TComponent;
begin
GetCursorPos(MP);                          {Получить координаты курсора}
if  (MP.X>BoundsRect.Left)                 {Если курсор на форме, а не за ее пределами, то выполнить условие}
and (MP.Y>BoundsRect.Top)
and (MP.X<BoundsRect.Right)
and (MP.Y<BoundsRect.Bottom)
then
  if Msg.Message=WM_MOUSEWHEEL then             {Если прокручено колесико мыши}
  begin
  Msg.Message:= 0;                              {Запретить прокрутку колеса, для всех объектов}
     if ActiveControl.ClassType=TTrackBar then  {Если выбран один из объектов TrackBar}
      begin
          a:=(FindDragTarget(MP,false));        {Искать компонент под курсором}
       if a.ClassType=TTrackBar then            {Если под курсором TrackBar}
          Msg.Message:= WM_MOUSEWHEEL ;         {Разрешить прокручивание колеса}
  
       if (a.Name='TrackBar5') or               {Если под курсором, находится,}
          (a.Name='TrackBar6') then             {"TrackBar5" или "TrackBar6"}
          Msg.Message:= 0;                      {Запретить прокручивание колеса}
      end;
  end;
end;
...
Рейтинг: 0 / 0
Как отключить реакцию Combobox-а на колесо мыши?
    #39529517
Andy Mezentsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да уж... Поэтому и говорят, что Дельфисты вымирают. Такой код мне лет 20 назад (в бытность джуниором) показать было бы стыдно.
...
Рейтинг: 0 / 0
Как отключить реакцию Combobox-а на колесо мыши?
    #39529555
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy MezentsevТакой код мне лет 20 назад (в бытность джуниором) показать было бы стыдно.
До сих пор стыдно показать идеальный код?
...
Рейтинг: 0 / 0
Как отключить реакцию Combobox-а на колесо мыши?
    #39529577
Andy Mezentsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,
Нет, не стыдно. Но только он еще далек от идеала :)
Тогда по пунктам:

1. Ловить ВСЕ сообщения не есть хорошо.
2. Сначала надо проверить сообщение - если это наше сообщение, только потом вычислять координаты и прочее.
3. Перед тем, как обращаться к свойствам и методам экземпляранеплохо бы проверить, а экземпляр существует как таковой?

Это только так, "одним глазом".
...
Рейтинг: 0 / 0
Как отключить реакцию Combobox-а на колесо мыши?
    #39529579
Andy Mezentsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,
15 лет назад, когда я зарегистрировался, за такой код тут бы уже страниц 20 было бы написано :)
...
Рейтинг: 0 / 0
Как отключить реакцию Combobox-а на колесо мыши?
    #39529661
Andy Mezentsev,

15 лет назад, компьютеры были не такие выносливые)
...
Рейтинг: 0 / 0
Как отключить реакцию Combobox-а на колесо мыши?
    #39530532
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Необразованный> procedure TForm1.ApplicationEvents1Message

Зачем вообще именно ApplicationEvents и весь этот ужас?
Обычного if (ComboBox1.Focused) then Handled := True
в OnMouseWheel недостаточно?


Andy Mezentsev> Тогда по пунктам:


Вещаешь о каких-то 15-20 годах, а сам ламер ламером.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как отключить реакцию Combobox-а на колесо мыши?
    #39530575
Andy Mezentsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,
:) Я же не говорил, что я гуру :) Так за 15 лет и остался ламером :)
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как отключить реакцию Combobox-а на колесо мыши?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]