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

Вниз

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 вся ветка

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

Наверх




Память: 0.52 MB
Время: 0.044 c
6-1158463898
Avgust
2006-09-17 07:31
2007.02.25
переноправить данные с одного порта на другой.


2-1170648453
Riply
2007-02-05 07:07
2007.02.25
Назначение обработчика исключений в Dll.


2-1170477876
Garacio
2007-02-03 07:44
2007.02.25
найти 6 одинаковых чисел в строке


15-1170016567
i-am-vladko
2007-01-28 23:36
2007.02.25
Assembler


15-1170156228
Calibr
2007-01-30 14:23
2007.02.25
Вопрос по HTML?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский