Автор | Сообщение |
Vlad04
|
| постоянный участник
|
Пост N: 420
Зарегистрирован: 13.10.05
|
|
Отправлено: 19.12.13 18:16. Заголовок: TsBrowse в Минигуи (продолжение)
TsBrows определяется в виде строки ПАРМЕТРОВ объекта и их значений К примеру цитата: | 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 |
| Здесь я собрал параметры из разных tBrows Можно или нет и какие парметры заменить выражением ( и каким) ? oBrw2:.... oBrw2:....
|
|
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|
Haz
|
| |
Пост N: 1768
Зарегистрирован: 20.02.11
|
|
Отправлено: 10.09.21 12:22. Заголовок: SergKis пишет: Смущ..
SergKis пишет: цитата: | Смущает только default lEditMode := .F. |
| можно оставить по дефолту .T. пример отлично работает
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3870
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.09.21 12:58. Заголовок: Haz пишет можно оста..
Haz пишет цитата: | можно оставить по дефолту .T. |
| Так и сделал. Для примера ничего не изменилось в работе, но править в старом коде придется по любому FUNCTION PrevEdit(xVal, oBrw) LOCAL oCell := oBrw:GetCellInfo(oBrw:nRowPos) LOCAL nY := oCell:nRow //+ oBrw:nHeightHead + 4
|
|
|
gfilatov2002
|
| moderator
|
Пост N: 1925
Зарегистрирован: 11.02.10
|
|
Отправлено: 10.09.21 13:06. Заголовок: SergKis пишет: прав..
SergKis пишет: цитата: | править в старом коде придется по любому |
| Да. Например, сломался режим добавления по клавише F2 в примере из папки \SAMPLES\Advanced\ Tsb_addrecord_3
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3871
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.09.21 13:24. Заголовок: gfilatov2002 пишет ..
gfilatov2002 пишет цитата: | сломался режим добавления по клавише F2 в примере из папки |
| Правится легко, но геморой остается в др. текстах STATIC FUNCTION Add_Rec( oBrw ) ... nRow := 0 //:nTop + GetWindowRow( hWnd ) - GetBorderHeight() nCol := 0 //:nLeft + GetWindowCol( hWnd ) - GetBorderWidth () + 1 Может метод другой сделать GetCellRect, как Игорь ф-ю называл или GetCellSize
|
|
|
Haz
|
| |
Пост N: 1769
Зарегистрирован: 20.02.11
|
|
Отправлено: 10.09.21 13:36. Заголовок: SergKis пишет: но ..
SergKis пишет: цитата: | но править в старом коде придется по любому |
| может еще один параметр ввести в GetCellInfo(....lParentPos ) hb_default( @lParentPos, .f.) определяет учитывать ли координаты парент окна
|
|
|
Haz
|
| |
Пост N: 1770
Зарегистрирован: 20.02.11
|
|
Отправлено: 10.09.21 13:37. Заголовок: SergKis пишет: Може..
SergKis пишет: цитата: | Может метод другой сделать GetCellRect, как Игорь ф-ю называл или GetCellSize |
| возможно это выход
|
|
|
gfilatov2002
|
| moderator
|
Пост N: 1926
Зарегистрирован: 11.02.10
|
|
Отправлено: 10.09.21 14:12. Заголовок: SergKis пишет: мето..
SergKis пишет: цитата: | метод другой сделать GetCellSize |
| Пошел по этому пути. Теперь пример работает нормально
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3872
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.09.21 14:19. Заголовок: gfilatov2002 пишет П..
gfilatov2002 пишет Тогда есть смысл убрать lEditMode и строки с использованием ::aEditCellAdjust из метода Добавил метод GetCellSize, убрал lEditMode и строки с использованием ::aEditCellAdjust из него Пример Tsb_addrecord_3 нормально В своем примере (выше) использовал новый метод, вместо GetCellInfo, все работает OK!
|
|
|
gfilatov2002
|
| moderator
|
Пост N: 1927
Зарегистрирован: 11.02.10
|
|
Отправлено: 10.09.21 14:25. Заголовок: SergKis пишет: убра..
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
|
| постоянный участник
|
Пост N: 7104
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.11.21 09:10. Заголовок: Всем привет ! А можн..
Всем привет ! А можно в ENUMERATOR (это где номера колонок стоят) поставить иконку/картинку слева ? И возможно ли отслеживать нажатие мышкой на нём ? Хотелось бы сделать фильтрацию как в Экселе, там есть красивое решение.
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3928
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.11.21 13:43. Заголовок: Andrey TSCOLUMN.PRG..
Andrey TSCOLUMN.PRG // 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 ) ... PS Возможно, надо сделать правку 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 ... НО это проверять надо, сделай у себя для пробы
|
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 7105
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.11.21 15:23. Заголовок: Спасибо ! :sm36: ..
Спасибо ! Попробую ! Как бороться с утечкой памяти при использовании картинок ? Если я сделаю так: oBrw:Cargo := oHmgData() oBrw:Cargo:hArrDown := LoadImage("Arrow_down") oBrw:Cargo:hArrUp := LoadImage("Arrow_up") Нужно ли потом удалять эти объекты ? Или при закрытии окна все картинки с объекта oBrw - "убьются" сами ?
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3929
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.11.21 15:32. Заголовок: Andrey пишет Нужно л..
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) 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 ) ; }
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 7106
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.11.21 16:49. Заголовок: SergKis пишет: ..
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 ) ; } |
| Не совсем удобно помнить картинки по номерам. Так можно делать ? oBrw:Cargo:hFlagEn := oBrw:aBitMaps[2] oBrw:Cargo:hFlagKa := oBrw:aBitMaps[3] oBrw:Cargo:hFlagRu := oBrw:aBitMaps[4]
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3930
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.11.21 17:43. Заголовок: Andrey пишет Не совс..
Andrey пишет цитата: | Не совсем удобно помнить картинки по номерам. Так можно делать ? |
| Конечно можно, с мнемоникой удобнее и безопаснее работать, чем с номером элемента.
|
|
|
Haz
|
| |
Пост N: 1795
Зарегистрирован: 20.02.11
|
|
Отправлено: 06.11.21 11:54. Заголовок: Andrey пишет: Как б..
Andrey пишет: цитата: | Как бороться с утечкой памяти |
| Стандартно , когда hBitmap уже не нужен делаем DeleteObiect hBitmap ). В большинстве случаев при закрытии бровса объекты удаляются автоматически, гораздо хуже ситуация когда hBitmap это результат выполнения блока hBitmap := { || LoadImage( ) } и грузит картинку с диска. Столкнулся с этой ситуацией сделав браузер предпросмотра картинок на основе tsb по массиву. При долгом скроле и больших размерах превью в ячейке бровса память просто горит. Приходится отслеживать видимый диапазон бровса и убивать все hBitmap вне этого диапазона. Сам tsb это не умеет. :uBmpCell := {|| ... LoadImage() ...} это пожалуй самый проблемный способ с точки зрения жора памяти. Тк при прорисовке ячейки всегда создается новый объект , не освобождая предыдущий созданный. И этот объект живет во время жизни бровса. Пролистал 10 000 строк и получил в памяти 10 000 хендлов, пролистал обратно и их уже 20 000. Все решается просто, но нужно не забывать об этом.
|
|
|
Dima
|
| |
Пост N: 7467
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.11.21 14:25. Заголовок: Haz пишет: :uBmpCel..
Haz пишет: цитата: | :uBmpCell := {|| ... LoadImage() ...} это пожалуй самый проблемный способ с точки зрения жора памяти |
| Игорь так мы это уже проходили несколько лет назад , когда в моей проге были вот такие же утечки памяти. Поэтому в этом массивчике я храню хендлы а не LoadImage()
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 7109
Зарегистрирован: 12.09.06
|
|
Отправлено: 06.11.21 15:23. Заголовок: Картинка в ENUMERATO..
Картинка в ENUMERATOR поставилась. Клик мышки правый/левый в ENUMERATOR отрабатывается. Спасибо БОЛЬШОЕ Сергей ! Надо бы Григорию код добавить в h_tbrowse.prg 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
|
|
|
Haz
|
| |
Пост N: 1796
Зарегистрирован: 20.02.11
|
|
Отправлено: 06.11.21 21:28. Заголовок: Dima пишет: Игорь т..
Dima пишет: цитата: | Игорь так мы это уже проходили несколько лет назад , когда в моей проге были вот такие же утечки |
| Дим, помню. Я про случай когда хендлов очень много , а за хендлами реальный объем сжираемой памяти . Один из последних тестировал 10 000 хендлов и 1 гиг в памяти.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 7112
Зарегистрирован: 12.09.06
|
|
Отправлено: 08.11.21 00:43. Заголовок: В ТСБ есть методы: ..
В ТСБ есть методы: METHOD DrawFooters() METHOD DrawSuper() METHOD DrawHeaders() А как перерисовать новую картинку для ENUMERATOR ? Есть такой метод ?
|
|
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|