Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.25;
Скачать: CL | DM;

Вниз

ScrollBox глючит   Найти похожие ветки 

 
GMax   (2006-05-31 14:56) [0]

если Align=caClient, то скроллбокс не всегда показывает целиком своё содержимое (проверял на paintbox)

то при растяжении окна верхней части не видать, то при сжатом окне до конца не проматывает и низа изображения не видно.

проверялось на 2.36, с CBOX_OLD тоже самое.

тестовый проектик(KOL+MCK с готовым exe) тут:
http://www.terraspace.ru/1/sbbug.zip (17k)

воспроизвести - поиграться с размерами формы и поскроллировать :)
например промотать до низа картинки и максимизировать - верха не будет.

как полечить?


 
ECM ©   (2006-05-31 15:26) [1]

Ок... буду посмотреть (жаль со временем только напряг) :))
Как раз по нему тут поднакопилось...


 
ECM ©   (2006-05-31 15:35) [2]

Угу ... эффект виден...
После восстановления окна из развернутого на весь экран состояния в нормальное - действительно вниз до конца не проматывается....
Плавное изменение размеров окна (мышкой за край окна) восстанавливает
правильный диапазон скроллинга и не глючит впринципе...
:(


 
GMax   (2006-05-31 16:23) [3]

запускаю, растягиваю чуток форму(мышой), тут же уменьшаю её(мышой, побольше чем растянул), проматываю вниз - низа не вижу.

правда иногда всё же вижу - чёткой закономерности не нашёл, но похоже, если мышу двигать тихо-тихо, то не глючит, что-то успевает отработать, а если быстро, резко - ловим глюк :)

так же, если промотать скролл в правый нижней угол и раздвигать форму - видимая облась паинтбокса не увеличивается, а остаётся в углу, при любой резкости движения мышой...


 
ECM ©   (2006-06-01 16:47) [4]


> GMax   (31.05.06 14:56)
> с CBOX_OLD тоже самое


К слову....
Владимир похоже писал список обновлений для 2.36 по памяти :)
Я долго думал что за CBOX такой?  (CBOX_OLD)
Нет такого слова в KOL.PAS !!! :) (Есть SBOX_OLDPOS но в данном случае это вобщем не важно т.к дело не в этом)
Глюки:

1)

> при сжатом окне до конца не проматывает и низа изображения
> не видно


> правда иногда всё же вижу - чёткой закономерности не нашёл

Закономерность я нашел - всё просто: если перед  уменьшением ширины окна горизонтальной полосы прокрутки не видно, а после она появляется -
имеем глюк. Он обусловлен тем, что в procedure NotifyScrollBox значение ClientRect вычисленное до установки горизонтальной полосы прокрутки
"устаревает" на момент установки вертикальной.

2)

> так же, если промотать скролл в правый нижней угол и раздвигать
> форму - видимая облась паинтбокса не увеличивается, а остаётся
> в углу, при любой резкости движения мышой

Да, после изменения параметров скроллбаров, тут надо еще раз прокрутить потомков (было упущено).

В результате вот как должна выглядеть NotifyScrollBox лишенная данных глюков:

procedure NotifyScrollBox( Self_, Child: PControl );
var SI: TScrollInfo;

...

var W, H: Integer;
   SzR: TRect;
   R: TRect;
begin
 if Assigned( Child ) then
 begin
   Child.AttachProc( WndProcNotifyParentAboutResize );
   Exit;
 end;
 CalcMinMaxChildren( Self_, SzR );
 W := SzR.Right - SzR.Left;
 H := SzR.Bottom - SzR.Top;

 R := Self_.ClientRect;
 if (R.Right = 0) or (R.Bottom = 0) then Exit; // for case when form is minimized
 SI.cbSize := sizeof( SI );
 SI.fMask := SIF_RANGE or SIF_PAGE or SIF_POS;

 GetSetScrollInfo( SB_HORZ, W, R.Right, SzR.Left, SzR.Right );
{+ecm}R := Self_.ClientRect;{/+ecm}
 GetSetScrollInfo( SB_VERT, H, R.Bottom, SzR.Top, SzR.Bottom );
{+ecm} if Assigned( Self_.fScrollChildren ) then Self_.fScrollChildren(Self_); {/+ecm}
end;


 
GMax   (2006-06-01 18:10) [5]

спасибо, вроде всё побеждено :)


 
ecm ©   (2006-06-02 18:40) [6]

