Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2008.08.10;
Скачать: [xml.tar.bz2];

Вниз

ScrollBar ошибка !!!!   Найти похожие ветки 

 
Robt   (2007-09-22 15:42) [0]

размер бегунка получается меньше чем установлено в SBPageSize

например если в ВКЛ и КОЛ сделать одинаковые горизонтальные скролбары длинной 300, высотой 20, Max 1000 и PageSize 200
то КОЛовский будет где-то на 1\5 короче
соответственно и ошибки при скролинге


 
Robt   (2007-10-02 09:28) [1]

что опять тока у меня глюки ?


 
Dimaxx ©   (2007-10-02 10:03) [2]

Просто скроллбаром в чистом виде очень редко пользуются...


 
Robt   (2007-10-02 15:18) [3]

ну этош не значит что надо на него забить , тем более он в составе кола а не отдельно...

а дельфи 2 ктонить вобще пользуется ? однакош в последнем обновлении 2.81 для него чтото исправили ... а на такой МЕГАкосяк забили :(


 
Дмитрий К ©   (2007-10-02 16:37) [4]

Не знаю правильно это или нет, но если закомментировать SI.nMax := SI.nMax - Integer(SI.nPage) + Value; в TControl.SetSBPageSize, то ползунок становится таким же как в VCL.


 
Vladimir Kladov ©   (2007-10-02 21:04) [5]

Это не ошибка. Это просто другой взгляд на вещи. Полагаю, более правильный. Здесь тест, в точном соответствии с вашими цифрами:
http://kolmk.net/test/Scrollbar.rar

Я просто добавил обработку события OnScroll / OnSBScroll с отображением значения Position / SBPosition (варианты VCL / KOL). Так вот в варианте KOL максимальное значение позиции, когда бегунок сдвинут максимально вправо, равно 1000. А VCL - не пришей рукав какое-то значение без смысла и цели.


 
homm ©   (2007-10-02 21:35) [6]

> [5] Vladimir Kladov ©   (02.10.07 21:04)
> А VCL - не пришей рукав какое-то значение без смысла и  цели.

Действительно, какая-то тупость. По (бредовой) идее там должно быть 1000-200=800, но там 793, причем если нажать на кнопку «впаво», по значение постепенно доползет до 1000, при этом бегунок, ясно дело, не сдвинется.


 
Robt   (2007-10-03 09:19) [7]


> Это не ошибка. Это просто другой взгляд на вещи. Полагаю,
>  более правильный

это как раз не правильный взгляд
теряется смысл существования 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)

так что для своего взгляда делайте условные символы а для народа все должно быть стандартным ...


 
homm ©   (2007-10-03 09:49) [8]

> [7] Robt   (03.10.07 09:19)
> MaxScrollPos = MaxRangeValue - (PageSize - 1)

А откуда цифра 793? (см. мой пост выше)


 
homm ©   (2007-10-03 09:56) [9]

> [7] Robt   (03.10.07 09:19)
> MaxScrollPos = MaxRangeValue - (PageSize - 1)

да, и почему Position можно таки выставить в 1000, удерживая кнопку «вправо», если MaxScrollPos по форуме должен быть равен 801 ?


 
Dimaxx ©   (2007-10-03 10:28) [10]


> это как раз не правильный взгляд

По-твоему правильно, что, к примеру, портновский метр будет не 1 м, а 793 мм??


 
Robt   (2007-10-03 10:39) [11]


> А откуда цифра 793? (см. мой пост выше)

нужная цифра получается при отпускании мыши в крайней позиции

> да, и почему Position можно таки выставить в 1000, удерживая
> кнопку «вправо»,

видимо в VCL пределом является Max а не чудо формула

но тем не менее коловская теория PageSize не верна однозначно
это видно не из Label1.Caption := Int2Str( Sender.SBPosition )
а в реальном применении скролбара, так как это не просто длина
ползунка а длинна скролируемой области и работать должно соответствено


 
homm ©   (2007-10-03 10:50) [12]

> [11] Robt   (03.10.07 10:39)
> нужная цифра получается при отпускании мыши в крайней позиции
Т.е. что, подвели — одно значение, отпустили, значение изменилось?


> видимо в VCL пределом является Max а не чудо формула
Почему же нельзя проскролить до этого предела по человечески? Или тогда, почему не по человечески можно?

Программист, бросая данный скролбар на форму, хочет получить строгое соответствие, пусть даже по приведенной выше формуле, но пусть будет строгое.
Мне нужно, что-бы пользователь  мог изменять значение величины от 0 до 1000, как мне это сделать? Если я задам Max в тысячу, многие не поймут, что для того, что-бы получить эту тысячу, нужно жать бедную кнопку около минуты, а если я задам Max в 1200, то те, которые додумаются еше раз надавить на кнопку «вправо», просто могут слосмаюь логику работы программы. Получается что я должен знать об этой особенности (кстати, откуда, она оописана в справке?) и своими силами боротся с ней.


 
Robt   (2007-10-03 12:23) [13]


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

это не ко мне

> Мне нужно, что-бы пользователь  мог изменять значение величины
> от 0 до 1000

вобще для этого есть тракбар
если так надо скролбар ставиш PageSize в 0 или 1 и все ок

речь идет щас не об использовании скролбара для изменения какойта величины а о его истином предназначении прокрутки текста или области
и здесь PageSize играет основную роль , и его "физический" размер и численный влияют на весь процесс

