Форум » 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

Haz: SergKis пишет: Смущает только default lEditMode := .F. можно оставить по дефолту .T. пример отлично работает

SergKis: Haz пишет можно оставить по дефолту .T. Так и сделал. Для примера ничего не изменилось в работе, но править в старом коде придется по любому [pre2] FUNCTION PrevEdit(xVal, oBrw) LOCAL oCell := oBrw:GetCellInfo(oBrw:nRowPos) LOCAL nY := oCell:nRow //+ oBrw:nHeightHead + 4 [/pre2]

gfilatov2002: SergKis пишет: править в старом коде придется по любому Да. Например, сломался режим добавления по клавише F2 в примере из папки \SAMPLES\Advanced\Tsb_addrecord_3


SergKis: gfilatov2002 пишет сломался режим добавления по клавише F2 в примере из папки Правится легко, но геморой остается в др. текстах [pre2] STATIC FUNCTION Add_Rec( oBrw ) ... nRow := 0 //:nTop + GetWindowRow( hWnd ) - GetBorderHeight() nCol := 0 //:nLeft + GetWindowCol( hWnd ) - GetBorderWidth () + 1 [/pre2] Может метод другой сделать GetCellRect, как Игорь ф-ю называл или GetCellSize

Haz: SergKis пишет: но править в старом коде придется по любому может еще один параметр ввести в GetCellInfo(....lParentPos ) hb_default( @lParentPos, .f.) определяет учитывать ли координаты парент окна

Haz: SergKis пишет: Может метод другой сделать GetCellRect, как Игорь ф-ю называл или GetCellSize возможно это выход

gfilatov2002: SergKis пишет: метод другой сделать GetCellSize Пошел по этому пути. Теперь пример работает нормально

SergKis: gfilatov2002 пишет Пошел по этому пути. Тогда есть смысл убрать lEditMode и строки с использованием ::aEditCellAdjust из метода Добавил метод GetCellSize, убрал lEditMode и строки с использованием ::aEditCellAdjust из него Пример Tsb_addrecord_3 нормально В своем примере (выше) использовал новый метод, вместо GetCellInfo, все работает OK!

gfilatov2002: SergKis пишет: убрать lEditMode и строки с использованием ::aEditCellAdjust из метода Ok. Также изменил описание: * Updated: Adaptation FiveWin Class TSBrowse 9.0 in HMG: - added the new useful method GetCellSize(). Suggested and contributed by Sergej Kiselev and Igor Nazarov (see demo in folder \samples\Advanced\Tsb_addrecord_3)

Andrey: Всем привет ! А можно в ENUMERATOR (это где номера колонок стоят) поставить иконку/картинку слева ? И возможно ли отслеживать нажатие мышкой на нём ? Хотелось бы сделать фильтрацию как в Экселе, там есть красивое решение.

SergKis: Andrey TSCOLUMN.PRG[pre2] // Click Event DATA bFLClicked // Block to be evaluated on footer left clicked DATA bFRClicked // Block to be evaluated on footer right clicked DATA bHLClicked // Block to be evaluated on header left clicked DATA bHRClicked // Block to be evaluated on header right clicked DATA bSLClicked // Block to be evaluated on Special header left clicked DATA bSRClicked // Block to be evaluated on Special header right clicked DATA bLClicked // Block to be evaluated on cell left clicked ... DATA uBmpCell // bitmap in cell (oBmp, hBmp or bBlock) DATA uBmpFoot // bitmap in footer (oBmp, hBmp or bBlock) DATA uBmpHead // bitmap in header (oBmp, hBmp or bBlock) DATA uBmpSpcHd // bitmap in special header (oBmp, hBmp or bBlock) ... H_TSBROWSE.PRG METHOD LButtonDown( nRowPix, nColPix, nKeyFlags ) CLASS TSBrowse ... uPar1 := nRowPix, ; uPar2 := nColPix, ; ... nClickRow := ::GetTxtRow( nRowPix ) nAtCol := Max( ::nAtColActual( nColPix ), 1 ) // JP 1.31 lHeader := nClickRow == 0 .AND. ::lDrawHeaders lFooter := nClickRow == -1 .AND. iif( ::lDrawFooters != NIL, ::lDrawFooters, .F. ) lSpecHd := nClickRow == -2 .AND. iif( ::lDrawSpecHd != NIL, ::lDrawSpecHd, .F. ) ... ELSEIF lSpecHd .AND. ::lEditableHd lMChange := ::lMChange ::lMChange := .F. IF ::aColumns[ nAtCol ]:bSLClicked != NIL Eval( ::aColumns[ nAtCol ]:bSLClicked, uPar1, uPar2, ::nAt, Self ) ... [/pre2] PS Возможно, надо сделать правку[pre2] METHOD LDblClick( nRowPix, nColPix, nKeyFlags ) CLASS TSBrowse LOCAL nClickRow := ::GetTxtRow( nRowPix ), ; nCol := ::nAtColActual( nColPix ), ; uPar1 := nRowPix, ; uPar2 := nColPix ... ELSEIF nClickRow == -2 .AND. ::lDrawSpecHd // .AND. ::aColumns[ nCol ]:lEditSpec IF ::aColumns[ nCol ]:lEditSpec IF ::lAutoSearch .OR. ::lAutoFilter ::nColSpecHd := Min( iif( nCol <= ::nFreeze, ::nFreeze + 1, ::nAtCol( nColPix ) ), Len( ::aColumns ) ) ::PostMsg( WM_KEYDOWN, VK_RETURN, 0 ) RETURN 0 ENDIF ELSEIF ::bLDblClick != NIL Eval( ::bLDblClick, uPar1, uPar2, nKeyFlags, Self ) ENDIF ... [/pre2] НО это проверять надо, сделай у себя для пробы

Andrey: Спасибо ! Попробую ! Как бороться с утечкой памяти при использовании картинок ? Если я сделаю так: [pre2] oBrw:Cargo := oHmgData() oBrw:Cargo:hArrDown := LoadImage("Arrow_down") oBrw:Cargo:hArrUp := LoadImage("Arrow_up") [/pre2] Нужно ли потом удалять эти объекты ? Или при закрытии окна все картинки с объекта oBrw - "убьются" сами ?

SergKis: Andrey пишет Нужно ли потом удалять эти объекты ? Обязательно надо удалять из своих хранилищ Для тсб переменных хранения handle картинок удаление автоматом при разрушении объекта, см. метод METHOD Destroy() CLASS TSBrowse oBrw:Cargo := oHmgData() oBrw:Cargo:hArrDown := LoadImage("Arrow_down") oBrw:Cargo:hArrUp := LoadImage("Arrow_up") В тсб есть свое хранилище (само освобождается) oBrw:aBitMaps и в колонке тоже (см. пример Tsb_BitMaps)[pre2] oBrw:GetColumn( "FLD6" ):lBitMap := .T. oBrw:GetColumn( "FLD6" ):aBitMaps := { LoadImage( ".\RES\edit_delete.bmp" ), ; LoadImage( ".\RES\edit_cancel.bmp" ) } oBrw:GetColumn( "FLD7" ):lBitMap := .T. oBrw:aBitMaps := { LoadImage( ".\RES\flag_bel.bmp" ), ; LoadImage( ".\RES\flag_en.bmp" ), ; LoadImage( ".\RES\flag_kaz.bmp" ), ; LoadImage( ".\RES\flag_ru.bmp" ), ; LoadImage( ".\RES\flag_ua.bmp" ), ; StockBmp( 7 ), ; StockBmp( 6 ) ; } [/pre2]

Andrey: SergKis пишет: oBrw:aBitMaps := { LoadImage( ".\RES\flag_bel.bmp" ), ; LoadImage( ".\RES\flag_en.bmp" ), ; LoadImage( ".\RES\flag_kaz.bmp" ), ; LoadImage( ".\RES\flag_ru.bmp" ), ; LoadImage( ".\RES\flag_ua.bmp" ), ; StockBmp( 7 ), ; StockBmp( 6 ) ; } Не совсем удобно помнить картинки по номерам. Так можно делать ? [pre2] oBrw:Cargo:hFlagEn := oBrw:aBitMaps[2] oBrw:Cargo:hFlagKa := oBrw:aBitMaps[3] oBrw:Cargo:hFlagRu := oBrw:aBitMaps[4][/pre2]

