Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Скролл колесом мыши


Автор: vadik704 30.7.2007, 08:33
Здравствуйте! У меня вопрос:

У меня на форме scrollbox, а на нем combobox. Соответственно скроллбокс имеет горизонтальную полосу прокрутки. Прокрутку колесом делаю так:
Код

procedure TMainForm.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
MainForm.ScrollBox1.VertScrollBar.Position:=MainForm.ScrollBox1.VertScrollBar.Position-round(WheelDelta / 1.5);
end;


Проблема: когда курсор находится на комбобоксе колесом мыши "прокручивает" весь список комбобокса. 
Как этого избежать? Только,пжлст, не пишите "лови mousewhee"l. Прошу код, или ссылку на него.

Автор: Yanis 30.7.2007, 15:21
Перед объявлением твоей формы (например TForm1 = class(TForm)), после type переопределим тип TComboBox:
Код
  TComboBox = class(StdCtrls.TComboBox)
    procedure WMMOUSEWHEEL(var M: TWMMouseWheel); message WM_MOUSEWHEEL;
  end;


Встаём курсором на процедуру WMMOUSEWHEEL и жмём Ctrl+Shift+C. Всё. Должен появиться новый обработчик, который мы реализовывать не будем. Это будет заглушка.

Вот, что у меня получилось на тестовом проекте:
Код
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TComboBox = class(StdCtrls.TComboBox)
    procedure WMMOUSEWHEEL(var M: TWMMouseWheel); message WM_MOUSEWHEEL;
  end;

  TForm1 = class(TForm)
    ComboBox1: TComboBox;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TComboBox }

procedure TComboBox.WMMOUSEWHEEL(var M: TWMMouseWheel);
begin

end;

end.

Автор: ALeXandrK 30.7.2007, 15:52
Напиши на событие ScrollBox.OnMouseClick:
Код

ScrollBox.SetFocus;


и будет тебе счастье smile 

И еще .... зачем ты перехватываешь событие целой формы, а не самого ScrollBoxа smile 
Проще ведь так... 
Код

procedure TForm.ScrollBoxMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
ScrollBox.VertScrollBar.Position:=ScrollBox.VertScrollBar.Position-round(WheelDelta / 1.5);
end;

Т.е. обрабатывать событие самого ScrollBox... но может я и не прав.... и этого требует твоя ситуация smile 

Счас перечитал твой вопрос... наверное его неправильно понял.... я думал тебе не убрать фокус с combobox...
Ну может мое сообщение тоже чем-то поможет smile 

Автор: vadik704 1.8.2007, 09:56
Yanis, спасибо! Все получилось как надо =) Правда я надеялся заблокировать прокрутку списка колесом мыши, когда фокус на комбобоксе. Может быть знаешь как это сделать?
 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)