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

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

Andrey: Схема расчёта итогов на лету, после установки фильтра на базу. Может кому будет интересно. Т.е. набираем буквы в поиске, и получаем итого в подвале таблицы. Спасибо ОГРОМНОЕ Сергею. [pre2]* Построение таблицы справочника/поиск по буквам и подсчёт итогов "на лету" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1) LOCAL aFldSum := {"F3", "F4"} // поля базы числовые !!! ... DbSelectArea(cAls) aItogo := Itogo_Dbf(aFldSum, Alias(), .T.) // расчёт итого по базе DEFINE WINDOW Report AT .... ; ON INIT _wPost( 0) ; ON RELEASE _wSend(90) ... This.Cargo := oHmgData() ; owc := This.Cargo // для окна создаем объект без переменных (условно пустой) owc:aFldSum := aFldSum // для подвала таблицы - итого owc:nCount := aItogo[1] owc:aItogo := aItogo[2] owc:aReturn := {} // для возврата выбранных значений ... DEFINE TBROWSE oRpt OBJ oRpt AT nY, nX ALIAS cAls .... ; ... ; ON INIT {|ob| myTsbInit( ob ) } // настройки таблицы - смотреть ниже myTsbTune(oRpt) // настроить myTsbColor(oRpt,oBrw) // цвета изменить myTsbKeys(oRpt) // обработка клавиш // не должно быть нигде, кроме события ! myTsbItogo() // показ подвала END TBROWSE ON END {|ob| ob:SetNoHoles(), ob:SetFocus() } This.Cargo:oRpt := oRpt // положить объект oRpt (таблицу) на окно // GetBox в подвале таблицы - можно сделать и через меню @ nY-nG, nX+nG GETBOX GB_Find OBJ oGet WIDTH nW-nG HEIGHT nH VALUE space(30) ; PICTURE "@K" NOTABSTOP INVISIBLE ; ON LOSTFOCUS {|| This.Cargo := .F., This.Value := space(30), This.Hide } ; ON CHANGE {|| iif( Empty( This.Cargo ), NIL, Search_TSB( ThisWindow.Object, .T. ) ) } ; ON INIT {|| This.Cargo := .T. } This.Cargo:oGet := oGet This.Cargo:cGet := "GB_Find" // запомнить для дальнейшего использования /////////////////////////////////// o := This.Object o:Event( 0, {|ow| _wPost(22, ow) } ) // инициализация после построения окна o:Event( 22, {|ow| myTsbItogo(ow) } ) // итого refresh o:Event( 90, {| | aReturn := (This.Cargo):aReturn } ) // возврат LOCAL aReturn o:Event( 99, {|ow| ow:Release() } ) END WINDOW RETURN aReturn 2) // GetBox в подвале таблицы STATIC FUNCTION Search_TSB(oWnd, aWait) // поиск по базе LOCAL oRpt, cVal, cGet, aItg Default oWnd := ThisWindow.Object Default aWait := .F. oRpt := oWnd:Cargo:oRpt cGet := oWnd:Cargo:cGet // это "GB_Find" IF !Empty(aWait) IF HB_ISLOGICAL(aWait) aWait := "Расчёт ИТОГОВ ..." ENDIF // нельзя срабатывает LOSGFOCUS getbox //WaitWindow( aWait, .T. , 600, 16, NIL, BLUE, App.Cargo:aBClrMain ) ENDIF SET WINDOW THIS TO oWnd This.&(cGet).Show cVal := Trim( This.&(cGet).Value ) SET WINDOW THIS TO oRpt:FilterFTS( cVal, .T. ) // Empty(cVal) обработка внутри метода aItg := Itogo_Dbf(oWnd:Cargo:aFldSum, oRpt:cAlias) // расчёты итого oWnd:Cargo:nCount := aItg[1] oWnd:Cargo:aItogo := aItg[2] // нельзя срабатывает LOSGFOCUS getbox //IF !Empty(aWait) ; WaitWindow() //ENDIF _wSend( 22, oWnd ) // вывод в подвал //но можно и //_wPost( 22, oWnd ) // вывод в подвал RETURN .T. 3) // расчёт итого по базе STATIC FUNCTION Itogo_Dbf(aFld, cAls, aWait) // расчёты итого LOCAL nLen := 0, nRec, aItg, aPos, nPos LOCAL nOld := Select(), nCnt := 0, nSum Default cAls := Alias(), aWait := .F. IF !Empty(aWait) IF HB_ISLOGICAL(aWait) aWait := "Wait processing ..." ENDIF WaitWindow( aWait, .T. , 600, 16, NIL, BLUE, App.Cargo:aBClrMain ) ENDIF dbSelectArea( cAls ) nRec := RecNo() aItg := Array(Len(aFld)) ; aFill(aItg, 0) aPos := {} ; AEval(aFld, {|cn| AAdd(aPos, FieldPos(cn)) }) DO EVENTS GO TOP DO WHILE ! EOF() nCnt++ DO EVENTS FOR EACH nPos IN aPos IF nPos > 0 .and. HB_ISNUMERIC( nSum := FieldGet( nPos ) ) aItg[ hb_EnumIndex(nPos) ] += nSum ENDIF NEXT SKIP ENDDO DbGoTo( nRec ) ; DO EVENTS IF !Empty(aWait) ; WaitWindow() ENDIF dbSelectArea( nOld ) ; DO EVENTS RETURN { nCnt, aItg } 4) STATIC FUNCTION myTsbItogo( oWnd ) // подвал - ТОЛЬКО показ LOCAL aItg := oWnd:Cargo:aItogo Local oRpt := oWnd:Cargo:oRpt oRpt:aColumns[1]:cFooting := {|nc,ob| nc := ob:nLen, iif( Empty(nc), "", hb_NtoS(nc) ) } oRpt:aColumns[3]:cFooting := {|nc | nc := aItg[1], iif( Empty(nc), "", hb_NtoS(nc) ) } oRpt:aColumns[4]:cFooting := {|nc | nc := aItg[2], iif( Empty(nc), "", hb_NtoS(nc) ) } oRpt:Cargo:cKeyLang := '('+KB_LANG()+')' // -> util_keychar.prg oRpt:aColumns[5]:cFooting := oRpt:Cargo:cKeyLang oRpt:DrawFooters() ; DO EVENTS RETURN Nil[/pre2]