Up
Если у кого есть возражения (сображения) по поводу ScrollBox-a
постите сюда....
Надо будет это изменение предложить на рассмотрение Владимиру  в будущую версию.


 
MobiUS ©   (2006-06-09 09:46) [7]

У меня вопрос по поводу ScrollBox"а
Мне надо чтобы вертикальный скролл не отображался, НО! мне надо чтобы он был функционируемым (у меня стоит обработчик при скроле).


 
ECM ©   (2006-06-09 10:58) [8]

Ничего не понял... :) А какой в этом смысл? Объясните подробнее


 
MobiUS ©   (2006-06-09 11:52) [9]

У меня есть на форме отдельный обработчик.
Вощем я сделал прокрутку из 3 кнопок и панельки - хочу сделать интерфейс свой, но встроенный в ScrollBox скролл упорно не хочет убиратся. Мне нужно перехватывать скроллирование чтобы изменять позицию, а позиция меняется при прокручивании колёсика на мышке или нажатии на кнопку


 
ECM ©   (2006-06-09 12:41) [10]

Ага... :)
Ну тут можно пойти двумя путями (imho):
1) Если внутри ScrollBox-a один объект для прокрутки (или их немного) и их перемещение внутри ScrollBox-а делается "вручную" - установкой позиции(размера) - то тут подойдёт "простой" ScrollBox (simple) создаваемый функцией NewScrollBox c выключенными полосами прокрутки Bars = []. В МСК такой ScrollBox можно получить если установить в инспекторе объектов
для TKOLScrollBox.ScrollBars = ssNone и НЕ БРОСАТЬ на него ни одного компонента (в противном случае MCK будет генерировать вызов NewScrollBoxEx вместо NewScrollBox!!!). "Внутреннее наполнение" для ScrollBox-a придётся создавать вручную - в FormCreate . Например PaintBox можно затолкать так:

procedure TForm1.KOLForm1FormCreate(Sender: PObj);
begin
 PaintBox1 := NewPaintBox(ScrollBox1).SetSize(200,200);
 PaintBox1.OnPaint := PaintBox1Paint;
end;


2) Использовать ScrollBoxEx (Если Вы в MCK "накидали" в него компонент - то он будет использоваться автоматически) Он сам санимается прокруткой своих "детей" и задавать ScrollBars = ssNone - нет смысла - он всё равно включит нужную полосу прокрутки сам. Но в этом случае можно попытаться его обмануть - скрыть отрисовку полос уменьшив регион отрисовки. Например так:

procedure TForm1.ScrollBox1Resize(Sender: PObj);
var
 Rgn: HRGN;
begin
 Rgn := CreateRectRgn(0,0,ScrollBox1.Width-GetSystemMetrics(SM_CXVSCROLL),
   ScrollBox1.Height-GetSystemMetrics(SM_CYHSCROLL));
 SetWindowRgn(ScrollBox1.GetWindowHandle,Rgn,TRUE);
end;


 
MobiUS ©   (2006-06-09 12:51) [11]

Спасиба большое!

Второй вариант вполне подошол

я рад, 2 часа искал, как убрать скролл, перерыл весь инет, пасиба ^_^


 
MobiUS ©   (2006-06-09 12:56) [12]

Уммм, осталось тока 1 проблемка:

У меня ползунок находится на Panel, и мне надо както его перемашать, при скролинге, тоесть основная проблема в том, чтобы когда ты скролиш кнопкой или колесиком мыши, ползунок должен вставать в то положение, которое нужно (ползунок в размере не изменяется, в чем и проблема).
Получается мне надо вычесли отношение Range и Positon и расчитать в процентах так чтобы процентное отношение ползунка на Panel было нужным и ползунок встал в нужное место. Уфф немного мудрено, яж даж сам чето не могу разобратся толком


 
MobiUS ©   (2006-06-09 13:05) [13]

аа, вот и проблемку нашол со вторым методом: когда скролы то исчезли, после них остались черные полски (на фоне лежит image). Вопрос - как их убрать. Буду очень благодарен за помощь.


 
homm ©   (2006-06-09 13:12) [14]


> Получается мне надо вычесли отношение Range и Positon и
> расчитать в процентах так чтобы процентное отношение ползунка
> на Panel было нужным и ползунок встал в нужное место.
А мы чем можем помочь? Написать код за тебя?


>  [13] MobiUS ©   (09.06.06 13:05)

Прозрачность/двойная буферизация используется?


 
ECM ©   (2006-06-09 13:33) [15]


