-
размер бегунка получается меньше чем установлено в 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 и ощущаем разницу...
-
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 - si.nPage;
ScrollBar1.SBPageSize:=si.nPage;
ScrollBar1.SBPosition:=si.nPos;
end;
Мозги подключаем, да?
-
> Мозги подключаем, да?
ну так подключите ... нафига гдето прибавлять чтоб потом вычитать ?
> ScrollBar1.SBMax:=si.nmax - si.nPage;
попробуй как это работает когда в мемо не влазит 1,2,3 строки при разных и одинаковых высоте мемы и скролбара ...
-
Я дал лишь намёк, и даже не смотрел, какие конкретно значения возвращаются от скроллбара мемо. Как только я их вывел, сразу стало понятно, что исправить: 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:=max( 0, si.nmax + 1 - Integer( si.nPage ) );
ScrollBar1.SBPageSize:=si.nPage;
ScrollBar1.SBPosition:=si.nPos;
Label2.Caption := 'PgSz=' + Int2Str( si.nPage ) +
' nMax=' + Int2Str( si.nMax );
end;
Вычитать что-то надо для того, чтобы правильно работал скроллбар. Он так устроен, что меняет своё значение от nmin до nmax, но без учёта nPage. На самом деле, nPage - это не размер тумба, а количество элементов контента, которое вмещатся в отображаемую область, и скроллироваться далее не будет, в конце всего содержимого. Почему 793 или какие-то еще финты получаются в VCL, не знаю. В MS VB получается от 1 до 801, для данных параметров. Видимо, Борландоцы пытался исправить глюк, да только хуже сделали. В MSDN особых подробностей нет. Написано по SCROLLINFO лишь вот что (из интересующего): nMin
Specifies the minimum scrolling position.
nMax
Specifies the maximum scrolling position.
nPage
Specifies the page size. A scroll bar uses this value to determine the appropriate size of the proportional scroll box.
Трудно сразу сказать, что имелось в виду под appropriate size of the proportional scroll box, наверное, имеется в виду именно размер тумба. Но это ВСЁ никак не сообщает нам, что на самом деле, сколлироваться будет не от nMin до nMax на самом деле, а от nMin до nMax-nPage (+/-1). Кстати, в VB параметр nPage называется LargeChange (почему-то), и это тоже намёк. Я считаю свой вариант, исправляющий неправильный подход MS и Борланда более жизненным. В таком варианте скроллбар как раз очень даже годится не только для скроллирования чего угодно правильно, но и как заменитель тракбара: он будет менять значения именно между тем и тем, а никак не то, что кому-то в глубине чьего-то контрола взбрело.
-
я все знаю про скролбар и что и как у него должно работать я просто не понимаю что мешает предупредить заранее о своем взгляде на вещи, раз не хочите следовать стандартам +делать условные символы, а не отвечать потом на форуме на "дебильные" вопросы от "ламеров" типа меня
например в книге по колу ни слова нет о том что на самом деле производятся некие манипуляции с Max и PageSize чтоб было "правильно"
-
> "дебильные" вопросы от "ламеров"
Тебе этого никто не говорил. А фраза "мозги включаем" означает поразмыслить логически над тем, что написал Владимир. Раз ты считаешь "правильным" вариант Борланда, это не значит, что любой другой вариант заведомо неправильный. Или ты считаешь, что Борланд не ошибся?
-
> Или ты считаешь, что Борланд не ошибся?
только с нажатием на стрелку ошибся (то што до Max скролинг)
> В MSDN особых подробностей нет. Написано по SCROLLINFO лишь > вот что (из интересующего):
в MSDN подробности есть и описаны они в "About ScrollBar" & "Using ScrollBar" а не в описании по SCROLLINFO
-
793-800=-7 откуда?
-
> 793-800=-7 откуда?
ну 7 это типа "шаг" при сдвиге ползунка на один пиксель мышъю ошибка видимо в 1 поэтому до 800 не доходит а при отпускании мыши 801
-
Точно, написано. И пример приведён: For example, if an application must display 260 lines of a text file in a window that can show only 16 lines at a time, the vertical scroll bar range can be set to 1 through 244. If the scroll box is at position 1, the first line will be at the top of the window. If the scroll box is at position 244, the last line (line 260) will be at the bottom of the window. Я этого раво, не читал. Но сделал именно так.
-
> Точно, написано. И пример приведён:
это пример для "по умолчанию PageSize = 1", нужная инфа со следующего обзаца
-
Этот скролл бар сам по себе, отдельный контрол. Не нравится- вынесите свой код, назовите по-другому, будет у вас свой скроллбар, со своим взглядом на мир. В чем дело-то?
|