Конференция "KOL" » ScrollBar ошибка !!!! [Delphi, Windows]
 
  • Vladimir Kladov © (03.10.07 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 (04.10.07 09:02) [21]

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

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

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

    попробуй как это работает когда в мемо не влазит 1,2,3 строки при разных и одинаковых высоте мемы и скролбара ...
  • Vladimir Kladov © (04.10.07 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 (05.10.07 08:56) [23]
    я все знаю про скролбар и что и как у него должно работать
    я просто не понимаю что мешает предупредить заранее о своем взгляде
    на вещи, раз не хочите следовать стандартам +делать условные символы,
    а не отвечать потом на форуме на "дебильные" вопросы от "ламеров" типа меня

    например в книге по колу ни слова нет о том что на самом деле
    производятся некие манипуляции с Max и PageSize чтоб было "правильно"
  • Dimaxx © (05.10.07 18:31) [24]

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

    Тебе этого никто не говорил. А фраза "мозги включаем" означает поразмыслить логически над тем, что написал Владимир. Раз ты считаешь "правильным" вариант Борланда, это не значит, что любой другой вариант заведомо неправильный. Или ты считаешь, что Борланд не ошибся?
  • Robt © (08.10.07 14:32) [25]

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

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

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

    в MSDN подробности есть и описаны они в "About ScrollBar" & "Using ScrollBar"
    а не в описании по SCROLLINFO
  • Vladimir Kladov © (08.10.07 15:48) [26]
    793-800=-7 откуда?
  • Robt © (08.10.07 15:58) [27]

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

    ну 7 это типа "шаг" при сдвиге ползунка на один пиксель мышъю
    ошибка видимо в 1 поэтому до 800 не доходит а при отпускании мыши 801
  • Vladimir Kladov © (08.10.07 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 © (17.10.07 12:25) [29]

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

    это пример для "по умолчанию PageSize = 1", нужная инфа со следующего обзаца
  • Vladimir Kladov © (17.10.07 15:13) [30]
    Этот скролл бар сам по себе, отдельный контрол. Не нравится- вынесите свой код, назовите по-другому, будет у вас свой скроллбар, со своим взглядом на мир. В чем дело-то?
 
Конференция "KOL" » ScrollBar ошибка !!!! [Delphi, Windows]
Есть новые Нет новых   [134431   +9][b:0][p:0.001]