Форум » FiveWin » Тормозок » Ответить

Тормозок

Dima: Имеем Бровс , создаем какой нибудь диалог (или окно) и таскаем его по бровсу. Двигается он с заметными тормозами. Это особенность FW ? Как то лечится ? Ни чего подобного не видел в любых других программах под Windows , где так же юзаются таблицы.

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

Pasha: Наверное, при этом вызывается WM_PAINT, перерисовка бровса, а бровс при этом перечитывает данные. Это причина навскидку, я не смотрел кишки xbrowse Если это так, то надо что-то думать, например, как-то кешировать данные

Dima: xbrows это как пример был. Потягать диалог можно например по окну в котором выведена какая то картинка. То же будет тормоз , но не такой как в случае с xbrowse. Pasha пишет: например, как-то кешировать данные Например как ?!

fil: А ты пробни перед открытием диалога сделать этот бровс disable (ну и , соответственно, при закрытии enable)


Dima: fil Неа не помогает :) Вот тут чуваки терли про это , но нормального итога я не увидел , или не заметил. http://forums.fivetechsupport.com/viewtopic.php?f=3&t=19212&start=0&hilit=slow+dialog+move

Dima: Собственно не помогает ни один блок кода , бровс все равно перерисовывается когда по нему диалог таскаю , а делает он это медленно. obrw:blostfocus:={||LOCKWINDOWUPDATE( oBrw:hWnd )} // не помогает obrw:blostfocus:={||oBrw:disable() )} Вот если бы ему можно было как то сказать что если потерян фокус то не перерисовывать...Вопрос как !?

Pasha: Dima пишет: цитата: например, как-то кешировать данные Например как ?! Я для этого грид под себя специально делал, долго возился. А принцип такой же, как у клипперовского tbrowse: данные по всем отображаемым строкам надо кешировать, и для их перевывода надо не перечитывать их из источника, а брать из кэша. Так же работает xHarbour TBrowse. Harbour TBrowse кеш не поддерживает. А насчет чуваков, nageswaragunupudi дал неплохую идею, советую попробовать.

Dima: Pasha пишет: nageswaragunupudi дал неплохую идею, советую попробовать Идею видел , но пока не пойму как это применить. Прилинковал тот исходник. В проге у меня Xbrowse объявлен так [pre2] obrw := xbrowsenew( ownds, 73, 5, ownds:nwidth()-20, ownds:nHeight-105,,,,,,, ofont2,,,,, .F., "znomen",, .F.,, .T., nil, .F., .F. ,,,,, .F., .F., .T., .T., ) [/pre2] ну или так [pre2] @ 73,5 Xbrowse obrw ; Size ownds:nwidth()-20,ownds:nHeight-105 ; of ownds PIXEL font ofont2 CELL LINES ALIAS "znomen" [/pre2] Не очень понял как заюзать класс TXBR3 Собственно исходник [pre2] #include 'fivewin.ch' #include 'xbrowse.ch' #xtranslate DelObj <o> => If <o> != nil; DeleteObject( <o> ); endif; <o> := nil CLASS TXBR3 FROM TXBROWSE CLASSDATA lRegistered AS LOGICAL // used internally DATA hSaveScr METHOD Paint() METHOD Destroy() ENDCLASS METHOD Paint() CLASS TXBR3 local aInfo if ::hSaveScr != nil .and. GetFocus() != ::hWnd aInfo := ::DispBegin() DrawBitmap( ::hDC, ::hSaveScr, 0, 0 ) ::DispEnd( aInfo ) else Super:Paint() DelObj ::hSaveScr ::hSaveScr := WndBitMap( ::hWnd ) endif return nil METHOD Destroy() CLASS TXBR3 DelObj ::hSaveScr return Super:Destroy() [/pre2]

Pasha: Надо сделать модуль для класса txpbr3 - txpbr3.prg, скопировать туда функцию xbrowsenew, переименовать ее, например в xbr3new В этой функции заменить вызов TXBrowse():New( oWnd ) на TXBr3():New( oWnd ) тоже самое можно сделать с командами: сделать файл xbr3.ch скопировать туда команду xbrowse, изменить ее имя и заменить в ней вызов xbrowsenew() на xbr3new()

fil: Перехватил перерисовку бровса при таскании по нему диалога. В этом случае диалог работает как большой ластик. Наверное если PAINT картинку экрана, а не бровс, то перерисовка будет шустрее.

Dima: Pasha Попробую. fil пишет: В этом случае диалог работает как большой ластик Именно. Всем спасибо и с наступающим рождеством !

Dima: Pasha Таки да метода работает и диалоги (окна) не тормозят при движении их по бровсу. Но сразу в проге сломался поисковый GET (и часть функционала других контролов работащих с бровсом) , оно и понятно почему. Ранее в нем набирался текст и тут же происходил поиск по базе и обновление бровса. Теперь рефреш не работает , так как бровс не в фокусе.

Pasha: А что если еще проверять, в фокусе ли и родительское окно ? где-то так: Local nFocus := GetFocus() if ::hSaveScr != nil .and. nFocus != ::hWnd .and. nFocus != ::oWnd:hWnd ...

Dima: Pasha пишет: if ::hSaveScr != nil .and. nFocus != ::hWnd .and. nFocus != ::oWnd:hWnd что то не то (окно MDICHILD) при такой корректировке , диалог нормально ездит по бровсу (без особых тормозов) а вот в поисковом GET в ON CHANGE , obrw:refresh() не срабатывает

Pasha: А где этот поисковый get расположен ? В том же окне, что и бровс ? Тогда можно усложнить проверку Local nFocus := GetFocus() Local lFocus := .f. AEval(::oWnd:aControls, {|o| if(o:hWnd==nFocus, lFocus := .t., )}) if ::hSaveScr != nil .and. nFocus != ::hWnd .and. nFocus != ::oWnd:hWnd .and. ! lFocus

Pasha: Или сделать еще проще, делов то. Кувалда и напильник - наш инструмент Добавить к новому классу еще одно свойство CLASS TXBR3 FROM TXBROWSE CLASSDATA lRegistered AS LOGICAL // used internally DATA lPaint AS LOGICAL INIT .t. в методе Paint проверку написать так: if ::hSaveScr != nil .and. GetFocus() != ::hWnd .and. lPaint а в поисковом get refresh делать так: obrw:lPaint := .f. obrw:refresh() obrw:lPaint := .t.

Dima: Pasha пишет: А где этот поисковый get расположен ? В том же окне, что и бровс ? Да в нем же. Сейчас попробуем.

Dima: Pasha пишет: Local nFocus := GetFocus() Local lFocus := .f. AEval(::oWnd:aControls, {|o| if(o:hWnd==nFocus, lFocus := .t., )}) if ::hSaveScr != nil .and. nFocus != ::hWnd .and. nFocus != ::oWnd:hWnd .and. ! lFocus Вот теперь то что надо :) Спасибо !!!

Dima: Все равно не все в норме.... Правый клик мышки на записи в бровсе , вылезает диалог а курсор в бровсе улетает на другую запись. При закрытии диалога курсор возвращается на место.

Pasha: А что за диалог ? popup-меню ? И как видно, что курсор улетает ? Курсор это подсветка строки ?

Dima: Бровс в окне. Курсор - да подсветка строки (текущей записи) Стою скажем на товаре с кодом 33 , жму правый клик мышки на этой записи и курсор улетает на другую запись c кодом 21 Закрываем диалог. Снова делаем то же самое и вот только тогда все нормально.



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