Вверх ↑
Этот топик читают: Гость
Ответов: 1925
Рейтинг: 172
#16: 2015-04-10 21:55:53 ЛС | профиль | цитата
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!
карма: 9
0
файлы: 1code_35488.txt [1.4KB] [349]
Ответов: 1925
Рейтинг: 172
#17: 2015-11-01 23:45:50 ЛС | профиль | цитата
nesco, теперь не пойму, почему два раза выдаёт onPosition:
code_36463.txt

Только при ScrollMode=Move.
карма: 9
0
файлы: 1code_36463.txt [150B] [293]
Разработчик
Ответов: 26066
Рейтинг: 2120
#18: 2015-11-02 00:46:50 ЛС | профиль | цитата
3042 писал(а):
почему два раза выдаёт onPosition:

Потому, что вот это стоит, потому и выдает

     if _prop_ScrollMode = 0 then
_hi_OnEvent(_event_onPosition,GetPos);
карма: 22

0
Ответов: 1925
Рейтинг: 172
#19: 2015-11-02 19:44:39 ЛС | профиль | цитата
Ну, так должно же один раз выдавать, или я что-то не понимаю?

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
0
Разработчик
Ответов: 26066
Рейтинг: 2120
#20: 2015-11-02 20:08:50 ЛС | профиль | цитата
3042 писал(а):
Ну, так должно же один раз выдавать, или я что-то не понимаю?

Выдается два события WM_H(V)SCROLL, и в обоих срабатывает нижнее условие.
карма: 22

0
Ответов: 1925
Рейтинг: 172
#21: 2015-11-02 20:24:28 ЛС | профиль | цитата
nesco, я сделал так:
#pas
WM_HSCROLL{,WM_VSCROLL}:

Но всё равно два onPosition! А вот onEndScroll всегда один раз происходит, как и должно быть.
------------ Дoбавленo в 20.24:
Это ведь неправильно, что выдаются два события? Как исправить сей недостаток?
карма: 9
0
Разработчик
Ответов: 26066
Рейтинг: 2120
#22: 2015-11-02 22:04:03 ЛС | профиль | цитата
3042 писал(а):
Но всё равно два onPosition!

Ну так я же так и сказал, что выдается на любой скрол два события. Ты меня не понял, наверное.
3042 писал(а):
Это ведь неправильно, что выдаются два события? Как исправить сей недостаток?

Без понятия, этот код так изначально и был.
------------ Дoбавленo в 22.04:
Сейчас поставил дебаг и проверил, что при нажатии на правую стрелку выдается действительно два события -- SB_ENDSCROLL и SB_LINERIGHT. А может выдаваться даже три события если нажать на ползунок -- SB_THUMBPOSITION, SB_ENDSCROLL, SB_THUMBTRACK. Так работает система.
карма: 22

0
Ответов: 1925
Рейтинг: 172
#23: 2015-11-02 23:56:28 ЛС | профиль | цитата
Теперь ясно, спасибо. Действительно, отправляются, например, два WM_HSCROLL: одно несёт SB_LINELEFT, второе - SB_ENDSCROLL. А так как

#pas
if _prop_ScrollMode = 0 then
_hi_OnEvent(_event_onPosition,GetPos);
происходит при каждом WM_HSCROLL, то onPosition и происходит дважды.

В идеале оно должно происходить только когда LOWORD(Msg.wParam) непосредственно говорит о прокрутке, а не, например, о конце (SB_ENDSCROLL).

Ну а из подручных средств, наверное, можно предложить мониторинг потока.
карма: 9
0
23
Сообщение
...
Прикрепленные файлы
(файлы не залиты)