Форум » GUI » TsBrowse в Минигуи (продолжение) » Ответить

TsBrowse в Минигуи (продолжение)

Vlad04: TsBrows определяется в виде строки ПАРМЕТРОВ объекта и их значений К примеру [quote] DEFINE TBROWSE oBrw2 ; AT 60,450 ; ALIAS cAlias ; OF Form1 ; WIDTH 330 ; HEIGHT 340 ; FONT "Verdana" ; SIZE 9 ; ON DBLCLICK CopyRec(); ON GOTFOCUS fModelo_Hab(2) ; AUTOFILTER ; CELLED EDIT; VALUE nRec; GRID [/quote] Здесь я собрал параметры из разных tBrows Можно или нет и какие парметры заменить выражением ( и каким) ? oBrw2:.... oBrw2:....

Ответов - 300, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All

SergKis: ММК пишет Иногда помогало :) Лишним такое переотображение не будет, согласен

Dima: SergKis пишет: Тут изменения Вариант понятен , снова править сырцы. Думал можно обойтись без этого. Да и результат я так понял по сообщению выше , не всегда стабилен и может заглючить. В любом случае , спасибо Попробую основной бровс с TS переписать на обычный бровс , надеюсь там есть двойной курсор и его раскраска.

Haz: Дима, в подчиненом бровсе сразу прорисовка( при смене строки) или по таймеру после прекращения навигации в главном? Пишу с мобилы. Пока нет компа под рукой

Dima: Haz пишет: Дима, в подчиненом бровсе сразу прорисовка или по таймеру после прекращения навигации в главном. Так по таймеру и делал с твоей подачи Игорь.

Haz: Попробуй задержку таймера увеличить

Haz: У меня целый день пользователь гоняет мышь вверх вниз от безделья. С тех пор как переделал на таймер все работает

Dima: Haz пишет: Попробуй задержку таймера увеличить Хорошо , отпишу завтра. Haz пишет: У меня целый день пользователь гоняет мышь вверх вниз от безделья У моего думаю так же , но не факт....

Haz: Еще при прорисовке подчиненного процедуру глянь. У тебя там скорее scope и refresh используется. Кажется мне если этот refresh закоментить то слом прекратиться, впрочем как и отображение scope Я использую reset для перерисовки

Dima: Haz Завтра выложу кусок сырца , но там вроде все правильно. У меня там RESET бровсу + серверный фильтр , Refresh нет

Softlog86: когда пошли первые непонятные подвисания и косяки с прорисовкой (пустые строки в середине таблицы) , сразу отказался от использования TSBROWSE и ушел на стандартные BROWSE . Когда допилят - попробую снова . кроме SuperHeader и раскраски элементов ничего от них не нужно было ....

