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

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

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

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

gfilatov2002: Dr. Oldwarez пишет: почему при прокрутке TSBROWSE последняя строка часто не обновляется Да, есть такая бяка Известно даже, как ее победить: надо добавить несколько вызовов Refresh(.T.) в методы, влияющие на прокрутку Но после таких поправок оригинального кода резко увеличится мигание экрана и замедлится скорость прокрутки, что весьма критично при работе в сети. Поэтому предлагается делать небольшую настройку (тюнинг ) высоты ячеек для устранения этого неприятного эффекта. Для демонстрации этой техники посмотрите/изучите/используйте (нужное подчеркнуть) пример ниже: [pre]#include 'minigui.ch' #include "TSBrowse.ch" procedure main dbcreate('test',{{'nazwa','C',30,0},; {'ilosc','N',12,2},; {'cena','N',14,2}}) dbusearea(.t.,,'test') for i := 1 to 100 test->(dbappend()) test->nazwa := str(i) test->ilosc := test->(recno()) test->cena := (test->ilosc * HB_Random(100)) next test->(dbgotop()) DEFINE WINDOW o_dlu AT 0,0 WIDTH 600 HEIGHT 400; TITLE ' test' MAIN ICON "MAIN" ; FONT 'ARIAL' SIZE 12 @ 50,500 SPINNER Sp RANGE 0,100 value 26 WIDTH 60 ON CHANGE (br_zaw:nHeightHead := o_dlu.sp.value,br_zaw:reset()) ON KEY ESCAPE OF o_dlu ACTION o_dlu.RELEASE DEFINE TBROWSE Br_zaw AT 15, 10 OF o_dlu ALIAS "test" WIDTH 450 HEIGHT 330 br_zaw:SetColor( { 2 }, { { | | IIf( test->(OrdKeyNo()) % 2 = 0,Rgb(255,255,255),rgb(230, 230, 230) ) }}) ADD COLUMN TO br_zaw DATA {|| test->nazwa } ALIGN DT_LEFT, DT_CENTER, DT_CENTER TITLE 'Nazwa' SIZE 150 FOOTER 'Pozycji '+LTrim( str(test->(lastrec())) ) ADD COLUMN TO br_zaw DATA {|| test->ilosc } ALIGN DT_RIGHT, DT_CENTER,DT_CENTER TITLE 'Ilosc' SIZE 100 ADD COLUMN TO br_zaw DATA {|| test->cena } ALIGN DT_RIGHT, DT_CENTER, DT_CENTER TITLE 'Cena' SIZE 100 br_zaw:nHeightCell += 6 br_zaw:nHeightFoot += 4 br_zaw:nHeightHead += 10 br_zaw:nWheelLines := 1 br_zaw:reset() br_zaw:setfocus() br_zaw:DrawSelect() br_zaw:Gotop() END TBROWSE END WINDOW o_dlu.br_zaw.setfocus ACTIVATE WINDOW o_dlu return[/pre]

Dr. Oldwarez: Большое вам спасибо

gfilatov2002: Dr. Oldwarez пишет: почему при прокрутке TSBROWSE последняя строка часто не обновляется, а зависает Удалось корректно устранить эту проблему с помощью польских пользователей библиотеки Скоро ждите новую сборку с включенными исправлениями


Dr. Oldwarez: Я уже поставил новую версию и тестирую её в своих программах. В большинстве случаев TBROWSE работают нормально. Но если установлен DESCENDING (сортировка по убывающей), то при прокрутке TBROWSE вообще зависает программа. Подскажите, пожалуйста, что делать в этом случае.

Dima: Не знаю что правили польские юзеры но проблема осталась. Начальный вход в бровс , внизу живет половина строки с номером 34 , переход на нее не возможен. Стоит переключится на любое другое окно в винде и потом снова вернутся в свою прогу от 34 строки и следа не осталось (так и должно быть). Пробовал Refresh , не помог. Так же то что советовал Григорий - результат ноль. Скрины

