Форум » 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 Убедил. Только пока не совсем четко представляю как это все правильно переделать , с Минигуи работаю наскоками.

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 пишет: Проблема с утечкой памяти... Может и так , но мне этот гимор надоел. Нужно было просто сделать рабочий вариант что бы ни чего не глючило. Вроде получилось.



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