Dima: Haz Вот сырцы , но там все гладко как бы. Ведь работает же первые 5-10 минут нормально. Если не клацать ни чего в бровсе и не ездить по нему , то обе таблички могут висеть хоть целый день и ни чего не ломается. Но стоит интенсивно поездить по ним какое то время , бровс начинает жить своей жизнью и может сломать жизнь другим окнам и контролам в программе. [pre2] __objAddData (oBrw3, 'nOldRecord' ) __objAddData (oBrw3, 'nNewRecord' ) __objAddData (oBrw3, 'nDellay' ) oBrw3:nDellay := 50 ... ... ... .... oBrw3:bChange := { || CheckRefresh(oBrw3) } // для главного бровса [/pre2] *------------------------------------------------------ [pre2] FUNC CheckRefresh( o ) IF ! _IsControlDefined ( o:cControlName + '_Timer', o:cParentWnd ) _DefineTimer ( o:cControlName + '_Timer' , o:cParentWnd , o:nDellay , { || OnChangeProcedure(o) } ) END o:nNewRecord := o:nLogicPos() RETURN NIL *--------------------------------------------------- FUNC OnChangeProcedure( o ) if o:nOldRecord == o:nNewRecord Myfilter(o,obrw4) IF _IsControlDefined ( o:cControlName + '_Timer', o:cParentWnd ) Domethod( o:cParentWnd, o:cControlName + '_Timer' , 'Release') ENDIF endif o:nOldRecord := o:nLogicPos() RETURN NIL *--------------------------------------------------------- Func MyFilter(o1,o2) If o1:loBrw3Ready Setproperty("SPR_REC","Message4","value","Загрузка данных.......") Flogan('rid=='+ntoc((o1:cAlias)->rid) ,o2:cAlias) // серверный фильтр ADS o2:Reset() GetTotal(.t.,o2 ) Setproperty("SPR_REC","Message4","value",alltrim((o1:cAlias)->naim) ) Setproperty("SPR_REC","Message4","tooltip",alltrim((o1:calias)->prime)) Setproperty("SPR_REC","Message5","value",getuserfio() ) FreshFoots(o2) if n_fltrecept==2 Setproperty(obrw3:cParentWnd,"Button_1","Enabled",FALSE) endif if kaka("recept") .or. idrec_user==(o1:calias)->n_user obrw3:SetDeleteMode( if (n_fltrecept==2,.f.,.t.) ,.f.,{|| del_x:=(obrw3:calias)->rid,isdel(obrw3)} , {||ClearSpec(del_x) , x:=obrw3:bchange,obrw3:bchange:=nil,obrw3:Gotorec((obrw3:calias)->(recno())),obrw3:bchange:=x,eval(obrw3:bchange) } ) obrw4:SetDeleteMode( if (n_fltrecept==2,.f.,.t.) ,.f.,{|| if( (obrw4:calias)->itg==0,msgokCancel("Удалить "+alltrim(getspr(oBrw4,"naim"))+" ?","Внимание"),FALSE) },{|| Gettotal(.t.,obrw4),FreshFoots(obrw4)} ) Setproperty(obrw3:cParentWnd,"Button_2","Enabled",if(n_fltrecept==2,FALSE, TRUE) ) Setproperty(obrw3:cParentWnd,"Button_2","Enabled",if(n_fltrecept==2,FALSE, TRUE) ) Setproperty(obrw3:cParentWnd,"Button_3","Enabled",if(n_fltrecept==2,FALSE, TRUE) ) Setproperty(obrw4:cParentWnd,"Button_1x","Enabled",if(n_fltrecept==2,FALSE, TRUE) ) Setproperty(obrw4:cParentWnd,"Button_2x","Enabled",if(n_fltrecept==2,FALSE, TRUE) ) Setproperty(obrw4:cParentWnd,"Button_3x","Enabled",if(n_fltrecept==2,FALSE, TRUE) ) Setproperty(obrw4:cParentWnd,"Button_4x","Enabled",if(n_fltrecept==2,FALSE, TRUE) ) Setproperty(obrw4:cParentWnd,"Button_6x","Enabled",if(n_fltrecept==2,FALSE, TRUE) ) Setproperty(obrw4:cParentWnd,"Button_7x","Enabled",if(n_fltrecept==2,FALSE, TRUE) ) Setproperty(obrw4:cParentWnd,"Button_8x","Enabled",if(n_fltrecept==0,kaka("prnrecept"),.t. )) else obrw3:SetDeleteMode( .f.,.f.,{|| del_x:=(obrw3:calias)->rid,isdel(obrw3)} , {||ClearSpec(del_x) , obrw3:Gotorec((obrw3:calias)->(recno())) } ) obrw4:SetDeleteMode( .f.,.f.,{|| if( (obrw4:calias)->itg==0,msgokCancel("Удалить "+alltrim(getspr(oBrw4,"naim"))+" ?","Внимание"),FALSE) },{|| Gettotal(.t.,obrw4),FreshFoots(obrw4)} ) Setproperty(obrw3:cParentWnd,"Button_2","Enabled",FALSE ) Setproperty(obrw3:cParentWnd,"Button_3","Enabled",FALSE ) DoMethod ( "SPR_REC" , "Button_5" , 'Hide' ) Setproperty(obrw4:cParentWnd,"Button_1x","Enabled",FALSE ) Setproperty(obrw4:cParentWnd,"Button_2x","Enabled",FALSE ) Setproperty(obrw4:cParentWnd,"Button_3x","Enabled",FALSE ) Setproperty(obrw4:cParentWnd,"Button_4x","Enabled",FALSE ) Setproperty(obrw4:cParentWnd,"Button_6x","Enabled",FALSE ) Setproperty(obrw4:cParentWnd,"Button_7x","Enabled",FALSE ) Setproperty(obrw4:cParentWnd,"Button_8x","Enabled",if(n_fltrecept==0,kaka("prnrecept"),.t. )) endif endif return nil *-------------------------------------------------------- func Flogan(ceri,alik) hb_default(@alik,alias()) if (alik)->(Rddname())=="ADSCDX" (alik)->(AdsSetAof(ceri,2)) else (alik)->(dbsetfilter({|| &(ceri)},ceri)) endif return nil *--------------------------------------------------------- [/pre2] Вот видео что выслал клиент. Я позже у себя тоже плотно поюзал и выпал на похожие глюки (писал выше) https://icq.com/files/8uYhqfbCuUW6BUvEZYzFSp5821d4ab1ad