Andrey: Открываю базу, устанавливаю индекс, делаю SCOPE на базу. После правки (ENTER) ячейки - теряется SCOPE... Почему ? Что там хитрого сделано после правки ячейки ?

SergKis: Andrey пишет После правки (ENTER) ячейки - теряется SCOPE... Почему ? Что там хитрого сделано после правки ячейки ? При создании тсб надо ставить правильный тэг индекса, тсб его удерживает, если не используешь привязку тэгов к колонкам.


Andrey: SergKis пишет: При создании тсб надо ставить правильный тэг индекса, тсб его удерживает, если не используешь привязку тэгов к колонкам. Да кто же знал об этом ... Спасибо БОЛЬШОЕ ! Заработало !

gfilatov2002: Andrey пишет: Да кто же знал об этом В твоей библиотеке TsbViewer есть такая функция [pre2]FUNCTION myDbIndexChange(cTitle, oBrw) LOCAL aRet, nIndx, cOrd aRet := Tbrowse_MenuIndex(cTitle, oBrw) IF LEN(aRet) > 0 nIndx := aRet[1] cOrd := aRet[2] DbSelectArea(oBrw:cAlias) DbSetOrder(nIndx) oBrw:uLastTag := (oBrw:cAlias)->( OrdName(nIndx) ) // без этого индекс слетает oBrw:Reset() oBrw:Refresh(.T.) oBrw:GoTop() DO EVENTS ENDIF oBrw:Setfocus() RETURN NIL [/pre2]Обрати внимание на комментарий

Andrey: gfilatov2002 пишет: Обрати внимание на комментарий Это я помню и делал с этим. В новом примере, который сбоил - использовал ТОЛЬКО один индекс со SCOPE Из-за этого и не тащил oBrw:uLastTag := (oBrw:cAlias)->( OrdName(nIndx) )

Andrey: Когда делаю oBrw:Enabled(.F.) остаётся не закрашенная колонка. Это можно исправить в исходниках ? Или дайте как это можно сделать ручками, пробовал сам, у меня не получилось.

SergKis: Andrey пишет В новом примере, который сбоил - использовал ТОЛЬКО один индекс со SCOPE Из-за этого и не тащил oBrw:uLastTag := (oBrw:cAlias)->( OrdName(nIndx) ) Его не надо тащить в такой ситуации, надо ставить сразу нужный тэг индекса, т.е. dbSelectArea(cAls) OrdSetFocus("MY_TAG") ... DEFINE TBROWSE ... или oBrw := _TBrowse(...) Далее можно, если надо, этот и другие тэги закреплять за колонками для DublClick-а по Header колонки и переключения тэгов показа тсб. oBrw:uLastTag самому надо вести при самостоятельном переключении тэгов, не используя механизм тсб и метод oBrw:SetOrder( nColumn )