> скролы то исчезли, после них остались черные полски

Уберите выравнивание (если есть) у ScrollBox-а и переложите его на панель. А у неё сделайте обработчик:
procedure TForm1.Panel1Resize(Sender: PObj);
var
 Rgn: HRGN;
 cx,cy: Integer;
begin
 cx := GetSystemMetrics(SM_CXVSCROLL);
 cy := GetSystemMetrics(SM_CYHSCROLL);
 ScrollBox1.Width := Panel1.Width + cx;
 ScrollBox1.Height := Panel1.Height + cy;
 Rgn := CreateRectRgn(0,0,ScrollBox1.Width - cx,
   ScrollBox1.Height - cy);
 SetWindowRgn(ScrollBox1.GetWindowHandle,Rgn,TRUE);
end;
 

А вообще-то первый метод "кошернее" :))


 
homm ©   (2006-06-09 13:44) [16]

2 ECM
А зачем
Rgn := CreateRectRgn(0,0,ScrollBox1.Width - cx,
ScrollBox1.Height - cy);
SetWindowRgn(ScrollBox1.GetWindowHandle,Rgn,TRUE);

если
ScrollBox1.Width := Panel1.Width + cx;
ScrollBox1.Height := Panel1.Height + cy;

?


 
MobiUS ©   (2006-06-09 13:45) [17]


> Прозрачность/двойная буферизация используется?


Если тока у главной формы использую Transparent, но цвет отличается от того, что используется на ScrollBox. Так же сам ScrollBox лежит на image.


 
homm ©   (2006-06-09 13:46) [18]


> Если тока у главной формы использую Transparent

Чего? Это то зачем?


 
MobiUS ©   (2006-06-09 13:48) [19]

У меня у формы нету загаловка, а также чтобы убрать лишние "углы" и есть места, которые не надо отображать.


 
ECM ©   (2006-06-09 13:51) [20]


> homm ©   (09.06.06 13:44) [16]

Согласен... :)


 
homm ©   (2006-06-09 13:51) [21]

))))))))))))))))
И как? Работает? :-)))))
Мы точно об оддном и том-же говорим? PControl.Transparent?


 
MobiUS ©   (2006-06-09 13:53) [22]

если уж слишком не понятно, то есть ссылка на картинку:
http://keep4u.ru/imgs/b/0606/4c10e07d115928541c.jpg


 
homm ©   (2006-06-09 13:57) [23]

Это ты с помощью КОЛ наваял? Молодец! Хвалю :-) Только Form.Transparent:=TRUEне дает такого эффекта. Ты наверное SetWindowLayout используеш с флагом TRANSPATENT? Тогда не знаю, чего они чернеют.


 
MobiUS ©   (2006-06-09 14:01) [24]

уммм, я наверно не в той теме пишу.... =), ибо КОЛ я не использую, а обычную дефолтную библиотеку дельфи. И ненадо говорить что проект много весит! (325 кб, но при помощи компрессора).


 
homm ©   (2006-06-09 14:03) [25]


>  И ненадо говорить что проект много весит
Не волнуйся, не буду :-)


> уммм, я наверно не в той теме пишу.... =), ибо КОЛ я не
> использую,

:-|


 
ECM ©   (2006-06-09 14:11) [26]


> уммм, я наверно не в той теме пишу.... =), ибо КОЛ я не
> использую

))))))))))) на третьи сутки Зоркий Сокол заметил.... :))))
А в чем тогда вопрос?

ScrollBox.VerticalScrollBar.Visible := FALSE;

Но остальные вопросы тогда в другую конференцию.... :)


 
MobiUS ©   (2006-06-09 14:16) [27]

Если ставить ScrollBox.VerticalScrollBar.Visible := FALSE , то при попытки прокрутки он просто этоно не делает!

Может потомучто он автоматом задаёт папаметр Range=0 и при изменении этого параметра эфекта никакого не даёт



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

Текущий архив: 2007.02.25;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.05 c
2-1170791635
MSTeam
2007-02-06 22:53
2007.02.25
Меню


15-1170191260
ZiTRaX
2007-01-31 00:07
2007.02.25
Вроде как уязвимость в компиляторах(?)


15-1170574774
vasIzmax
2007-02-04 10:39
2007.02.25
Вопросики...


2-1170151313
ANTPro
2007-01-30 13:01
2007.02.25
Редактор форм


15-1170251680
Ученик чародея
2007-01-31 16:54
2007.02.25
PHP vs Delphi.