Форум » GUI » TSBROWSE - "цепляется" последняя строка » Ответить

TSBROWSE - "цепляется" последняя строка

Dr. Oldwarez: Обьясните пожалуйста, почему при прокрутке TSBROWSE последняя строка часто не обновляется, а зависает, и её значение остаётся неизменным при прокрутке. В зависимости от установленного числа пикселей высоты, эта строка может быть в половину и в четверть нормальной высоты.

Ответов - 69, стр: 1 2 3 4 All

Dima: Кто то плотно еще работает с Tsbrowse ? Хочется этот отличный но слегка кривоватый в некоторых моментах инструмент довести до "совершенства" По ходу кое чего еще исправили с Has , в частности курсор более не моргает при достижении верхней и нижней видимых границ бровса. Но вот глюк с прорисовкой лишней строки в бровсе не очень ясен , скрины в этой теме , пост 5026. Понятно что он лечится с помощью метода Paint или Display. Но это не наш метод ;) Где еще эта бяка вылезет не понятно. Хочется понять где рисуется и почему эта лишняя строка. nRowCount() четко показал 33 строки , тем не менее при первом вызове наблюдается фантомная строка 34. На которую попасть нельзя. Спинной мозК подсказывает что глюк в каком то методе...........

SergKis: Dima Модифицировал свою бяку из поста 698, с учетом HScroll: [pre2] FUNCTION sTBrwHeight( oBrw ) // уст. реальный размер TBrowse LOCAL nHeightCell := oBrw:nHeightCell LOCAL nHeightHead := oBrw:nHeightHead LOCAL nHeightFoot := oBrw:nHeightFoot LOCAL nHeightSpecHd := oBrw:nHeightSpecHd LOCAL nHeightSuper := oBrw:nHeightSuper LOCAL nLineStyle := oBrw:nLineStyle LOCAL nRowHeight := oBrw:nRowCount() * nHeightCell LOCAL nBrwH := GetwindowHeight(oBrw:hWnd) LOCAL nDelta nHeight := nHeightSuper + ; nHeightHead + ; nHeightSpecHd + ; nRowHeight + ; nHeightFoot + 1 IF ! oBrw:lNoHScroll nDelta := nBrwH - nHeight IF nDelta > 0 .and. nHeightCell > nDelta nHeight += nHeightCell - nDelta - 2 ENDIF ENDIF SetProperty(oBrw:cParentWnd, oBrw:cControlName, 'Height', nHeight) RETURN nHeight [/pre2] Использовать до END WINDOW или перед ACTIVATE WINDOW sTBrwHeight(oBrw5, 'Form_1')

Dima: SergKis пишет: Модифицировал свою бяку из поста 698, с учетом HScroll: Проверил. Получил в nRowCount() 32 строки , на экране вижу 33 , 33-ая фантом и не перейти на нее. Повторить то что у меня получилось будет сложно , так как разные разрешения у нас. И да , высота гор скрола 17 вроде. До кучи , даже если мы установим некую правильную высоту то все сойдет на НЕТ при вызове метода PAINT , DISPLAY в одном из методов. Все перейдет на круги своя.


SergKis: Dima пишет:Получил в nRowCount() 32 строки , на экране вижу 33 , 33-ая фантом и не перейти на нее. Повторить то что у меня получилось будет сложно , так как разные разрешения у нас. Не очень понял, проверил на 11' и 15' - все нормально и HScroll и без него. Без бяки (с HScroll) есть 32 фантомная строка, с бякой она дотягивается до полноценной.

SergKis: Dima пишет:До кучи , даже если мы установим некую правильную высоту то все сойдет на НЕТ при вызове метода PAINT , DISPLAY в одном из методов. Все перейдет на круги своя. Возмо у тебя что то сложное. У меня узкое окно, широкий TBrowse (HScroll), коректировка в строке (на части колонок), реакция на click в header и footer с Refresh(.T.) - и не сбивается выравненная (фантомная) строка

Dima: Сергей попробуй после sTBrwHeight( oBrw ) сделать сразу obrw:display() и ты увидишь что от заданной высоты установленной в sTBrwHeight ни чего не осталось и все пересчиталось.

SergKis: Дима, у меня так: sTBrwHeight(oBrw5) oBrw5:Refresh(.F.) // oBrw5:Display() oBrw5:GoPos(5,2) CENTER WINDOW Form_1 ACTIVATE WINDOW Form_1 Все ok!и разницы с Display или Refresh нет, но по мне refresh больше нравиться

