Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Как отключить реакцию Combobox-а на колесо мыши?  [new]
svnvlad
Member

Откуда:
Сообщений: 1751
Опасный элемент в плане того, что на форме пользователь может случайно задеть колесо мыши, глядя совершенно на другое поле ввода, а значение в комбобоксе поменяется, т.к. фокус был на нем, а пользователь не заметит.
Как отключить это поведение комбобокса?
26 дек 14, 03:18    [17054767]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить реакцию Combobox-а на колесо мыши?  [new]
DimaBr
Member

Откуда:
Сообщений: 10211
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;
26 дек 14, 03:57    [17054778]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить реакцию Combobox-а на колесо мыши?  [new]
DimaBr
Member

Откуда:
Сообщений: 10211
или так
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
  Handled :=  ActiveControl = ComboBox1;
end;
26 дек 14, 04:00    [17054779]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить реакцию Combobox-а на колесо мыши?  [new]
svnvlad
Member

Откуда:
Сообщений: 1751
DimaBr, класс, первый способ работает, второй нет.
26 дек 14, 06:41    [17054819]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить реакцию Combobox-а на колесо мыши?  [new]
Людмila
Member

Откуда: Кировская обл.
Сообщений: 303
Подобное явление тоже наблюдалось!
Избавилась применив второй способ:
Handled := (ActiveControl = ComboBox1) or (ActiveControl = ComboBox2);
27 дек 14, 06:53    [17060388]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Как отключить реакцию Combobox-а на колесо мыши?  [new]
Необразованный
Member

Откуда:
Сообщений: 6
У меня только так заработало:
Handled := (ActiveControl = ComboBox1 = Handled = True);

С помощью "ApplicationEvents":
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;
1 окт 17, 12:33    [20834328]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить реакцию Combobox-а на колесо мыши?  [new]
schi
Member

Откуда: Москва
Сообщений: 2209
Необразованный

   Handled := (ActiveControl = ComboBox1 = Handled = True);



Это в какой версии Delphi так можно писать и какой вообще смысл в этом ?
1 окт 17, 15:39    [20834591]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить реакцию Combobox-а на колесо мыши?  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 722
schi
Необразованный
   Handled := (ActiveControl = ComboBox1 = Handled = True);



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


Думаю что во всех. Это обычное присвоение по цепочки VALUE >> GET - SET
1 окт 17, 16:22    [20834628]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить реакцию Combobox-а на колесо мыши?  [new]
Необразованный
Member

Откуда:
Сообщений: 6
Handled := true; Не то пальто..
Некоторые компоненты, нужно чтобы двигались при прокрутке колесика, а другие, нет.
Решил через "ApplicationEvents" блокировать прокрутку на все объекты, за счет смены сообщения "WM_MOUSEWHEEL" на "0", и дальше вписывать нужные мне компоненты, которые должны двигаться, если над ними курсор.

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, они продолжают двигаться как ни в чем не бывало...
1 окт 17, 17:00    [20834657]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить реакцию Combobox-а на колесо мыши?  [new]
Необразованный
Member

Откуда:
Сообщений: 6
Предыдущий код, выдает ошибку, если разворачиваешь список "ComboBox" и крутишь на нем колесико мыши...
Нужно чтобы условие "if Msg.Message=WM_MOUSEWHEEL", выполнялось, если "ComboBox" не выделен - "if ActiveControl.ClassType <> TComboBox then"... Тогда условие выполняется без ошибок.

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;
1 окт 17, 18:15    [20834731]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить реакцию Combobox-а на колесо мыши?  [new]
Необразованный
Member

Откуда:
Сообщений: 6
SetFocusedControl(Form1);
плохо снимает выделение..

Надежнее перевести фокус, на другой компонент.
ActiveControl:=ScrollBox1;
1 окт 17, 19:06    [20834775]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить реакцию Combobox-а на колесо мыши?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 57224
schi
Это в какой версии Delphi так можно писать и какой вообще смысл в этом ?
Во всех. Другое дело, что код (цепочка) глупый, проще было сразу False присвоить.
1 окт 17, 23:32    [20835029]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить реакцию Combobox-а на колесо мыши?  [new]
schi
Member

Откуда: Москва
Сообщений: 2209
Гаджимурадов Рустам
schi
Это в какой версии Delphi так можно писать и какой вообще смысл в этом ?
Во всех. Другое дело, что код (цепочка) глупый, проще было сразу False присвоить.


Фигасе. Не знал.
2 окт 17, 10:39    [20835614]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить реакцию Combobox-а на колесо мыши?  [new]
Необразованный
Member

Откуда:
Сообщений: 6
Ну вот, теперь без косяков...
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;
2 окт 17, 13:24    [20836198]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить реакцию Combobox-а на колесо мыши?  [new]
Andy Mezentsev
Member

Откуда:
Сообщений: 51
Да уж... Поэтому и говорят, что Дельфисты вымирают. Такой код мне лет 20 назад (в бытность джуниором) показать было бы стыдно.
2 окт 17, 16:23    [20836792]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить реакцию Combobox-а на колесо мыши?  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 22953
Andy Mezentsev
Такой код мне лет 20 назад (в бытность джуниором) показать было бы стыдно.

До сих пор стыдно показать идеальный код?
2 окт 17, 17:06    [20836942]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить реакцию Combobox-а на колесо мыши?  [new]
Andy Mezentsev
Member

Откуда:
Сообщений: 51
wadman,
Нет, не стыдно. Но только он еще далек от идеала :)
Тогда по пунктам:

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

Это только так, "одним глазом".
2 окт 17, 17:29    [20837020]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить реакцию Combobox-а на колесо мыши?  [new]
Andy Mezentsev
Member

Откуда:
Сообщений: 51
wadman,
15 лет назад, когда я зарегистрировался, за такой код тут бы уже страниц 20 было бы написано :)
2 окт 17, 17:30    [20837025]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить реакцию Combobox-а на колесо мыши?  [new]
Необразованный
Member

Откуда:
Сообщений: 6
Andy Mezentsev,

15 лет назад, компьютеры были не такие выносливые)
2 окт 17, 20:07    [20837285]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить реакцию Combobox-а на колесо мыши?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 57224
Необразованный> procedure TForm1.ApplicationEvents1Message

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


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


Вещаешь о каких-то 15-20 годах, а сам ламер ламером.

Posted via ActualForum NNTP Server 1.5

4 окт 17, 00:10    [20840575]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить реакцию Combobox-а на колесо мыши?  [new]
Andy Mezentsev
Member

Откуда:
Сообщений: 51
Гаджимурадов Рустам,
:) Я же не говорил, что я гуру :) Так за 15 лет и остался ламером :)
4 окт 17, 08:45    [20840822]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить