Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как узнать что ползунок ScrollBar дошел до конца прокрутки?


NeyroSpace ©   (2007-05-02 12:46:00) 

Допустим я установил
ScrollInfo.nMax := 30000;
потом отлавливаю сообщение TWMVScroll с флагом SB_THUMBTRACK
И получается интересная вещь. Ползунок перемещается до конца, а Pos = 29774.
Растягиваю окно. Опять прокручиваю ползунок до конца 29563.
Но все это меньше максимального значения в 30000.

Как узнать, что ползунок прокручен на максимум?


NeyroSpace   (2007-05-02 15:28:00) [1]

Игорь Шевченко ©   (02.05.07 15:08) [14]
оно! Спасибо!


Игорь Шевченко   (2007-05-02 15:08:00) [2]

clickmaker ©   (02.05.07 14:43) [12]

Да, я тоже маху дал.
Бывает :)

Вот тут: http://www.rsdn.ru/archive/vc/issues/pvc031.htm

в разделе "вопрос-ответ" написано, как использовать 32-х битные значения.


NeyroSpace   (2007-05-02 14:52:00) [3]

>А ты умножение с делением в школе проходил ?
я же говорю, что сделал коеф. все работает, но когда отматываешь в конец последние строки не видны, т.к. я исхожу из того, что в крайнем положении ползунок должен принять значение МАХ!

Но на самом деле у microsoft ползунок в крайнем положении не принимает значения МАХ!
Сначала я думал погрешность полшага (ну до 1 шага), но в некоторых случаях крайнее положение оказывается на 3 шага меньше МАХ!
Т.е. по значению POS из сообщения TWMVScroll никак не определить дошел ползунок до конца или нет!

Чтобы внести корректировку и правильно отобразить конец прокручиваемых данных мне необходимо понять, что ползунок достиг последней точки и дальше его тянуть уже нельзя. В этот момент я бы сам прокрутил бы содержимое до конца.


clickmaker   (2007-05-02 14:43:00) [4]


> [11] Игорь Шевченко ©   (02.05.07 14:33)

а как же

The GetScrollInfo function enables applications to use 32-bit scroll positions. Although the messages that indicate scroll-bar position, WM_HSCROLL and WM_VSCROLL, provide only 16 bits of position data, the functions SetScrollInfo and GetScrollInfo provide 32 bits of scroll-bar position data. Thus, an application can call GetScrollInfo while processing either the WM_HSCROLL or WM_VSCROLL messages to obtain 32-bit scroll-bar position data.

To get the 32-bit position of the scroll box (thumb) during a SB_THUMBTRACK request code in a WM_HSCROLL or WM_VSCROLL message, call GetScrollInfo with the SIF_TRACKPOS value in the fMask member of the SCROLLINFO structure.

(с) MSDN

?


Игорь Шевченко   (2007-05-02 14:33:00) [5]

clickmaker ©   (02.05.07 13:27) [9]


> а причем здесь оконные координаты? это же скролл


положение и макс. / мин. скролла измеряется в оконных координатах

NeyroSpace ©   (02.05.07 13:32) [10]


> Это понятно, но мне нужно прокручивать гораздо больше 32767
> позиций.


А ты умножение с делением в школе проходил ?


NeyroSpace   (2007-05-02 13:32:00) [6]

Игорь Шевченко ©   (02.05.07 13:24) [7]
Это понятно, но мне нужно прокручивать гораздо больше 32767 позиций.

Есть 2е идеи:
1. Простая как казалось, сделать коэфициент. Но тогда нужно скорректировать последнии строки, т.к. шаг получается большой. Для этого надо определить, что ползунок дошел до конца. Тут я и уперся в тупик.
2. Сделать виртуальное окно. При протягивании отображается только часть данных, помещающихся в интервал 32767. Это немного сложнее в реализации, да и выглядит слегка необычно. Хотя такой вариант в работе я уже видел у табличных компонентов.


clickmaker   (2007-05-02 13:27:00) [7]


> [7] Игорь Шевченко ©   (02.05.07 13:24)

а причем здесь оконные координаты? это же скролл
Или я после праздников туго соображаю?


NeyroSpace   (2007-05-02 13:25:00) [8]

Сорре ошибся!

 TWMScroll = packed record
   Msg: Cardinal;
   ScrollCode: Smallint; { SB_xxxx }
   Pos: Smallint; <----------------------- Small конечно! Т.е. те самые 32676 ((
   ScrollBar: HWND;
   Result: Longint;
 end;


Игорь Шевченко   (2007-05-02 13:24:00) [9]


> а с каких это пор int в 32-битной ОС стал максимум 32767?


причем здесь int ? Оконные координаты больше не бывают


clickmaker   (2007-05-02 13:19:00) [10]


> [5] NeyroSpace ©   (02.05.07 13:16)

а с каких это пор int в 32-битной ОС стал максимум 32767?


NeyroSpace   (2007-05-02 13:16:00) [11]

int ScrollInfo.nMax


clickmaker   (2007-05-02 13:11:00) [12]


> Т.е. диапозона прокрутки в 32767 мне не хватает

кто мешает сделать больше?


NeyroSpace   (2007-05-02 13:08:00) [13]

Вообще у мелкософта сделано странно.
Я уже попробовал по пикселам посчитать шаг прокрутки, чтобы вычислить эту странную последню позицию ползунка.
Сосчитал, у меня шаг и у ползунка совпадает. Умножаю на длину - разные результаты(( У меня больше, у microsoft всегда меньше. Причем иногда меньше на 3(!) шага ползунка.
Видимо прийдется делать хитрый алгоритм постраничного отображения данных(((


NeyroSpace   (2007-05-02 13:02:00) [14]

Мне необходимо прокручивать большой объем информации.
Т.е. диапозона прокрутки в 32767 мне не хватает.
Соответственно я ввожу коэф. например 2. Все замечательно, но вот в конце не стыковка, последние строки не докручиваются.
Соответственно я решил сделать ручную корректировку, но понял что определить в каком положении находиться ползунок в крайнем или нет весьма сложно((


clickmaker   (2007-05-02 12:54:00) [15]


> Как узнать что ползунок ScrollBar дошел до конца прокрутки?

для чего?


Наверх

Титульная страница Поиск, карта сайта Написать письмо