![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Прокрутка колесиком в ScrollBox [D7, WinXP]
inferno © (2008-10-10 07:40:00)Здравствуйте. Подскажите пожалуйста как сделать чтобы scrollBox прокручивался колесиком мыши
Зуыы (2010-01-05 12:02:00) [1]Ага, когда 700 компонентов в самый раз для каждого в инспекторе объектов выбирать событие
LeadCoder (2009-10-29 13:53:00) [2]Зачем мудрить? Создаете событие Whell для нужного вам компонента. Затем в object Inspector выбираете событие Whell и присваеваете ему событие Whell вашего компонента.
{RASkov} (2008-10-13 13:11:00) [3]> Вот, например, 2ой вариант:
Вот этот вариант уже лучше, но тоже не отличный :)
Например если радом с прокручиваемым скролбоксом будет комбик и фокус на нем, то и скрол будет скролится и комбик прокручиваться :)
Имхо.... лучше перехватить это сообщение и отослать его куда нужно....) А вообще, автор уже на седьмом небе, так что....
:)
ЮЮ (2008-10-13 12:59:00) [4]Вот, например, 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:
ЮЮ (2008-10-13 12:55:00) [5]> Дело в том, что данные обработчики событий контролов(Форма
> и скролбар) идут(вызываются) уже после реагирования и обработки
> винсообщения.... или не так?
И форма предлагает сначала выполнить DoMouseWheel кортролу с фокусом ввода, а лишь потом выполняется OnMouseWheel формы.
Поэтому выходо несколько: от перекрытия и написания procedure WMMouseWheel(var Message: TWMMouseWheel); message WM_MOUSEWHEEL;
до проверки в обработчике FormMouseWheel а тот ли это контрол, который мы вызвали в ScrollBox1MouseWheel
{RASkov} (2008-10-13 12:35:00) [6]Дело в том, что данные обработчики событий контролов(Форма и скролбар) идут(вызываются) уже после реагирования и обработки винсообщения.... или не так?
{RASkov} (2008-10-13 12:32:00) [7]> [12] _REA_ (13.10.08 12:30)
Я попробывал им отыграться в [3] - не получилось... :( Может не так пробывал....
_REA_ (2008-10-13 12:30:00) [8]А Handled то на что?
{RASkov} (2008-10-13 12:12:00) [9]> [10] ЮЮ © (13.10.08 12:03)
> делают что-то иное?
Ну это не совсем-то что я имел в виду :)
Еслиб все перехватывалось, то два контрола одновременно не скролились бы....
Один - под мышью, другой с фокусом...
:)
ЮЮ (2008-10-13 12:03:00) [10]> В таком случае лучше вообще перехватить сообщение скрола
> и направить его контролу "под мышкой"... О, как :)
А эти три строки (из [3]) делают что-то иное? :)
mp := ScreenToClient(MousePos);
c := ControlAtPos(mp, false, true);
if c <> nil then
TProtectControl(c).DoMouseWheel(Shift, WheelDelta, mp);
{RASkov} (2008-10-13 11:55:00) [11]В таком случае лучше вообще перехватить сообщение скрола и направить его контролу "под мышкой"... О, как :)
{RASkov} (2008-10-13 11:53:00) [12]> [7] inferno (13.10.08 11:44)
> отличное решение
В [3]-варианте будут прокручиваться два контрола одновременно :)
inferno (2008-10-13 11:44:00) [13]ЮЮ, отличное решение.
Всем спасибо.
{RASkov} (2008-10-13 11:28:00) [14]> [5] ЮЮ © (13.10.08 11:12)
> не очень то дружественно :)
Дык эт ж пример.... Можно же и на маусэнтер прилипить....
> К тому же внутри ScrollBox-а может не оказаться контролов
> с фокусом ввода
Сам Скроллбокс должен иметь фокс при прокрутке, а не контролы в нем....
ЮЮ (2008-10-13 11:12:00) [15]> а перед прокруткой например по нажатию кнопкиустановить
> фокус ScrollBox.SetFocus;
не очень то дружественно :) К тому же внутри ScrollBox-а может не оказаться контролов с фокусом ввода.
{RASkov} (2008-10-13 10:59:00) [16]Wheel срабатывает в окне с фокусом...
можно убедится, написав как обычно обработчик OnMouseWheel а перед прокруткой например по нажатию кнопки установить фокус ScrollBox.SetFocus;
ЮЮ (2008-10-13 10:34:00) [17]> Дело в том что ниодно событие связанное с 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;
inferno (2008-10-13 09:37:00) [18]Забавно, я тоже так подумал :)
Дело в том что ниодно событие связанное с Wheel не срабатывает
clickmaker (2008-10-10 11:58:00) [19]OnMouseWheel?