Форум » 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:....
SergKis: надо читать левый убежал и что то ставить, а правый еще в прошлых установках, спутался чуть чуть, сори
Dima: SergKis Убедил. Только пока не совсем четко представляю как это все правильно переделать , с Минигуи работаю наскоками.
SergKis: Dima Схематично можно делать так [pre2] DEFINE WINDOW ... @ 0, 0 LABEL Buf VALUE '' WIDTH 2 HEIGHT 2 INVISIBLE This.Buf.Cargo := 0 // тут к примеру oBrw3, oBrw4 TsBrowse создаем SetProperty(ThisWindow.Name, 'oBrw4', 'Cargo', 0) DEFINE TIMER MyTimer INTERVAL 1000 ACTION DoTimer(oBrw4) This.MyTimer.Enabled := .F. END WINDOW FUNC CheckRefresh( o ) SetProperty(o:cParentWnd, 'Buf', 'Cargo', (o:cAlias)->( RecNo() )) // если есть кнопки к левому тсб, их можно тут поставить в Enabled := <что надо> RETURN NIL FUNC DoTimer( o ) LOCAL nNew := GetProperty(o:cParentWnd, 'Buf' , 'Cargo') LOCAL nOld := GetProperty(o:cParentWnd, 'oBrw4', 'Cargo') If empty(nNew) RETURN NIL EndIf If nNew != nOld SetProperty(o:cParentWnd, 'MyTimer', 'Enabled', .F.) // тут перепоказ правого тсб // ставим scope\filter и .... SetProperty(o:cParentWnd, 'oBrw4', 'Cargo', nNew) SetProperty(o:cParentWnd, 'MyTimer', 'Enabled', .T.) EndIf RETURN NIL [/pre2]
SergKis: PS забыл, после готовности окна (тсб) к работе вкл. This.MyTimer/Enabled := .T.
Dima: SergKis Сделал так [pre2] FUNC DoTimer( o3,o4 ) LOCAL nNew := GetProperty(o3:cParentWnd, 'Buf' , 'Cargo') LOCAL nOld := GetProperty(o3:cParentWnd, 'oBrw3', 'Cargo') If o3:loBrw3Ready If empty(nNew) RETURN NIL EndIf If nNew != nOld SetProperty(o3:cParentWnd, 'MyTimer', 'Enabled', .F.) Myfilter(o3,o4) // тут перепоказ правого тсб // ставим scope\filter и .... SetProperty(o3:cParentWnd, 'oBrw3', 'Cargo', nNew) SetProperty(o3:cParentWnd, 'MyTimer', 'Enabled', .T.) EndIf endif RETURN NIL [/pre2] Когда двигаюсь по бровсу o3 (главный) , то в правом o4 ни чего не меняется , так и надо. Но вот когда остановился , правый бровс начинает все время обновляться и моргать. Что не так сделал ? Где то нужно остановить таймер , не пойму где..
SergKis: Dima пишет Где то нужно остановить таймер , не пойму где.. Timer останавливать не надо, должно срабатывать nNew == nOld и выход из DoTimer надо проверить, что там
Dima: Мой косяк , баловался сам с таймером и забыл убрать свой. В общем , после того как я перестал двигаться по бровсу , правый бровс не обновился почему то
Dima: SergKis пишет: Timer останавливать не надо, должно срабатывать nNew == nOld и выход из DoTimer Понял , сделал так [pre2] FUNC DoTimer( o3,o4 ) LOCAL nNew := GetProperty(o3:cParentWnd, 'Buf' , 'Cargo') LOCAL nOld := GetProperty(o3:cParentWnd, 'oBrw3', 'Cargo') If o3:loBrw3Ready If empty(nNew) RETURN NIL EndIf If nNew != nOld //SetProperty(o3:cParentWnd, 'MyTimer', 'Enabled', .F.) Myfilter(o3,o4) // тут перепоказ правого тсб // ставим scope\filter и .... SetProperty(o3:cParentWnd, 'oBrw3', 'Cargo', nNew) // SetProperty(o3:cParentWnd, 'MyTimer', 'Enabled', .t.) EndIf endif RETURN NIL [/pre2] Но правый бровс не обновляется после как я перестал двигаться по левому
SergKis: Dima пишет Но правый бровс не обновляется после как я перестал двигаться по левому так и задумано, работай теперь с правым (по правым кнопкам) сместишь левый - получишь новый правый и т.д. разве не так надо было ?
Dima: я кажется понял в чем дело Поставил заглушку на Bchange )) Переделал на oBrw3:bChange := {|| SetProperty(obrw3:cParentWnd, 'Buf', 'Cargo', (obrw3:cAlias)->( RecNo() ))}
SergKis: PS Если не двигаемся, но через время надо перечитать с сервера, надо стелать чсетчик сек. и обновлять nOld := 0 :[pre2] FUNC DoTimer( o3,o4 ) LOCAL nNew := GetProperty(o3:cParentWnd, 'Buf' , 'Cargo') LOCAL nOld := GetProperty(o3:cParentWnd, 'oBrw3', 'Cargo') STATIC nRefr := 0 ... nRefr += 1 If nRefr > 5 nOld := 0 EndIf If nNew != nOld ... [/pre2]
Dima: Вообще была идея выключать Таймер в Bchange , вот только не понятно когда его включить , если этого не сделать и двигаться зажав кнопку вниз , правый бровс все равно будет обновляться НО с интервалом уставленным в таймере
SergKis: Dima пишет правый бровс все равно будет обновляться НО с интервалом уставленным в таймере По мне, это приемлемо - видно что все работает (главное правый тсб автономно сам ставит что надо) Реакция отображения правого тсб 1-2 сек. - это нормально
Dima: SergKis пишет: Реакция отображения правого тсб 1-2 сек. - это нормально Мне показалось это время не приемлемо большим и поставил 200 мс
SergKis: Dima пишет Мне показалось это время не приемлемо большим и поставил 200 мс Думаю, ты очень горячися и подгоняешь клиента к убыстренной работе, ему некогда подумать, попить чаю\кофе ...
Dima: Когда таймер жил прямо в бровсе , понятно что были с этим проблемы , но по крайней мере при движении по главному бровсу , подчиненный молчал как партизан. Остановил движение и правый обновился.
SergKis: Dima пишет подчиненный молчал как партизан. Остановил движение и правый обновился. Так тут тоже можно сделать такое, отображать не при nNew != nOld, а при nNew == nOld по счетчику входов, типа 3 раза вошли по тимер и nNew == nOld отображаем, надо немного усложнить тимер, мне всегда было лениво
Dima: SergKis Понял. Спасибо !
Haz: Дима, глянул твои исходники внимательно и почитал все что написали. Сорь раньше не мог. Есть пару мыслей.... Во первых таймер не убивается каждые 50 мс а лишь тогда когда юзер оторвет палец от колеса. Проблема с утечкой памяти... Возможно и есть , но у себя не наблюдаю глюков. А главная проблема мне кажется в исходнике - процедура myfilter не успевает выполниться за 50 мс и не происходит выравнивания номера записи и логикпос., это приводит к следующему тику таймера ит д.. Уверен если задержку сделать 200 и перенести майфильтр в конец ( перед return) то основная причина глюка уйдет. Что касается утечки, то можно на каждую 10 прорисовку второго бровса повесить сборщик мусора. Сори за мой французский, пишу с мобилы. У себя оставлю пока так. Позже переделаю на флаги, таймер инициализировать буду по инит бровса, а убивать при закрытии бровсе. Тогда и утечек не будет.
Dima: Haz пишет: Сори за мой французский, пишу с мобилы. Игорь все нормально , кажется проблема решена. Пошел по пути как посоветовал Сергей. Отдал клиенту , если что то он будет стучать в рельсу. Я сам долго ездил после доработки по бровсу , проблем не увидел. Haz пишет: Проблема с утечкой памяти... Может и так , но мне этот гимор надоел. Нужно было просто сделать рабочий вариант что бы ни чего не глючило. Вроде получилось.
полная версия страницы