-
размер бегунка получается меньше чем установлено в SBPageSize
например если в ВКЛ и КОЛ сделать одинаковые горизонтальные скролбары длинной 300, высотой 20, Max 1000 и PageSize 200 то КОЛовский будет где-то на 1\5 короче соответственно и ошибки при скролинге
-
что опять тока у меня глюки ?
-
Просто скроллбаром в чистом виде очень редко пользуются...
-
ну этош не значит что надо на него забить , тем более он в составе кола а не отдельно...
а дельфи 2 ктонить вобще пользуется ? однакош в последнем обновлении 2.81 для него чтото исправили ... а на такой МЕГАкосяк забили :(
-
Не знаю правильно это или нет, но если закомментировать SI.nMax := SI.nMax - Integer(SI.nPage) + Value; в TControl.SetSBPageSize, то ползунок становится таким же как в VCL.
-
Это не ошибка. Это просто другой взгляд на вещи. Полагаю, более правильный. Здесь тест, в точном соответствии с вашими цифрами: http://kolmk.net/test/Scrollbar.rarЯ просто добавил обработку события OnScroll / OnSBScroll с отображением значения Position / SBPosition (варианты VCL / KOL). Так вот в варианте KOL максимальное значение позиции, когда бегунок сдвинут максимально вправо, равно 1000. А VCL - не пришей рукав какое-то значение без смысла и цели.
-
> [5] Vladimir Kladov © (02.10.07 21:04) > А VCL - не пришей рукав какое-то значение без смысла и цели.
Действительно, какая-то тупость. По (бредовой) идее там должно быть 1000-200=800, но там 793, причем если нажать на кнопку «впаво», по значение постепенно доползет до 1000, при этом бегунок, ясно дело, не сдвинется.
-
> Это не ошибка. Это просто другой взгляд на вещи. Полагаю, > более правильный
это как раз не правильный взгляд теряется смысл существования PageSize как токового, веть при любом его размере - результат SBPosition один и тот же !!! а размер PageSize не больше половины SBMax кроме того это не прихоть VCL ибо сказано в MSDN : In version 4.0 or later, the maximum value that a scroll bar can report (that is, the maximum scrolling position) depends on the page size. If the scroll bar has a page size greater than one, the maximum scrolling position is less than the maximum range value. You can use the following formula to calculate the maximum scrolling position:
MaxScrollPos = MaxRangeValue - (PageSize - 1)
так что для своего взгляда делайте условные символы а для народа все должно быть стандартным ...
-
> [7] Robt (03.10.07 09:19) > MaxScrollPos = MaxRangeValue - (PageSize - 1)
А откуда цифра 793? (см. мой пост выше)
-
> [7] Robt (03.10.07 09:19) > MaxScrollPos = MaxRangeValue - (PageSize - 1)
да, и почему Position можно таки выставить в 1000, удерживая кнопку «вправо», если MaxScrollPos по форуме должен быть равен 801 ?
-
> это как раз не правильный взгляд
По-твоему правильно, что, к примеру, портновский метр будет не 1 м, а 793 мм??
-
> А откуда цифра 793? (см. мой пост выше)
нужная цифра получается при отпускании мыши в крайней позиции
> да, и почему Position можно таки выставить в 1000, удерживая > кнопку «вправо»,
видимо в VCL пределом является Max а не чудо формула
но тем не менее коловская теория PageSize не верна однозначно это видно не из Label1.Caption := Int2Str( Sender.SBPosition ) а в реальном применении скролбара, так как это не просто длина ползунка а длинна скролируемой области и работать должно соответствено
-
> [11] Robt (03.10.07 10:39) > нужная цифра получается при отпускании мыши в крайней позиции Т.е. что, подвели — одно значение, отпустили, значение изменилось?
> видимо в VCL пределом является Max а не чудо формула Почему же нельзя проскролить до этого предела по человечески? Или тогда, почему не по человечески можно?
Программист, бросая данный скролбар на форму, хочет получить строгое соответствие, пусть даже по приведенной выше формуле, но пусть будет строгое. Мне нужно, что-бы пользователь мог изменять значение величины от 0 до 1000, как мне это сделать? Если я задам Max в тысячу, многие не поймут, что для того, что-бы получить эту тысячу, нужно жать бедную кнопку около минуты, а если я задам Max в 1200, то те, которые додумаются еше раз надавить на кнопку «вправо», просто могут слосмаюь логику работы программы. Получается что я должен знать об этой особенности (кстати, откуда, она оописана в справке?) и своими силами боротся с ней.
-
> Почему же нельзя проскролить до этого предела по человечески? > Или тогда, почему не по человечески можно?
это не ко мне
> Мне нужно, что-бы пользователь мог изменять значение величины > от 0 до 1000
вобще для этого есть тракбар если так надо скролбар ставиш PageSize в 0 или 1 и все ок
речь идет щас не об использовании скролбара для изменения какойта величины а о его истином предназначении прокрутки текста или области и здесь PageSize играет основную роль , и его "физический" размер и численный влияют на весь процесс
грубо говоря если пользовать коловский при скролинге мемо, текст прокрутится раньше на PageSize чем ползунок дойдет до конца
-
гм. получается для скроллинга текста или картинки правильно пользоваться MSDNовским подходом или пусть даже VCLным.
А для точности нужно пользоваться КОЛовским...
вопрос ROBTа вполне обоснован.
однако я в своих проектах использую скроллбары именно для задания численных величин и мне важна точность.
а вот для скроллинга как-то пока не пользовался :)
-
> [13] Robt (03.10.07 12:23) > вобще для этого есть тракбар > если так надо скролбар ставиш PageSize в 0 или 1 и все ок
И размер ползунка получаем соответствующий :(
-
> однако я в своих проектах использую скроллбары именно для > задания численных величин
И с чего это вдруг? Для этого есть трэкбар - удобно и точно. Деления задаешь сам как тебе нужно...
PS: А для отображения рисунка используешь Memo? :)
-
> И размер ползунка получаем соответствующий :(
вот я и говорю чтоб всем было хорошо надо делать условный символ
если кто ещо не понял в чем проблемма напишите как загрузить файл на форум и я скину пример надеюсь для этого не надо регистрироваца :)
-
> [17] Robt (03.10.07 14:28) > вот я и говорю чтоб всем было хорошо надо делать условный символ
Не надо на каждый чих делать символы компиляции :)
> надеюсь для этого не надо регистрироваца :)
Нет, для этого есть куча бесплатных рессурсов в сети.
-
вобщем кидаем на форму Memo с включенными скролбарами,Button и ScrollBar вертикальный ------------------------------------------------ procedure TForm1.Button1Click(Sender: PObj); var si:tagSCROLLINFO; begin si.cbSize:=Sizeof(tagSCROLLINFO); si.fMask:=SIF_ALL; GetScrollInfo(memo1.Handle,SB_VERT,si); ScrollBar1.SBMin:=si.nmin; ScrollBar1.SBMax:=si.nmax; ScrollBar1.SBPageSize:=si.nPage; ScrollBar1.SBPosition:=si.nPos; end;
procedure TForm1.ScrollBar1SBScroll(Sender: PControl; Cmd: Word); var wParam:Integer; begin wParam:=ScrollBar1.SBPosition; wParam:=wParam shl 16; wParam:=wParam+SB_THUMBTRACK; SendMessage(Memo1.Handle,WM_VSCROLL,wParam,0); end; ---------------------------------------------- запускаем набираем кучу строк в мемо чтоб прокрутка появилась нажимаем батон двигаем скролбар и смотрим ... повторяем то же самое в VCL и ощущаем разницу...
|