![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ScrollBar ошибка !!!! [Delphi, Windows]
Robt © (2007-09-22 15:42:00)размер бегунка получается меньше чем установлено в SBPageSize
например если в ВКЛ и КОЛ сделать одинаковые горизонтальные скролбары длинной 300, высотой 20, Max 1000 и PageSize 200
то КОЛовский будет где-то на 1\5 короче
соответственно и ошибки при скролинге
Vladimir Kladov (2007-10-17 15:13:00) [1]Этот скролл бар сам по себе, отдельный контрол. Не нравится- вынесите свой код, назовите по-другому, будет у вас свой скроллбар, со своим взглядом на мир. В чем дело-то?
Robt (2007-10-17 12:25:00) [2]
> Точно, написано. И пример приведён:
это пример для "по умолчанию PageSize = 1", нужная инфа со следующего обзаца
Vladimir Kladov (2007-10-08 16:10:00) [3]Точно, написано. И пример приведён:
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.
Я этого раво, не читал. Но сделал именно так.
Robt (2007-10-08 15:58:00) [4]
> 793-800=-7 откуда?
ну 7 это типа "шаг" при сдвиге ползунка на один пиксель мышъю
ошибка видимо в 1 поэтому до 800 не доходит а при отпускании мыши 801
Vladimir Kladov (2007-10-08 15:48:00) [5]793-800=-7 откуда?
Robt (2007-10-08 14:32:00) [6]
> Или ты считаешь, что Борланд не ошибся?
только с нажатием на стрелку ошибся (то што до Max скролинг)
> В MSDN особых подробностей нет. Написано по SCROLLINFO лишь
> вот что (из интересующего):
в MSDN подробности есть и описаны они в "About ScrollBar" & "Using ScrollBar"
а не в описании по SCROLLINFO
Dimaxx (2007-10-05 18:31:00) [7]
> "дебильные" вопросы от "ламеров"
Тебе этого никто не говорил. А фраза "мозги включаем" означает поразмыслить логически над тем, что написал Владимир. Раз ты считаешь "правильным" вариант Борланда, это не значит, что любой другой вариант заведомо неправильный. Или ты считаешь, что Борланд не ошибся?
Robt (2007-10-05 08:56:00) [8]я все знаю про скролбар и что и как у него должно работать
я просто не понимаю что мешает предупредить заранее о своем взгляде
на вещи, раз не хочите следовать стандартам +делать условные символы,
а не отвечать потом на форуме на "дебильные" вопросы от "ламеров" типа меня
например в книге по колу ни слова нет о том что на самом деле
производятся некие манипуляции с Max и PageSize чтоб было "правильно"
Vladimir Kladov (2007-10-04 21:55:00) [9]Я дал лишь намёк, и даже не смотрел, какие конкретно значения возвращаются от скроллбара мемо. Как только я их вывел, сразу стало понятно, что исправить:
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 и Борланда более жизненным. В таком варианте скроллбар как раз очень даже годится не только для скроллирования чего угодно правильно, но и как заменитель тракбара: он будет менять значения именно между тем и тем, а никак не то, что кому-то в глубине чьего-то контрола взбрело.
Robt (2007-10-04 09:02:00) [10]
> Мозги подключаем, да?
ну так подключите ...
нафига гдето прибавлять чтоб потом вычитать ?
> ScrollBar1.SBMax:=si.nmax - si.nPage;
попробуй как это работает когда в мемо не влазит 1,2,3 строки при разных и одинаковых высоте мемы и скролбара ...
Vladimir Kladov (2007-10-03 17:01:00) [11]
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;
Мозги подключаем, да?
Robt (2007-10-03 15:30:00) [12]вобщем кидаем на форму 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 и ощущаем разницу...
homm (2007-10-03 14:38:00) [13]> [17] Robt (03.10.07 14:28)
> вот я и говорю чтоб всем было хорошо надо делать условный символ
Не надо на каждый чих делать символы компиляции :)
> надеюсь для этого не надо регистрироваца :)
Нет, для этого есть куча бесплатных рессурсов в сети.
Robt (2007-10-03 14:28:00) [14]
> И размер ползунка получаем соответствующий :(
вот я и говорю чтоб всем было хорошо надо делать условный символ
если кто ещо не понял в чем проблемма
напишите как загрузить файл на форум и я скину пример
надеюсь для этого не надо регистрироваца :)
Dimaxx (2007-10-03 13:27:00) [15]
> однако я в своих проектах использую скроллбары именно для
> задания численных величин
И с чего это вдруг? Для этого есть трэкбар - удобно и точно. Деления задаешь сам как тебе нужно...
PS: А для отображения рисунка используешь Memo? :)
homm (2007-10-03 13:08:00) [16]> [13] Robt (03.10.07 12:23)
> вобще для этого есть тракбар
> если так надо скролбар ставиш PageSize в 0 или 1 и все ок
И размер ползунка получаем соответствующий :(
Barloggg (2007-10-03 13:02:00) [17]гм.
получается для скроллинга текста или картинки правильно пользоваться MSDNовским подходом или пусть даже VCLным.
А для точности нужно пользоваться КОЛовским...
вопрос ROBTа вполне обоснован.
однако я в своих проектах использую скроллбары именно для задания численных величин и мне важна точность.
а вот для скроллинга как-то пока не пользовался :)
Robt (2007-10-03 12:23:00) [18]
> Почему же нельзя проскролить до этого предела по человечески?
> Или тогда, почему не по человечески можно?
это не ко мне
> Мне нужно, что-бы пользователь мог изменять значение величины
> от 0 до 1000
вобще для этого есть тракбар
если так надо скролбар ставиш PageSize в 0 или 1 и все ок
речь идет щас не об использовании скролбара для изменения какойта величины а о его истином предназначении прокрутки текста или области
и здесь PageSize играет основную роль , и его "физический" размер и численный влияют на весь процесс
грубо говоря если пользовать коловский при скролинге мемо, текст прокрутится раньше на PageSize чем ползунок дойдет до конца
homm (2007-10-03 10:50:00) [19]> [11] Robt (03.10.07 10:39)
> нужная цифра получается при отпускании мыши в крайней позиции
Т.е. что, подвели — одно значение, отпустили, значение изменилось?
> видимо в VCL пределом является Max а не чудо формула
Почему же нельзя проскролить до этого предела по человечески? Или тогда, почему не по человечески можно?
Программист, бросая данный скролбар на форму, хочет получить строгое соответствие, пусть даже по приведенной выше формуле, но пусть будет строгое.
Мне нужно, что-бы пользователь мог изменять значение величины от 0 до 1000, как мне это сделать? Если я задам Max в тысячу, многие не поймут, что для того, что-бы получить эту тысячу, нужно жать бедную кнопку около минуты, а если я задам Max в 1200, то те, которые додумаются еше раз надавить на кнопку «вправо», просто могут слосмаюь логику работы программы. Получается что я должен знать об этой особенности (кстати, откуда, она оописана в справке?) и своими силами боротся с ней.
Robt (2007-10-03 10:39:00) [20]
> А откуда цифра 793? (см. мой пост выше)
нужная цифра получается при отпускании мыши в крайней позиции
> да, и почему Position можно таки выставить в 1000, удерживая
> кнопку «вправо»,
видимо в VCL пределом является Max а не чудо формула
но тем не менее коловская теория PageSize не верна однозначно
это видно не из Label1.Caption := Int2Str( Sender.SBPosition )
а в реальном применении скролбара, так как это не просто длина
ползунка а длинна скролируемой области и работать должно соответствено