Andrey: SergKis пишет: Его не надо тащить в такой ситуации, надо ставить сразу нужный тэг индекса Да я понял ! Спасибо ! Что насчёт - Поста N: 7746 ? Как закрасить SELECTOR ?

gfilatov2002: Andrey пишет: Как закрасить SELECTOR ? FUNCTION Tbrowse_Customization( oBrw, oTsb ) // донастройка таблицы ... // Левый верхний + нижний уголок - specialаselector header background color oBrw:nClrSelectorHdBack := nClrNoDbf

SergKis: gfilatov2002 Это о другом, надо править метод Enabled [pre2] METHOD Enabled( lEnab ) CLASS TSBrowse LOCAL nI DEFAULT lEnab := .T. IF ValType( lEnab ) == "L" IF ! lEnab IF ::lEnabled ::aOldEnabled := { ::hBrush, {}, ::nClrPane, {}, ::nClrLine, } IF ::lSelector .and. ::lDrawSpecHd ::aOldEnabled[6] := ::nClrSpcHdBack ENDIF FOR nI := 1 TO Len( ::aColumns ) AAdd( ::aOldEnabled[ 2 ], ::aColumns[ nI ]:Clone() ) ::aColumns[ nI ]:SaveColor() NEXT IF ::lDrawSuperHd AEval( ::aSuperHead, {| AS | AAdd( ::aOldEnabled[ 4 ], { AS[ 4 ], AS[ 5 ], AS[ 11 ] } ) } ) ENDIF IF ! Empty( ::oPhant ) ::oPhant:SaveColor() ::oPhant:nClrHeadBack := ::nCLR_HGRAY ::oPhant:nClrFootBack := ::nCLR_HGRAY ENDIF ENDIF ::lEnabled := .F. ::SetColor( { 2 }, { ::nCLR_HGRAY } ) ::SetColor( { 3, 4 }, { ::nCLR_GRAY, ::nCLR_HGRAY } ) ::SetColor( { 9, 10 }, { ::nCLR_GRAY, ::nCLR_HGRAY } ) ::SetColor( { 16, 17 }, { ::nCLR_GRAY, ::nCLR_HGRAY } ) ::SetColor( { 18, 19 }, { ::nCLR_GRAY, ::nCLR_HGRAY } ) ::nClrPane := ::nCLR_HGRAY ::nClrLine := ::nCLR_Lines ::hBrush := CreateSolidBrush( GetRed( ::nClrPane ), GetGreen( ::nClrPane ), GetBlue( ::nClrPane ) ) IF ::lSelector .and. ::lDrawSpecHd ::nClrSpcHdBack := ::nCLR_HGRAY ENDIF ELSE 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() } ) DeleteObject( ::hBrush ) ::hBrush := ::aOldEnabled[ 1 ] ::nClrPane := ::aOldEnabled[ 3 ] ::nClrLine := ::aOldEnabled[ 5 ] IF ::lDrawSuperHd AEval( ::aOldEnabled[ 4 ], {| AS, ns | ::aSuperHead[ ns ][ 4 ] := AS[ 1 ], ; ::aSuperHead[ ns ][ 5 ] := AS[ 2 ], ; ::aSuperHead[ ns ][ 11 ] := AS[ 3 ] } ) ENDIF ENDIF IF ::lSelector .and. ::lDrawSpecHd ::nClrSpcHdBack := ::aOldEnabled[6] ENDIF ENDIF ::lEnabled := .T. ENDIF ::Refresh() ENDIF RETURN 0 [/pre2] Пример тут https://TransFiles.ru/s7vog Клавиша F1 -> :Enabled(.F.) Клавиша F2 -> :Enabled(.T.) PS. В методе :DrawHeaders() делается следующее по селектору[pre2] IF nI == nBegin .AND. ::lSelector nClrBacks := iif( ::lDrawSpecHd, ::nClrSpcHdBack, nClrHeadBack ) ELSE nClrBacks := iif( ::nPhantom == -1, ATail( ::aColumns ):nClrSpcHdBack, nClrPane ) ENDIF [/pre2]

gfilatov2002: SergKis пишет: надо править метод Enabled Понял, уже поправил. Благодарю за помощь



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