Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
15-1304314820
erutan
2011-05-02 09:40
2011.08.21
ошибка при загрузке Delphi


15-1304569666
OW
2011-05-05 08:27
2011.08.21
Indy. IdSMTP. Lotus Notes 6.5 Incorrect format in MIME data


15-1304274899
IPranker
2011-05-01 22:34
2011.08.21
C++ константы -> Delphi константы.


3-1262954585
serko
2010-01-08 15:43
2011.08.21
Обработка ошибок


4-1249641864
Гость
2009-08-07 14:44
2011.08.21
Получение текста ошибки при вызове LoadLibrary в сервисе





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский