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

Ответов - 181, стр: 1 2 3 4 5 6 7 8 9 10 All

SergKis: alex_II тогда попадете в выделенный цветом код, см. Скрытый текст выше, т.к. двойной клик выполняет[pre2] IF ValType( ::bDataEval( ::aColumns[ nCol ] ) ) == "L" .AND. ; ::aColumns[ nCol ]:lCheckBox // virtual checkbox ::PostMsg( WM_CHAR, VK_SPACE, 0 ) [/pre2]

alex_II: Пардон, может я что-то не догоняю Как выбраться из этой ситуации?

SergKis: alex_II Если объект oBrw Public\Private\Static, то PREEDIT {|| oBrw:lCheckBoxAllReturn := preMod('lm1')} ; POSTEDIT {|| oBrw:lCheckBoxAllReturn := .T. } Если oBrw Local, то надо исп. внутренние переменные параметры блоков кода :bPrevEdit и :bPostEdit


alex_II: SergKis Большое спасибо за помощь, всё заработало корректно Только маленькая поправка: PREEDIT {|| oBrw:lCheckBoxAllReturn := preMod('lm1')} но это уже детали.

krutoff: После того, как я включил блок кода ::bFilter, метод GotoRec( nRec, nRowPos ) Игоря Назарова стал работать некорректно. Сам крутил - не получилось. Игорь, если будет возможность - гляньте, плз.

SergKis: krutoff пишет я включил блок кода ::bFilter Используйте лучше методы: :FilterData( cFilter, lBottom, lFocus ) :FilterFTS( cFind, lUpper, lBottom, lFocus, lAll )

krutoff: SergKis Сергей, спасибо за ответ. Но в моей ситуации я хотел уйти от DbSetFilter, чтобы Seek работало по всей базе без фильтра (тут мне важны все записи), а через TSBrowse показывать фильтрованые записи.

SergKis: krutoff пишет Но в моей ситуации я хотел уйти от DbSetFilter, чтобы Seek работало по всей базе без фильтра (тут мне важны все записи),а через TSBrowse показывать фильтрованые записи. Используя :bFilter вам надо исп. все установки окружения тсб в ручном режиме (:nLen входящих строк в просмотр ...), если глянуть метод DbSkipper( nToSkip ) видно - все делается руками, т.е.[pre2] ELSEIF nToSkip < 0 .AND. !( ::cAlias )->( Bof() ) // going up WHILE nSkipped > nToSkip ( ::cAlias )->( dbSkip( -1 ) ) IF ::bFilter != NIL .AND. !( ::cAlias )->( Bof() ) While ! Eval( ::bFilter ) .AND. !( ::cAlias )->( Bof() ) ( ::cAlias )->( dbSkip( -1 ) ) ENDDO IF ( ::cAlias )->( Bof() ) ( ::cAlias )->( dbGoto( nRecNo ) ) RETURN nSkipped ENDIF ENDIF IF ( ::cAlias )->( Bof() ) ( ::cAlias )->( dbGoTop() ) EXIT ENDIF nSkipped-- ENDDO [/pre2] по мне, :GotoRec(...) не имеет к :bFilter никакого отношения. Почему бы после Seek не накапливать RecNo() в объекте контейнере (oRec := oHmgData() ; iif( dbSeek(...), oRec:Set(RecNo(), RecNo()), ) ) или в строке (cRec := "," ; cRec += iif(dbSeek(...), hb_ntos(RecNo())+',', "")) (oRec или cRec private\public). потом ставить :FilterData("oRec:Get(RecNo(), 0) > 0",...) или на строку :FilterData("','+hb_ntos(RecNo())+',' $ cRec", ...) PS Если из RecNo() или ID записей сделать в mem:file.dbf , то тсб простым способом, с SET RELATION ... на осн. базу можно показывать нужные поля, т.е. ваш просмотр

krutoff: SergKis Сергей, спасибо за подсказку! Поправил метод GotoRec( nRec, nRowPos ) -> включил ::DbSkipper Протестировал. Все работает! METHOD GotoRec( nRec, nRowPos ) CLASS TSBrowse LOCAL cAlias LOCAL nSkip LOCAL n LOCAL nRecSave LOCAL lRet := .F. LOCAL lReCount := .F. IF ::lIsDbf lRet := .T. cAlias := ::cAlias ::nLastPos := ( cAlias )->( RecNo() ) IF HB_ISLOGICAL( nRowPos ) .AND. nRowPos .AND. ::nLen > ::nRowCount() nRecSave := ::nLastPos ( cAlias )->( dbGoto( nRec ) ) ::DbSkipper( ::nRowCount() - ::nRowPos ) IF ( cAlias )->( Eof() ) Eval( ::bGoBottom ) ::nRowPos := ::nRowCount() DO WHILE ::nRowPos > 1 .AND. ( cAlias )->( RecNo() ) != nRec ::DbSkipper( -1 ) ::nRowPos-- ENDDO ELSE ( cAlias )->( dbGoto( nRecSave ) ) ENDIF ENDIF hb_default( @nRowPos, ::nRowPos ) ( cAlias )->( dbGoto( nRec ) ) nSkip := ABS( ::DbSkipper( -(nRowPos-1) ) ) nRecSave := ( cAlias )->( RecNo() ) nRowPos := Min( nSkip + 1, nRowPos ) ( cAlias )->( dbGoto( nRec ) ) n := ::DbSkipper( ::nRowCount()-nRowPos ) IF n < ::nRowCount() - nRowPos lReCount := .T. ENDIF ( cAlias )->( dbGoto( nRecSave ) ) ::nRowPos := nRowPos ::Refresh( lReCount, lReCount ) ::DbSkipper( nSkip ) ::ResetVscroll() IF ::bChange != NIL Eval( ::bChange, Self, 0 ) ENDIF ::lHitTop := ::lHitBottom := .F. SysRefresh() ENDIF RETURN lRet

SergKis: krutoff пишет Поправил метод GotoRec( nRec, nRowPos ) -> включил ::DbSkipper Протестировал. Все работает! Попробуйте пример Tsb_addrecord cо старым\родным вариантом :Gotorec(...) и вариант с вашими поправками. Родной метод работает после кнопки "AddRecord" (курсор, например, на 3-й строке) правильно, ваш вариант - нет

gfilatov2002: SergKis пишет: Родной метод работает после кнопки "AddRecord" (курсор, например, на 3-й строке) правильно, ваш вариант - нет Я уже поправил код Олега (тестировал на том же примере Tsb_addrecord). Хочу включить эти изменения в новую сборку.

Andrey: Заметил у себя две бяки в ТСБ. 1) Если делаем так в ON INIT окна [pre2] oBrw:Enabled( .F. ) // блокировка таблицы ...удаляем столбцы, ставим свои размеры колонок oBrw:Enabled( .T. ) // разблокировка таблицы [/pre2] То в ТСБ размер колонок и сами колонки восстанавливаются ДО ПЕРВОНАЧАЛЬНЫХ значений. Это так должно быть ? Тогда это не есть хорошо, т.к. построение окна с таблицей занимает время и нужна блокировка всего окна от шаловливых ручек юзера. 2) Использую у себя условную индексацию. Очень удобно. Но на больших базах 1 тыс.записей и выше при смене текущего индекса курсор ТСБ впадает в ступорт, вешает ТСБ. До сих пор лечу это таким кодом после создания условного индекса: [pre2] // ------------- добавка обязательна ---------- nTags := ( oBrw_2:cAlias )->( ordCount() ) oBrw_2:aTags := {} FOR nI := 1 TO nTags AAdd( oBrw_2:aTags, { ( ALIAS() )->( ordName( nI ) ), ( ALIAS() )->( ordKey( nI ) ) } ) NEXT oBrw_2:uLastTag := ( ALIAS() )->( ordName( nTags ) ) // без этого индекс слетает[/pre2] А можно этот код добавить сразу в ТСБ ? Раньше, года 2-3 назад такого не было, ТСБ работал без этого.

SergKis: Andrey пишет Если делаем так в ON INIT окна ...удаляем столбцы, ставим свои размеры колонок На мой взгляд это неправильно, надо формировать список рабочих колонок на уровне DEFINE TBROWSE ... ...удаляем столбцы, ставим свои размеры колонок END TBROWSE или делать не обрамляя методом :Enabled, т.к., если смотреть метод :Enabled, то увидишь сохранение\восстановление данных колонок [pre2] ... IF ::lEnabled ::aOldEnabled := { ::hBrush, {}, ::nClrPane, {}, ::nClrLine } FOR nI := 1 TO Len( ::aColumns ) AAdd( ::aOldEnabled[ 2 ], ::aColumns[ nI ]:Clone() ) ::aColumns[ nI ]:SaveColor() NEXT ... IF ! ::lEnabled FOR nI := 1 TO Len( ::aColumns ) ::aColumns[ nI ]:RestColor() SetColor( , ::aColumns[ nI ]:aColors, nI ) NEXT IF ! Empty( ::oPhant ) ::oPhant:RestColor() ENDIF IF HB_ISARRAY( ::aOldEnabled ) .AND. ! Empty( ::aOldEnabled[ 1 ] ) AEval( ::aOldEnabled[ 2 ], {| oc, nc | ::aColumns[ nc ] := oc:Clone() } ) ... [/pre2]Использую у себя условную индексацию что это ? Очень удобно. Все в мире относительно

Andrey: Вопрос по ТСБ, возмём пример Tsb_composite ! Для сортировки ПО СТОЛБЦАМ там нужно создавать ОДИН индекс по колонкам. 1) Почему нужно делать ТОЛЬКО ОДИН файл ? При использование нескольких индексных файлов сортировка не работает. 2) Если мне надо свой индекс сделать, то как тогда сделать чтобы сортировка работала ? Типа STR(KCity)+UPPER(STREET) Раньше (года 2 назад) сортировка работала по нескольким индексным файлам, теперь нет. Что нужно прикрутить в ТСБ чтобы вернулась прежняя сортировка ?

Andrey: Опять непонятка в ТСБ с массивом. Таблица построена, делаю сортировку по колонке с датой вот так: [pre2]STATIC FUNCTION myTsbSort(oBrw) LOCAL nCol := oBrw:nColumn("NAME_3") LOCAL oCol, lDescend := .F. oBrw:lNoChangeOrd := .F. // включить сортировку oBrw:nColOrder := 4 // поставить значок сортировки по колонке oBrw:SetOrder(nCol, , lDescend) RETURN Nil [/pre2] И нифига не получаю - т.е. правильной сортировки нет ! Вот так в таблице: Как победить эту сортировку ?

Andrey: Танцы с бубном показали, что использование виртуальной колонки в ТСБ с массивом - ПРОТИВОПОКАЗАНО !!! Т.е. в ТСБ НЕ НАДО использовать COLNUMBER { 1, 20 } - если нужна сортировка по колонке. Не помогают всякие ухищрения типа: [pre2] IF oBrw:nColumn("ARRAYNO") > 0 nCol -= 1 ENDIF IF oBrw:lSelector nCol -= 1 ENDIF [/pre2] Придётся делать как и в 2015 году - свою собственную виртуальную колонку и отслеживать самому нумерацию этой колонки.

Andrey: Всем привет ! Что посоветуете делать для хранения и показа картинки в ТСБ ? Нужно показывать в одной колонке ТСБ картинки из базы. Картинки небольшие BMP или PNG размером 48х48 или 64х64. Есть 2 варианта: загонять все картинки в массив и показывать в ТСБ, или записывать эти картинки в поле базы, а потом уже показывать. Количество записей в базе может быть и 100 записей, а может и 10-20 тыс. Как показывать картинки из массива - знаю: [pre2] oBrw:aBitMaps := M->ahPubBmp oBrw:GetColumn(2):lBitMap := .T. // колонка с картинками oBrw:aColumns[2]:uBmpCell := {|| M->ahPubBmp[oBrw:nAt] } oBrw:aColumns[2]:uBmpHead := {|| Nil } oBrw:aColumns[2]:bData := {||Nil} oBrw:aColumns[2]:cData := '{||Nil}' oBrw:aColumns[2]:nAlign := nMakeLong( DT_CENTER, DT_CENTER ) oBrw:aColumns[2]:nHAlign := nMakeLong( DT_CENTER, DT_CENTER )[/pre2] А как делать показ напрямую из мемо-поля не делал или уже забыл.... Подскажите как это сделать ?

gfilatov2002: Andrey пишет: как делать показ напрямую из мемо-поля Можно попробовать использовать BLOB мемо-поля для хранения картинок. В Харборе есть такие функции для этой цели: BLOBDirectExport( <nPointer>, <cTargetFile> [, <kMode>] ) BLOBDirectGet( <nPointer> [, <nStart> [, <nCount> ]] ) BLOBDirectImport( <nOldPointer>, <cSourceFile> ) BLOBDirectPut( [<nOldPointer>], <xBlob> ) BLOBGet( <nFieldNo> [, <nStart> [, <nCount>]] ) BLOBExport( <nFieldNo>, <cTargetFile>, <nMode> ) BLOBImport( <nFieldNo>, <cSourceFile> ) В поставке Минигуи есть рабочий пример в папке \SAMPLES\BASIC\BLOBfiles

Andrey: Есть ещё такой пример - MiniGUI\SAMPLES\Advanced\Tsb_BitMaps Но там не совсем понятно, грузятся картинки из файла. А как сделать показ из мемо-поля уже записанную туда картинку ?

Andrey: gfilatov2002 пишет: Можно попробовать использовать BLOB мемо-поля для хранения картинок Спасибо ! Сделал пример и загрузил в базу картинки (bmp). Как показать эти картинки в ТСБ - не знаю ? Пример тут - https://cloud.mail.ru/public/FvKA/sFktSMppQ и сделан на базе примера MiniGUI\SAMPLES\Advanced\Tsb_BitMaps Народ, отзовитесь ... Как это можно реализовать ?



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