SergKis: Dima я себе соорудил такую бяку:[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 nHeight := nHeightSuper + ; nHeightHead + ; nHeightSpecHd + ; nRowHeight + ; nHeightFoot + 1 IF GetwindowHeight(oBrw:hWnd) > nHeight SetProperty(oBrw:cParentWnd, oBrw:cControlName, 'Height', nHeight) ENDIF RETURN nHeight [/pre2] может что то и не учел.

Dima: Спасибо Сергей , попробую ! PS Вроде решил так По ходу если в конце выдать Obrw:Paint() то все нормально и лишней строки нет.

Dima: А как лечить к примеру oBrw:gopos(2,5) , вызов идет сразу после того как бровс появился на экране. В 5-ю колонку я попал а вот строка осталась первой.

SergKis: Dima пишет:А как лечить к примеру oBrw:gopos(2,5) , вызов идет сразу после того как бровс появился на экране. oBrw:Gotop() oBrw:GoPos(2,5)

Dima: Нет не катит. Попал туда если перенести oBrw:GoPos(2,5) и вставить после END WINDOW , перед активацией окна. А этого делать не хотелось бы.

SergKis: а в On init ? часто же надо позиционировать по ранее запомненному месту при входе в просмотр

SergKis: Dima пишет:вставить после END WINDOW , перед активацией окна. А этого делать не хотелось бы. sTBrwHeight( oBrw ) тоже перед активацией надо ставить (уберет половинчатую строку) для каждого TsBrowse окна

Dima: Да это понятно все Сергей. Не понятно почему при gopos(2,5) попадаю в нужную колонку все таки а вот в строку нет. Я бы еще понял если бы gopos(2,5) совсем не сработал а тут какая то половинчатая реакция у него. SergKis пишет: а в On init ? Предлагаешь бровс описывать в ON INIT окна ? Я делаю внутри описания окна пока что. Полагал что это без разницы. А она есть ?

SergKis: Dima пишет:Предлагаешь бровс описывать в ON INIT окна ? Я делаю внутри описания окна пока что. Я тоже мах в окне (често on init не люблю - уже окно в нем нарисовано и если что перерисовать надо - может моргать) многое переношу после end window до activate (modal окна). Например расчитать окончательные размеры связанных контролов, самого окна от размеров контролов, позиционирование по таблицам, запомненное ранее или заданное как scope снаружи окна (загрузка массивов, связанная с данными на входе окна), ... Т.е. я часто разрушаю окна, а не перевожу в hide, но запоминаю где был на окне и просто потом создаю такое же окно с предыдущим позиционированием.

Dima: Понял !

SergKis: Dima пишет: у меня так:[pre2] ... ADD COLUMN TO oBrw5 DATA {|| iif(KOPER > 0, aOper[KOPER], hb_ntos(KOPER)) } ; TITLE aHdr[ i ] ; FOOTER aFot[ i ] ; COMBOBOX ; EDITABLE ; LOOK3D .F., .F., .F. oBrw5:aColumns[ i ]:Cargo := { aFld[ i ], nAls, { aOper, aKod } } oBrw5:SetData ( i, NIL, { aOper, aKod } ) oBrw5:aColumns[ i ]:bEditing := { |uVar,oBrw| oBrw:aColumns[oBrw:nCell]:oEdit:LButtonDown() } oBrw5:aColumns[ i ]:bEditEnd := { |uVal,oBrw,lSave| lSave := lSave .and. RLock(), ; iif(lSave, FieldPut(FieldPos('KOPER'), uVal+1), NIL), ; iif(lSave, dbUnLock(), NIL) } HdrClick(0) // oBrw5:bUserKeys := {|nK,nF,oB| UserKeyDown(nK, nF, oB) } oBrw5:lCellBrw := .T. oBrw5:lEditable := .T. oBrw5:lNoHScroll := .T. oBrw5:lNoMoveCols := .T. oBrw5:lNoLiteBar := .F. oBrw5:lNoResetPos := .F. oBrw5:nFreeze := 1 oBrw5:aColumns[ 1 ]:lEdit := .F. // LACC not Edit oBrw5:aColumns[ 4 ]:lEdit := .F. // адрес not Edit oBrw5:GoPos(2, 3) [/pre2] до end window и попадаю как надо

Dima: SergKis пишет: oBrw5:GoPos(2, 3) до end window и попадаю как надо Чудеса да и только .....а я не попал ;) Буду разбираться чего ему надо.

Dima: Кстати попал вот так ;) oBrwM:Display() oBrwM:gopos(3,5)

SergKis: Dima пишет:Кстати попал вот так у меня END WINDOW oBrw5:nHeightHead := 25 // высота строки заоловка oBrw5:nHeightFoot := 25 // высота строки подвала oBrw5:aColumns[ 3 ]:cFooting := "Итог 3 " // установить значение подвала колонки 3 // oBrw5:Display() попробовал разкоментировал - одинаково ставит правильно oBrw5:goto(2,3)

Dima: а вот еще "странный" вопрос ;) если oBrwM:lNoHScroll := TRUE вот в таком положении то выравнивание через nAdjColumn не работает. как можно избавится от горизонтального скрола и при этом не сломать выравнивание ? SergKis пишет: попробовал разкоментировал - одинаково ставит правильно oBrw5:goto(2,3) Сергей это я делал до END WINDOW , работает. Хотя я мысль понял что по уму делать надо конечно же после END WINDOW



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