Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как отключить реакцию Combobox-а на колесо мыши? / 21 сообщений из 21, страница 1 из 1
26.12.2014, 03:18:09
    #38843460
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отключить реакцию Combobox-а на колесо мыши?
Опасный элемент в плане того, что на форме пользователь может случайно задеть колесо мыши, глядя совершенно на другое поле ввода, а значение в комбобоксе поменяется, т.к. фокус был на нем, а пользователь не заметит.
Как отключить это поведение комбобокса?
...
Рейтинг: 0 / 0
26.12.2014, 03:57:36
    #38843463
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отключить реакцию Combobox-а на колесо мыши?
Код: 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
26.12.2014, 04:00:10
    #38843464
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отключить реакцию Combobox-а на колесо мыши?
или так
Код: 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
26.12.2014, 06:41:20
    #38843484
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отключить реакцию Combobox-а на колесо мыши?
DimaBr, класс, первый способ работает, второй нет.
...
Рейтинг: 0 / 0
27.12.2014, 06:53:58
    #38844342
Людмila
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отключить реакцию Combobox-а на колесо мыши?
Подобное явление тоже наблюдалось!
Избавилась применив второй способ:
Handled := (ActiveControl = ComboBox1) or (ActiveControl = ComboBox2);
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
01.10.2017, 12:33:43
    #39528978
Как отключить реакцию Combobox-а на колесо мыши?
У меня только так заработало:
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
01.10.2017, 15:39:05
    #39529009
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отключить реакцию Combobox-а на колесо мыши?
Необразованный
Код: pascal
1.
   Handled := (ActiveControl = ComboBox1 = Handled = True);




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




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

Думаю что во всех. Это обычное присвоение по цепочки VALUE >> GET - SET
...
Рейтинг: 0 / 0
01.10.2017, 17:00:18
    #39529016
Как отключить реакцию Combobox-а на колесо мыши?
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
01.10.2017, 18:15:36
    #39529026
Как отключить реакцию Combobox-а на колесо мыши?
Предыдущий код, выдает ошибку, если разворачиваешь список "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
01.10.2017, 19:06:59
    #39529040
Как отключить реакцию Combobox-а на колесо мыши?
Код: pascal
1.
SetFocusedControl(Form1);

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

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

Фигасе. Не знал.
...
Рейтинг: 0 / 0
02.10.2017, 13:24:21
    #39529366
Как отключить реакцию Combobox-а на колесо мыши?
Ну вот, теперь без косяков...
Код: 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
02.10.2017, 16:23:03
    #39529517
Andy Mezentsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отключить реакцию Combobox-а на колесо мыши?
Да уж... Поэтому и говорят, что Дельфисты вымирают. Такой код мне лет 20 назад (в бытность джуниором) показать было бы стыдно.
...
Рейтинг: 0 / 0
02.10.2017, 17:06:35
    #39529555
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отключить реакцию Combobox-а на колесо мыши?
Andy MezentsevТакой код мне лет 20 назад (в бытность джуниором) показать было бы стыдно.
До сих пор стыдно показать идеальный код?
...
Рейтинг: 0 / 0
02.10.2017, 17:29:21
    #39529577
Andy Mezentsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отключить реакцию Combobox-а на колесо мыши?
wadman,
Нет, не стыдно. Но только он еще далек от идеала :)
Тогда по пунктам:

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

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

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

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


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


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


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