Dima: Странно. Работает значит по разному. Можно пойти другим путем ...я было начал но не закончил тесты. Вычисляем высоту "дырки" в низу бровса , то что он не использовал. [pre2] Func GetHole() local WorkHeight := oBrw:nHeight-oBrw:nHeightHead-oBrw:nHeightSuper-; oBrw:nHeightFoot-oBrw:nHeightSpecHd-if(!oBrw:lNoHScroll,16,0) RETURN WorkHeight-Int(WorkHeight/oBrw:nHeightCell)*oBrw:nHeightCell [/pre2] И затем значение что вернется добавляем к высоте хидера или суперхилера.

SergKis: Dima пишет:И затем значение что вернется добавляем к высоте хидера или суперхилера. Бяка практически это и делает, меняя размер бровсе, можно достричь до хидера, суперхидера. IF oBrw:nHeightSuper > 0 oBrw:nHeightSuper += nDelta ELSE oBrw:nHeightHead += nDelta ENDIF

Dima: Фуф...... Сергей нужно обмениваться примерами , что бы понять что не так. Я менял сырец бровса в методах GoUP и GoDown а так же TSBRWSCROLL из c_TBrowse.c , но это все ради того что бы курсор не мигал при достижении границ и тут дело не в этом. Чуть позже выложу сырец примера и EXE. Не против ? PS Пример самодостаточный , если что и можно его собрать. Но мой EXE все же пощупай и ощути разницу поведения курсора на текущей строке если нажимая стрелку вниз достиг последней строки видимой на экране , тож самое и верхней касается. У тебя будет мерцать ( блымать и тд курсор) а в EXE моем нет.

Dima: SergKis https://cloud.mail.ru/public/HtfA/HnzaTizqW

SergKis: Dima пишет: EXE все же пощупай и ощути разницу поведения курсора на текущей строке если нажимая стрелку вниз достиг последней строки видимой на экране , тож самое и верхней касается. У тебя будет мерцать ( блымать и тд курсор) а в EXE моем нет. Согласен, смотрится лучше.

Dima: И что , у тебя нет фантомной строки если запустить мой EXE ? У меня есть...34-я А если пересобрать пример (ни чего не меняя) тоже нет ?

SergKis: Дима, дырка 5, строк 26, со сборкой и без одинаково. Пробовал только на 11' на 15' позже гляну.

Dima: То есть фантома нет , да ? СтрЯнно........ У меня так Разрешение экрана у меня 1440 x 900

SergKis: Dima пишет:То есть фантома нет Совсем нет, все достойно, только с моей сборкой помаргивает курсор и усе.

Dima: Понял, косяк где то.......... Или в методе NEW или DEFAULT

SergKis: Дима, косяк получил, при MAGAZIN.oBrw.Height := MAGAZIN.oBrw.Height - 12 т.е. дырка 15, строк 25, а в показу +0.5 от 26

SergKis: Дима, на первый взгляд, кажется лечится PRIV nGetHole .... END WINDOW MAGAZIN.oBrw.Height -= nGetHole [pre2]Func GetHole() local WorkHeight := oBrw:nHeight-oBrw:nHeightHead-oBrw:nHeightSuper-; oBrw:nHeightFoot-oBrw:nHeightSpecHd-if(!oBrw:lNoHScroll,16,0) LOCAL nHole := WorkHeight-Int(WorkHeight/oBrw:nHeightCell)*oBrw:nHeightCell nGetHole := nHole RETURN nHole [/pre2] в. показе 26 и фанома нет, но такое чувство, что есть 27 строка и сделав pgdn - попадаем на 27 (а должны были на 26, 1-ая сверху)

Andrey: Я немного модифицировал пример, поставил показ разрешения экрана и проверку на LargeFonts(), получилось так: Разрешение: 1920х1080 Ширину колонок надо бы делать так (сразу под разные разрешения экрана): oBrw:aColumns[ 4 ]:cHeading :="накладной" nTxtWidth := GetTxtWidth( "1накладной1", nFontSize, cFont) oBrw:SetColSize( 4, nTxtWidth ) Определение nFontSize, cFont - задать выше. Функцию GetTxtWidth() дал SergKis, можно взять из http://clipper.borda.ru/?1-1-0-00000454-000-60-0 Пост N: 4373



полная версия страницы