Форум: "Основная";
Текущий архив: 2011.08.21;
Скачать: [xml.tar.bz2];
ВнизПрокрутка колесиком в 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.003 c