Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.08.21;
Скачать: CL | DM;

Вниз

Прокрутка колесиком в ScrollBox   Найти похожие ветки 

 
inferno   (2008-10-10 07:40) [0]

Здравствуйте. Подскажите пожалуйста как сделать чтобы scrollBox прокручивался колесиком мыши


 
clickmaker ©   (2008-10-10 11:58) [1]

OnMouseWheel?


 
inferno   (2008-10-13 09:37) [2]

Забавно, я тоже так подумал :)
Дело в том что ниодно событие связанное с Wheel не срабатывает


 
ЮЮ ©   (2008-10-13 10:34) [3]

> Дело в том что ниодно событие связанное с Wheel не срабатывает


Оно срабатывает у формы.
Заставь её передать кому cледует:

type
 TProtectControl = class(TControl);

procedure TForm1.FormMouseWheel(
 Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint;
 var Handled: Boolean
);
var
 c: TControl;
 mp: TPoint;
begin
 mp := ScreenToClient(MousePos);
 c := ControlAtPos(mp, false, true);
 if c <> nil then
   TProtectControl(c).DoMouseWheel(Shift, WheelDelta, mp);
end;

procedure TForm1.ScrollBox1MouseWheel(Sender: TObject; Shift: TShiftState;
 WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
 ScrollBox1.VertScrollBar.Position :=
   ScrollBox1.VertScrollBar.Position - WheelDelta;
end;


 
{RASkov} ©   (2008-10-13 10:59) [4]

Wheel срабатывает в окне с фокусом...
можно убедится, написав как обычно обработчик OnMouseWheel а перед прокруткой например по нажатию кнопки установить фокус ScrollBox.SetFocus;


 
ЮЮ ©   (2008-10-13 11:12) [5]

> а перед прокруткой например по нажатию кнопки установить
> фокус ScrollBox.SetFocus;


не очень то дружественно :) К тому же внутри ScrollBox-а может не оказаться контролов с фокусом ввода.


 
{RASkov} ©   (2008-10-13 11:28) [6]

> [5] ЮЮ ©   (13.10.08 11:12)
> не очень то дружественно :)

Дык эт ж пример.... Можно же и на маусэнтер прилипить....

> К тому же внутри ScrollBox-а может не оказаться контролов
> с фокусом ввода

Сам Скроллбокс должен иметь фокс при прокрутке, а не контролы в нем....


 
inferno   (2008-10-13 11:44) [7]

ЮЮ, отличное решение.
Всем спасибо.


 
{RASkov} ©   (2008-10-13 11:53) [8]

> [7] inferno   (13.10.08 11:44)
> отличное решение

В [3]-варианте будут прокручиваться два контрола одновременно :)


 
{RASkov} ©   (2008-10-13 11:55) [9]

В таком случае лучше вообще перехватить сообщение скрола и направить его контролу "под мышкой"... О, как :)


 
ЮЮ ©   (2008-10-13 12:03) [10]

> В таком случае лучше вообще перехватить сообщение скрола
> и направить его контролу "под мышкой"... О, как :)


А эти три строки (из [3]) делают что-то иное? :)

mp := ScreenToClient(MousePos);
c := ControlAtPos(mp, false, true);
if c <> nil then
  TProtectControl(c).DoMouseWheel(Shift, WheelDelta, mp);


 
{RASkov} ©   (2008-10-13 12:12) [11]

> [10] ЮЮ ©   (13.10.08 12:03)
> делают что-то иное?

Ну это не совсем-то что я имел в виду :)
Еслиб все перехватывалось, то два контрола одновременно не скролились бы....
Один - под мышью, другой с фокусом...
:)


 
_REA_   (2008-10-13 12:30) [12]

А Handled то на что?


 
{RASkov} ©   (2008-10-13 12:32) [13]

> [12] _REA_   (13.10.08 12:30)

Я попробывал им отыграться в [3] - не получилось... :( Может не так пробывал....


 
{RASkov} ©   (2008-10-13 12:35) [14]

Дело в том, что данные обработчики событий контролов(Форма и скролбар) идут(вызываются) уже после реагирования и обработки винсообщения.... или не так?


 
ЮЮ ©   (2008-10-13 12:55) [15]

> Дело в том, что данные обработчики событий контролов(Форма
> и скролбар) идут(вызываются) уже после реагирования и обработки
> винсообщения.... или не так?


И форма предлагает сначала выполнить DoMouseWheel кортролу с фокусом ввода, а лишь потом выполняется OnMouseWheel формы.

Поэтому выходо несколько: от перекрытия и написания procedure WMMouseWheel(var Message: TWMMouseWheel); message WM_MOUSEWHEEL;
до проверки в обработчике FormMouseWheel а тот ли это контрол, который мы вызвали в ScrollBox1MouseWheel


 
ЮЮ ©   (2008-10-13 12:59) [16]

Вот, например, 2ой вариант:

procedure TForm1.ScrollBox1MouseWheel(Sender: TObject; Shift: TShiftState;
 WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
 if Sender <> FScrollControl then exit;

 TScrollBox(Sender).VertScrollBar.Position :=
   TScrollBox(Sender).VertScrollBar.Position - WheelDelta;
 Handled := true;
 FScrollControl := nil;
end;

procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
 WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
var
c: TControl;
mp: TPoint;
begin
mp := ScreenToClient(MousePos);
FScrollControl := ControlAtPos(mp, false, true);
if FScrollControl <> nil then
  TProtectControl(FScrollControl).DoMouseWheel(Shift, WheelDelta, mp);
end;


где FScrollControl - поле класса TForm1.FormMouseWheel(Sender:


 
{RASkov} ©   (2008-10-13 13:11) [17]

> Вот, например, 2ой вариант:

Вот этот вариант уже лучше, но тоже не отличный :)

Например если радом с прокручиваемым скролбоксом будет комбик и фокус на нем, то и скрол будет скролится и комбик прокручиваться :)

Имхо.... лучше перехватить это сообщение и отослать его куда нужно....) А вообще, автор уже на седьмом небе, так что....
:)


 
LeadCoder   (2009-10-29 13:53) [18]

Зачем мудрить? Создаете событие Whell для нужного вам компонента. Затем в object Inspector выбираете событие Whell и присваеваете ему событие Whell вашего компонента.


 
Зуыы   (2010-01-05 12:02) [19]

Ага, когда 700 компонентов в самый раз для каждого в инспекторе объектов выбирать событие



Страницы: 1 вся ветка

Текущий архив: 2011.08.21;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.01 c
15-1303780922
Мазут
2011-04-26 05:22
2011.08.21
Защитил свои авторские права - в турьму...


3-1262964863
serko
2010-01-08 18:34
2011.08.21
IBDATASET.recordcount не считает кол-во...


15-1304313612
Константинов
2011-05-02 09:20
2011.08.21
Домашняя сеть


15-1303911755
OW
2011-04-27 17:42
2011.08.21
миллион строк в Excel 2007. Правда?


1-1263401544
Nik
2010-01-13 19:52
2011.08.21
создание плагинов