SergKis: Andrey пишет Не совсем удобно помнить картинки по номерам. Так можно делать ? Конечно можно, с мнемоникой удобнее и безопаснее работать, чем с номером элемента.

Haz: Andrey пишет: Как бороться с утечкой памяти Стандартно , когда hBitmap уже не нужен делаем DeleteObiect hBitmap ). В большинстве случаев при закрытии бровса объекты удаляются автоматически, гораздо хуже ситуация когда hBitmap это результат выполнения блока hBitmap := { || LoadImage( ) } и грузит картинку с диска. Столкнулся с этой ситуацией сделав браузер предпросмотра картинок на основе tsb по массиву. При долгом скроле и больших размерах превью в ячейке бровса память просто горит. Приходится отслеживать видимый диапазон бровса и убивать все hBitmap вне этого диапазона. Сам tsb это не умеет. :uBmpCell := {|| ... LoadImage() ...} это пожалуй самый проблемный способ с точки зрения жора памяти. Тк при прорисовке ячейки всегда создается новый объект , не освобождая предыдущий созданный. И этот объект живет во время жизни бровса. Пролистал 10 000 строк и получил в памяти 10 000 хендлов, пролистал обратно и их уже 20 000. Все решается просто, но нужно не забывать об этом.

Dima: Haz пишет: :uBmpCell := {|| ... LoadImage() ...} это пожалуй самый проблемный способ с точки зрения жора памяти Игорь так мы это уже проходили несколько лет назад , когда в моей проге были вот такие же утечки памяти. Поэтому в этом массивчике я храню хендлы а не LoadImage()

Andrey: Картинка в ENUMERATOR поставилась. Клик мышки правый/левый в ENUMERATOR отрабатывается. Спасибо БОЛЬШОЕ Сергей ! Надо бы Григорию код добавить в h_tbrowse.prg [pre2]METHOD LButtonDown( nRowPix, nColPix, nKeyFlags ) CLASS TSBrowse ... ELSEIF lSpecHd .AND. ::lEditableHd ... ::lMChange := lMChange ::DrawHeaders() ELSEIF lSpecHd .AND. ::aColumns[ nAtCol ]:bSLClicked != NIL //!!! Eval( ::aColumns[ nAtCol ]:bSLClicked, uPar1, uPar2, ::nAt, Self ) ENDIF METHOD LDblClick( nRowPix, nColPix, nKeyFlags ) CLASS TSBrowse .... #endif ELSEIF nClickRow == -2 .AND. ::lDrawSpecHd //!!! .AND. ::aColumns[ nCol ]:lEditSpec IF ::aColumns[ nCol ]:lEditSpec .and. ( ::lAutoSearch .OR. ::lAutoFilter ) ::nColSpecHd := Min( iif( nCol <= ::nFreeze, ::nFreeze + 1, ::nAtCol( nColPix ) ), Len( ::aColumns ) ) ::PostMsg( WM_KEYDOWN, VK_RETURN, 0 ) RETURN 0 ENDIF IF ::bLDblClick != NIL Eval( ::bLDblClick, uPar1, uPar2, nKeyFlags, Self ) ENDIF ENDIF[/pre2]

Haz: Dima пишет: Игорь так мы это уже проходили несколько лет назад , когда в моей проге были вот такие же утечки Дим, помню. Я про случай когда хендлов очень много , а за хендлами реальный объем сжираемой памяти . Один из последних тестировал 10 000 хендлов и 1 гиг в памяти.

Andrey: В ТСБ есть методы: [pre2] METHOD DrawFooters() METHOD DrawSuper() METHOD DrawHeaders()[/pre2] А как перерисовать новую картинку для ENUMERATOR ? Есть такой метод ?



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