грубо говоря если пользовать коловский при скролинге мемо, текст прокрутится раньше на PageSize чем ползунок дойдет до конца


 
Barloggg   (2007-10-03 13:02) [14]

гм.
получается для скроллинга текста или картинки правильно пользоваться MSDNовским подходом или пусть даже VCLным.

А для точности нужно пользоваться КОЛовским...

вопрос ROBTа вполне обоснован.

однако я в своих проектах использую скроллбары именно для задания численных величин и мне важна точность.

а вот для скроллинга как-то пока не пользовался :)


 
homm ©   (2007-10-03 13:08) [15]

> [13] Robt   (03.10.07 12:23)
> вобще для этого есть тракбар
> если так надо скролбар ставиш PageSize в 0 или 1 и все ок

И размер ползунка получаем соответствующий :(


 
Dimaxx ©   (2007-10-03 13:27) [16]


> однако я в своих проектах использую скроллбары именно для
> задания численных величин

И с чего это вдруг? Для этого есть трэкбар - удобно и точно. Деления задаешь сам как тебе нужно...

PS: А для отображения рисунка используешь Memo? :)


 
Robt   (2007-10-03 14:28) [17]


> И размер ползунка получаем соответствующий :(

вот я и говорю чтоб всем было хорошо надо делать условный символ

если кто ещо не понял в чем проблемма
напишите как загрузить файл на форум и я скину пример
надеюсь для этого не надо регистрироваца :)


 
homm ©   (2007-10-03 14:38) [18]

> [17] Robt   (03.10.07 14:28)
> вот я и говорю чтоб всем было хорошо надо делать условный символ

Не надо на каждый чих делать символы компиляции :)


> надеюсь для этого не надо регистрироваца :)

Нет, для этого есть куча бесплатных рессурсов в сети.


 
Robt   (2007-10-03 15:30) [19]

вобщем кидаем на форму 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 и ощущаем разницу...


 
Vladimir Kladov ©   (2007-10-03 17:01) [20]


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-04 09:02) [21]


> Мозги подключаем, да?

ну так подключите ...
нафига гдето прибавлять чтоб потом вычитать ?

> ScrollBar1.SBMax:=si.nmax - si.nPage;

попробуй как это работает когда в мемо не влазит 1,2,3 строки при разных и одинаковых высоте мемы и скролбара ...


 
Vladimir Kladov ©   (2007-10-04 21:55) [22]

Я дал лишь намёк, и даже не смотрел, какие конкретно значения возвращаются от скроллбара мемо. Как только я их вывел, сразу стало понятно, что исправить:

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-05 08:56) [23]

я все знаю про скролбар и что и как у него должно работать
я просто не понимаю что мешает предупредить заранее о своем взгляде
на вещи, раз не хочите следовать стандартам +делать условные символы,
а не отвечать потом на форуме на "дебильные" вопросы от "ламеров" типа меня

например в книге по колу ни слова нет о том что на самом деле
производятся некие манипуляции с Max и PageSize чтоб было "правильно"


 
Dimaxx ©   (2007-10-05 18:31) [24]


> "дебильные" вопросы от "ламеров"

Тебе этого никто не говорил. А фраза "мозги включаем" означает поразмыслить логически над тем, что написал Владимир. Раз ты считаешь "правильным" вариант Борланда, это не значит, что любой другой вариант заведомо неправильный. Или ты считаешь, что Борланд не ошибся?


 
Robt ©   (2007-10-08 14:32) [25]


> Или ты считаешь, что Борланд не ошибся?

только с нажатием на стрелку ошибся (то што до Max скролинг)

> В MSDN особых подробностей нет. Написано по SCROLLINFO лишь
> вот что (из интересующего):

в MSDN подробности есть и описаны они в "About ScrollBar" & "Using ScrollBar"
а не в описании по SCROLLINFO


 
Vladimir Kladov ©   (2007-10-08 15:48) [26]

793-800=-7 откуда?


 
Robt ©   (2007-10-08 15:58) [27]


> 793-800=-7 откуда?

ну 7 это типа "шаг" при сдвиге ползунка на один пиксель мышъю
ошибка видимо в 1 поэтому до 800 не доходит а при отпускании мыши 801


 
Vladimir Kladov ©   (2007-10-08 16:10) [28]

Точно, написано. И пример приведён:

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-17 12:25) [29]


> Точно, написано. И пример приведён:

это пример для "по умолчанию PageSize = 1", нужная инфа со следующего обзаца


 
Vladimir Kladov ©   (2007-10-17 15:13) [30]

Этот скролл бар сам по себе, отдельный контрол. Не нравится- вынесите свой код, назовите по-другому, будет у вас свой скроллбар, со своим взглядом на мир. В чем дело-то?



Страницы: 1 вся ветка

Форум: "KOL";
Текущий архив: 2008.08.10;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.008 c
3-1203925161
Novochek
2008-02-25 10:39
2008.08.10
Не работает ХРАНИМАЯ ПРОЦЕДУРА


15-1214376055
denic
2008-06-25 10:40
2008.08.10
Nokia 6280


15-1214414776
tesseract
2008-06-25 21:26
2008.08.10
Аврал на серой ветке.


2-1208861820
DJ Kondakov
2008-04-22 14:57
2008.08.10
Окно поверх всех окон


15-1214077361
Тын-Дын
2008-06-21 23:42
2008.08.10
Перестала работать отладка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский