Автор | Сообщение |
|
| постоянный участник
|
Пост 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:....
|
|
|
Ответов - 192
, стр:
1
2
3
4
5
6
7
8
9
10
All
[только новые]
|
|
|
| постоянный участник
|
Пост N: 4135
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.06.22 09:05. Заголовок: alex_II тогда попад..
alex_II тогда попадете в выделенный цветом код, см. Скрытый текст выше, т.к. двойной клик выполняет IF ValType( ::bDataEval( ::aColumns[ nCol ] ) ) == "L" .AND. ; ::aColumns[ nCol ]:lCheckBox // virtual checkbox ::PostMsg( WM_CHAR, VK_SPACE, 0 )
|
|
|
|
| |
Пост N: 164
Зарегистрирован: 12.07.06
|
|
Отправлено: 09.06.22 09:30. Заголовок: Пардон, может я что-..
Пардон, может я что-то не догоняю Как выбраться из этой ситуации?
|
|
|
|
| постоянный участник
|
Пост N: 4136
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.06.22 10:24. Заголовок: alex_II Если объект..
alex_II Если объект oBrw Public\Private\Static, то PREEDIT {|| oBrw:lCheckBoxAllReturn := preMod('lm1')} ; POSTEDIT {|| oBrw:lCheckBoxAllReturn := .T. } Если oBrw Local, то надо исп. внутренние переменные параметры блоков кода :bPrevEdit и :bPostEdit
|
|
|
|
| |
Пост N: 165
Зарегистрирован: 12.07.06
|
|
Отправлено: 09.06.22 13:01. Заголовок: Редактирование логического поля
SergKis Большое спасибо за помощь, всё заработало корректно Только маленькая поправка: PREEDIT {|| oBrw:lCheckBoxAllReturn := preMod('lm1')} но это уже детали.
|
|
|
|
| |
Пост N: 227
Зарегистрирован: 17.10.05
|
|
Отправлено: 12.07.22 15:04. Заголовок: После того, как я в..
После того, как я включил блок кода ::bFilter, метод GotoRec( nRec, nRowPos ) Игоря Назарова стал работать некорректно. Сам крутил - не получилось. Игорь, если будет возможность - гляньте, плз.
|
|
|
|
| постоянный участник
|
Пост N: 4139
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.07.22 15:55. Заголовок: krutoff пишет я вклю..
krutoff пишет цитата: | я включил блок кода ::bFilter |
| Используйте лучше методы: :FilterData( cFilter, lBottom, lFocus ) :FilterFTS( cFind, lUpper, lBottom, lFocus, lAll )
|
|
|
|
| |
Пост N: 228
Зарегистрирован: 17.10.05
|
|
Отправлено: 12.07.22 17:09. Заголовок: SergKis Сергей, спа..
SergKis Сергей, спасибо за ответ. Но в моей ситуации я хотел уйти от DbSetFilter, чтобы Seek работало по всей базе без фильтра (тут мне важны все записи), а через TSBrowse показывать фильтрованые записи.
|
|
|
|
| постоянный участник
|
Пост N: 4140
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.07.22 17:53. Заголовок: krutoff пишет Но в м..
krutoff пишет цитата: | Но в моей ситуации я хотел уйти от DbSetFilter, чтобы Seek работало по всей базе без фильтра (тут мне важны все записи),а через TSBrowse показывать фильтрованые записи. |
| Используя :bFilter вам надо исп. все установки окружения тсб в ручном режиме (:nLen входящих строк в просмотр ...), если глянуть метод DbSkipper( nToSkip ) видно - все делается руками, т.е. 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 по мне, :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 ... на осн. базу можно показывать нужные поля, т.е. ваш просмотр
|
|
|
|
| |
Пост N: 229
Зарегистрирован: 17.10.05
|
|
Отправлено: 13.07.22 11:21. Заголовок: SergKis Сергей, спа..
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
|
|
|
|
|
| постоянный участник
|
Пост N: 4141
Зарегистрирован: 17.02.12
|
|
Отправлено: 17.07.22 22:53. Заголовок: krutoff пишет Поправ..
krutoff пишет цитата: | Поправил метод GotoRec( nRec, nRowPos ) -> включил ::DbSkipper Протестировал. Все работает! |
| Попробуйте пример Tsb_addrecord cо старым\родным вариантом :Gotorec(...) и вариант с вашими поправками. Родной метод работает после кнопки "AddRecord" (курсор, например, на 3-й строке) правильно, ваш вариант - нет
|
|
|
|
| moderator
|
Пост N: 2050
Зарегистрирован: 11.02.10
|
|
Отправлено: 21.07.22 12:00. Заголовок: SergKis пишет: Родн..
SergKis пишет: цитата: | Родной метод работает после кнопки "AddRecord" (курсор, например, на 3-й строке) правильно, ваш вариант - нет |
| Я уже поправил код Олега (тестировал на том же примере Tsb_addrecord). Хочу включить эти изменения в новую сборку.
|
|
|
|
|
| постоянный участник
|
Пост N: 7288
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.02.23 09:15. Заголовок: Заметил у себя две б..
Заметил у себя две бяки в ТСБ. 1) Если делаем так в ON INIT окна oBrw:Enabled( .F. ) // блокировка таблицы ...удаляем столбцы, ставим свои размеры колонок oBrw:Enabled( .T. ) // разблокировка таблицы То в ТСБ размер колонок и сами колонки восстанавливаются ДО ПЕРВОНАЧАЛЬНЫХ значений. Это так должно быть ? Тогда это не есть хорошо, т.к. построение окна с таблицей занимает время и нужна блокировка всего окна от шаловливых ручек юзера. 2) Использую у себя условную индексацию. Очень удобно. Но на больших базах 1 тыс.записей и выше при смене текущего индекса курсор ТСБ впадает в ступорт, вешает ТСБ. До сих пор лечу это таким кодом после создания условного индекса: // ------------- добавка обязательна ---------- 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 ) ) // без этого индекс слетает А можно этот код добавить сразу в ТСБ ? Раньше, года 2-3 назад такого не было, ТСБ работал без этого.
|
|
|
|
| постоянный участник
|
Пост N: 4201
Зарегистрирован: 17.02.12
|
|
Отправлено: 04.02.23 10:22. Заголовок: Andrey пишет Если де..
Andrey пишет цитата: | Если делаем так в ON INIT окна ...удаляем столбцы, ставим свои размеры колонок |
| На мой взгляд это неправильно, надо формировать список рабочих колонок на уровне DEFINE TBROWSE ... ...удаляем столбцы, ставим свои размеры колонок END TBROWSE или делать не обрамляя методом :Enabled, т.к., если смотреть метод :Enabled, то увидишь сохранение\восстановление данных колонок ... 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() } ) ... цитата: | Использую у себя условную индексацию |
| что это ? Все в мире относительно
|
|
|
|
| постоянный участник
|
Пост N: 7289
Зарегистрирован: 12.09.06
|
|
Отправлено: 09.02.23 12:15. Заголовок: Вопрос по ТСБ, возмё..
Вопрос по ТСБ, возмём пример Tsb_composite ! Для сортировки ПО СТОЛБЦАМ там нужно создавать ОДИН индекс по колонкам. 1) Почему нужно делать ТОЛЬКО ОДИН файл ? При использование нескольких индексных файлов сортировка не работает. 2) Если мне надо свой индекс сделать, то как тогда сделать чтобы сортировка работала ? Типа STR(KCity)+UPPER(STREET) Раньше (года 2 назад) сортировка работала по нескольким индексным файлам, теперь нет. Что нужно прикрутить в ТСБ чтобы вернулась прежняя сортировка ?
|
|
|
|
| постоянный участник
|
Пост N: 7302
Зарегистрирован: 12.09.06
|
|
Отправлено: 21.02.23 03:53. Заголовок: Опять непонятка в ТС..
Опять непонятка в ТСБ с массивом. Таблица построена, делаю сортировку по колонке с датой вот так: 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 И нифига не получаю - т.е. правильной сортировки нет ! Вот так в таблице: Как победить эту сортировку ?
|
|
|
|
| постоянный участник
|
Пост N: 7303
Зарегистрирован: 12.09.06
|
|
Отправлено: 21.02.23 18:58. Заголовок: Танцы с бубном показ..
Танцы с бубном показали, что использование виртуальной колонки в ТСБ с массивом - ПРОТИВОПОКАЗАНО !!! Т.е. в ТСБ НЕ НАДО использовать COLNUMBER { 1, 20 } - если нужна сортировка по колонке. Не помогают всякие ухищрения типа: IF oBrw:nColumn("ARRAYNO") > 0 nCol -= 1 ENDIF IF oBrw:lSelector nCol -= 1 ENDIF Придётся делать как и в 2015 году - свою собственную виртуальную колонку и отслеживать самому нумерацию этой колонки.
|
|
|
|
| постоянный участник
|
Пост N: 7321
Зарегистрирован: 12.09.06
|
|
Отправлено: 13.03.23 09:25. Заголовок: Всем привет ! Что по..
Всем привет ! Что посоветуете делать для хранения и показа картинки в ТСБ ? Нужно показывать в одной колонке ТСБ картинки из базы. Картинки небольшие BMP или PNG размером 48х48 или 64х64. Есть 2 варианта: загонять все картинки в массив и показывать в ТСБ, или записывать эти картинки в поле базы, а потом уже показывать. Количество записей в базе может быть и 100 записей, а может и 10-20 тыс. Как показывать картинки из массива - знаю: 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 ) А как делать показ напрямую из мемо-поля не делал или уже забыл.... Подскажите как это сделать ?
|
|
|
|
| moderator
|
Пост N: 2111
Зарегистрирован: 11.02.10
|
|
Отправлено: 13.03.23 12:38. Заголовок: Andrey пишет: как д..
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
|
|
|
|
| постоянный участник
|
Пост N: 7322
Зарегистрирован: 12.09.06
|
|
Отправлено: 13.03.23 13:08. Заголовок: Есть ещё такой приме..
Есть ещё такой пример - MiniGUI\SAMPLES\Advanced\Tsb_BitMaps Но там не совсем понятно, грузятся картинки из файла. А как сделать показ из мемо-поля уже записанную туда картинку ?
|
|
|
|
| постоянный участник
|
Пост N: 7323
Зарегистрирован: 12.09.06
|
|
Отправлено: 13.03.23 13:56. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Можно попробовать использовать BLOB мемо-поля для хранения картинок |
| Спасибо ! Сделал пример и загрузил в базу картинки (bmp). Как показать эти картинки в ТСБ - не знаю ? Пример тут - https://cloud.mail.ru/public/FvKA/sFktSMppQ и сделан на базе примера MiniGUI\SAMPLES\Advanced\Tsb_BitMaps Народ, отзовитесь ... Как это можно реализовать ?
|
|
|
Ответов - 192
, стр:
1
2
3
4
5
6
7
8
9
10
All
[только новые]
|
|