nesco, благодарю!
Кстати! При создании плеера и подобных программ onEndScroll в принципе использовать корректнее, чем onMouseUp (даже если бы он работал для ЛКМ). Например: таймер регулярно подаёт на ScrollBar (doPosition) новую позицию при проигрывании файла. Если мы хотим изменить позицию, мы вручную перемещаем ползунок, но сначала блокируем автоматическое перемещение. Обычно для этого используется onMouseDown. Когда перемещение мы заканчиваем, автоматическое управление должно возобновиться. Так вот, если возобновление автоуправления поставить на onMouseUp, то возобновление не произойдёт, если мышь будет отпущена за пределами ScrollBar (даже если курсор чуть-чуть выйдет за пределы!), ведь onMouseUp в принципе происходит, только когда отпускание мыши происходит непосредственно над ScrollBar. Тем не менее, автоуправление должно возобновиться, ведь мышь-то отпущена! А onEndScroll произойдёт в любом случае, неважно, где отпущена мышь, главное, что предвижение было!
Вот как это выглядит в коде:
code_35488.txt
Поэтому надеяться на ScrollBarEx с его работающим onMouseUp нет смысла!
------------ Дoбавленo в 21.29:
Пардон, на ScrollBarEx можно рассчитывать: он захватывает курсор, и за пределы ему не выйти. Но другие какие-нибудь подобные компоненты, которые курсор не захватывают, с ними будет указанная выше проблема.
------------ Дoбавленo в 21.55:
Кстати, в TrackBar есть onStart и onStop!
Этот топик читают: Гость
Ответов: 1926
Рейтинг: 172
|
|||
карма: 9 |
| ||
файлы: 1 | code_35488.txt [1.4KB] [399] |
Ответов: 1926
Рейтинг: 172
|
|||
карма: 9 |
| ||
файлы: 1 | code_36463.txt [150B] [324] |
Разработчик
Ответов: 26151
Рейтинг: 2127
|
|||
3042 писал(а): почему два раза выдаёт onPosition:Потому, что вот это стоит, потому и выдает
|
|||
карма: 22 |
|
Ответов: 1926
Рейтинг: 172
|
|||
Ну, так должно же один раз выдавать, или я что-то не понимаю?
function THIScrollBar._Message; begin Result := false; case Msg.message of WM_HSCROLL,WM_VSCROLL: if dword(Msg.lParam) = control.Handle then begin GetPos; case LOWORD(Msg.wParam) of SB_BOTTOM,SB_LINERIGHT: inc(si.nPos); SB_LINELEFT,SB_TOP: dec(si.nPos); SB_PAGELEFT: dec(si.nPos, _prop_Page); SB_PAGERIGHT: inc(si.nPos, _prop_Page); SB_THUMBPOSITION, SB_THUMBTRACK: si.nPos := si.nTrackPos; SB_ENDSCROLL: begin if _prop_ScrollMode = 1 then _hi_OnEvent(_event_onPosition,si.nPos); Здесь событие происходит только при ScrollMode=Up _hi_OnEvent(_event_onEndScroll); end; end; Update; if _prop_ScrollMode = 0 then _hi_OnEvent(_event_onPosition,GetPos); Здесь событие происходит только при ScrollMode=Move result := true; Rslt := 0; end; end; Result := Result or _hi_OnMessage(OldMes,Msg,Rslt); end; |
|||
карма: 9 |
|
Разработчик
Ответов: 26151
Рейтинг: 2127
|
|||
3042 писал(а): Ну, так должно же один раз выдавать, или я что-то не понимаю?Выдается два события WM_H(V)SCROLL, и в обоих срабатывает нижнее условие. |
|||
карма: 22 |
|
Ответов: 1926
Рейтинг: 172
|
|||
nesco, я сделал так:
Но всё равно два onPosition! А вот onEndScroll всегда один раз происходит, как и должно быть. ------------ Дoбавленo в 20.24: Это ведь неправильно, что выдаются два события? Как исправить сей недостаток? |
|||
карма: 9 |
|
Разработчик
Ответов: 26151
Рейтинг: 2127
|
|||
3042 писал(а): Но всё равно два onPosition!Ну так я же так и сказал, что выдается на любой скрол два события. Ты меня не понял, наверное. 3042 писал(а): Это ведь неправильно, что выдаются два события? Как исправить сей недостаток?Без понятия, этот код так изначально и был. ------------ Дoбавленo в 22.04: Сейчас поставил дебаг и проверил, что при нажатии на правую стрелку выдается действительно два события -- SB_ENDSCROLL и SB_LINERIGHT. А может выдаваться даже три события если нажать на ползунок -- SB_THUMBPOSITION, SB_ENDSCROLL, SB_THUMBTRACK. Так работает система. |
|||
карма: 22 |
|
Ответов: 1926
Рейтинг: 172
|
|||
Теперь ясно, спасибо. Действительно, отправляются, например, два WM_HSCROLL: одно несёт SB_LINELEFT, второе - SB_ENDSCROLL. А так как
В идеале оно должно происходить только когда LOWORD(Msg.wParam) непосредственно говорит о прокрутке, а не, например, о конце (SB_ENDSCROLL). Ну а из подручных средств, наверное, можно предложить мониторинг потока. |
|||
карма: 9 |
|
23