SergKis: Dima пишет Вот сырцы Может не так понял, но создавать тимер в CheckRefresh и удалять в блоке кода { || OnChangeProcedure(o) } это слишком круто (через 50 млсек.) 1. По мне тимер надо вешать на окно и приостанавливать его работу на время выборок, делая тимеру Enabled := .F. и запуская на отслеживание изменения позиции\ключа данных Enabled := .T. 2. SetDeletedMode тоже поставить один раз на obrw3,obrw4 и внутри отслеживать что там надо 3. Сам тимер в работе должен ТОЛЬКО отследить, что сменился ключ\позиция (рассогласование obrw3, obrw4) и включить прорисовку obrw4, причем время реакции\работы тимер не менее 700 млсек. (в VO ставил 1000 млсек.).

SergKis: PS процедура CheckRefresh в obrw3, должна только показывать, что сменился ключ\позиция, при перемещении, а тимер, срабатывая (через сек.) переотображать, если ключ\позиция изменились Это, конечно, если правильно понял идею по тексту

Haz: SergKis удалять в блоке кода { || OnChangeProcedure(o) } это слишком круто (через 50 млсек.) Согласен , была мысль поселить таймер в бровсе и управлять прорисовкой флагами . Но до реализации не дошло. То что дал Дима , это временное решение . и как все временное живет уже почти год Идея ты понял правильно - незачем рисовать дочерний бровс пока пользователь не оторвал палец от клавиатуры или не перестал крутить колесо. Dima Вот сырцы только если смену фокуса на дочерний бровс перед прорисовкой и восстановить на главный после

gfilatov2002: SergKis пишет: тимер надо вешать на окно и приостанавливать его работу на время выборок, делая тимеру Enabled := .F. и запуская на отслеживание изменения позиции\ключа данных Enabled := .T. Полностью согласен - это оптимальный путь В противном случае каждые 50 мсек создается PUBLIC переменная для нового таймера, что и приводит к утечке памяти у Димы. Рекомендую также увеличить время срабатывания таймера минимум в 3 раза (можно и больше ) Кстати, для периодической чистки памяти по таймеру на форуме HMG рекомендуют команду DEFINE TIMER Tmr_1 INTERVAL 5000 ACTION (RELEASE MEMORY) // только для WinVista и выше Dima пишет: Вот сырцы , но там все гладко как бы. Не совсем гладко, выходит...

Dima: Не думал что таймер может так поднасрать ))) Сделал без таймера. В Bchange главного бровса o:Reset() прибил , так как при частом вызове это может привести к зависанию бровса. Вместо него сделал o:Refresh(.t.) +o:Gotop()+ o:upstable() Испытываю езду по бровсу , пока не виснет и не глючит Но посмотрим....

SergKis: Dima пишет Вместо него сделал o:Refresh(.t.) + o:upstable() Испытываю езду по бровсу , пока не виснет и не глючит От timer не отказывайся, по левому тсб бегают\остановились, а правый через 1 сек. переотображает (если сменилось), это лучше, чем на каждой смене левой записи переотображать правый тсб.

Dima: SergKis пишет: это лучше, чем на каждой смене левой записи переотображать правый тсб. Я понимаю это , но вот езжу туда сюда уже 30 минут и все нормально , косяков нет. Правый бровс думаю не умрет , ведь перед показом там идут некоторые расчеты , что и дает некую задержку. Когда там жил RESET() , могло зависнуть.

SergKis: Dima пишет Правый бровс думаю не умрет , ведь перед показом там идут некоторые расчеты , что и дает некую задержку. Т.е. получается правый тсб расчитывает потом показывает (с задержкой), а левй убежал уже куда то, т.к. на нем крутим колесо мыши, не уверен, что это правильно

SergKis: PS Если правильно понимию от правого тсб ставится scope\filter и получается правый убежал и что то ставит, а левый еще где то в прошлых установках



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