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

gfilatov2002: Haz пишет: без этой проверки , если lCheckBox истина и колонка скрыта, в соседнюю выдает мусор от битмапа Благодарю за помощь Поправил, конечно...

Haz: Григорий Пропущено указание алиаса и метод работает только если oBrw:cAlias является текущей METHOD LoadFields() ... nE := If( aNames == Nil, n, ( ::cAlias )->(FieldPos( aNames[ n ] )) )

gfilatov2002: Haz пишет: Пропущено указание алиаса Снова благодарю за исправление Кстати, эта опечатка есть и у автора библиотеки...


Haz: gfilatov2002 пишет: Кстати, эта опечатка есть и у автора не важно у кого есть , важно что исправлено я минут 15 тупил почему то работает то нет, пока не полез в сырцы

gfilatov2002: Haz пишет: пока не полез в сырцы Сейчас обнаружил, что не могу прикрутить подсказки к датам в Вашем календаре, т.к. при динамическом определении данных в массиве у блока кода cTooltip параметр номер колонки nCol всегда равен номеру последнего столбца. При обычном присвоении массива типа oBrw3:SetArray( aItems ), все работает нормально. Может гляните, что нужно поправить, у меня НЕ выходит...

Haz: gfilatov2002 пишет: параметр номер колонки nCol всегда равен номеру последнего столбца. я это через макроподстановку делаю [pre2] oBrw:aColumns[ i ]:bData := &( "{|| GetDate( " + NTOC( i ) + ")}") [/pre2] Выложите сюда кусок кода , может что придумаем вместе

gfilatov2002: Haz пишет: Выложите сюда кусок кода Да весь код - это одна строка oBrw:cToolTip := {|oBr,nCol,nRow| if( nRow > 0, "Col ="+str(nCol,3)+" Row ="+str(nRow,3), ) } который выдает для любой колонки Col = 7, а ряд показывает правильно...

Haz: gfilatov2002 пишет: Да весь код - это одна строка ок, сейчас что нибудь сделаю

Haz: Все из-за замороженных колонок В примере они заморожены все 7 , ::nFreeze := 7 но lLockFreeze := FALSE Это чтоб бровс не панарамировался при перемещении к последней колонке При показе cToolTip используется вычисление колонки исходя из позиции мыши, при этом автоматом прибавляется замороженный кусок это метод ::nAtCol() . Либо менять его , либо тут [pre2] METHOD MouseMove( nRowPix, nColPix, nKeyFlags ) CLASS TSBrowse Local nI, nIcon, lHeader, lMChange, nFirst, nLast, nDestCol, ; cMsg := ::cMsg, ; nColPixPos := 0, ; lFrozen := .F., ; nColumn := Max( 1, ::nAtCol( nColPix, .T. ) ), ; [/pre2]

Haz: Haz пишет: nColumn := Max( 1, ::nAtCol( nColPix, .T. ) ), ; Но это тоже не правильно нужно переделывать ::nAtCol() , это он дурит при наличии заморозки. Пока не готов сказать как, думаю ... Посмотрел внимательнее - беда всеже в методе MouseMove , там нужно именно nColumn := Max( 1, ::nAtCol( nColPix, .T. ) ), тогда номер видимой колонки определяется правильно ( именно видимой на экране а не порядковый в бровсе ) Дальше нужно менять логику получения номера колонки бровса из видимого на экране с учетом фриз и скрола и скрытых Опять есть над чем думать ...

SergKis: Haz переделывать nAtCol не надо, надо сделать так: [pre2] METHOD MouseMove( nRowPix, nColPix, nKeyFlags ) CLASS TSBrowse ... nRowLine := ::GetTxtRow( nRowPix ), ctooltip, nCol ... If ::nToolTip != nColumn .or. nRowLine != ::nToolTipRow ctooltip := ::aColumns[ nColumn ]:cToolTip If Valtype( ctooltip ) == "B" nCol := ::nAtCol(nColPix, .T.) ctooltip := Eval( ctooltip, Self, nCol, nRowLine ) EndIf ... If ::nToolTip != nColumn .or. nRowLine != ::nToolTipRow ctooltip := ::cToolTip If Valtype( ctooltip ) == "B" nCol := ::nAtCol(nColPix, .T.) ctooltip := Eval( ctooltip, Self, nCol, nRowLine ) EndIf [/pre2] этого достаточно

SergKis: PS через ncol := Max(1, ::nAtCol(...)) может лучше

Haz: SergKis пишет: переделывать nAtCol не надо, надо сделать так: тоже переделал MouseMove .... nCol := ::nAtCol(nColPix, .T.) показывает видимую ( как мы видим ) на экране колонку и не понимаем на взгляд сколько заморожено и сколько скрыто скролом ( ушло влево за границу ) или сколько из того что видим скрыты логически т.е. ::HideColumn() соответственно nCol не равен номеру колонки бровса. В примере календяря заморозил 1 колонку и скролом спрятал вторую потом проверял что кажет Может я не прав , но по сырцам ::nAtCol зависим от ::nColPos я попробывал рассчитать заново [pre2] Сначала всю заморозку For nI := 1 To ::nFreeze IF nColPix > nColPixPos nColumn := nI END nColPixPos += ::GetColSizes()[ nI ] Next Потом с учетом видимости For nI := 1 To ::nColCount() IF nI > ::nFreeze IF nColPix > nColPixPos nColumn ++ END nColPixPos += IF(::IsColVis2(nI), ::GetColSizes()[ nI ], 0 ) END End [/pre2] Вроде кажет правильно , nColumn равен номеру колонки бровса

SergKis: У себя сделал:[pre2] METHOD MouseMove( nRowPix, nColPix, nKeyFlags ) CLASS TSBrowse ... Local ctooltip, nCol := Max( 1, ::nAtCol( nColPix, .T. ) ) ... If ( lHeader := nRowLine == 0 ) .and. ! Empty( ::aColumns ) .and. ; ! Empty( ::aColumns[ nCol ]:cToolTip ) If ::nToolTip != nCol .or. nRowLine != ::nToolTipRow ctooltip := ::aColumns[ nCol ]:cToolTip If Valtype(ctooltip) == "B" ctooltip := Eval(ctooltip, Self, nCol, nRowLine) EndIf SetToolTip ( ::hWnd , ctooltip , ::hToolTip ) SysRefresh() ::nToolTipRow := nRowLine EndIf ::nToolTip := nCol Else If ::nToolTip != nCol .or. nRowLine != ::nToolTipRow ctooltip := ::cToolTip If Valtype(ctooltip) == "B" ctooltip := Eval(ctooltip, Self, nCol, nRowLine) EndIf SetToolTip ( ::hWnd , ctooltip , ::hToolTip ) SysRefresh() ::nToolTipRow := nRowLine endif ::nToolTip := nCol EndIf ... [/pre2] заменил nColumn на nCol, что касается ToolTip - вроде нормально ... пример: click here

Haz: Сергей А такой тест проходит ? В примере календяря заморозил 1 колонку и скролом спрятал вторую потом проверял что кажет или скинь полный код MouseMove , проверю

SergKis: Haz пишет:скинь полный код MouseMove тут: [pre2] * ============================================================================ * METHOD TSBrowse:MouseMove() Version 9.0 Nov/30/2009 * ============================================================================ METHOD MouseMove( nRowPix, nColPix, nKeyFlags ) CLASS TSBrowse Local nI, nIcon, lHeader, lMChange, nFirst, nLast, nDestCol, ; cMsg := ::cMsg, ; nColPixPos := 0, ; lFrozen := .F., ; nColumn := Max( 1, ::nAtCol( nColPix ) ), ; nRowLine := ::GetTxtRow( nRowPix ), ctooltip Local nCol := Max( 1, ::nAtCol( nColPix, .T. ) ) Default ::lMouseDown := .F., ; ::lNoMoveCols := .F., ; ::lDontChange := .F. If ::lIconView If ( nIcon := ::nAtIcon( nRowPix, nColPix ) ) != 0 If ::nIconPos != 0 .and. ::nIconPos != nIcon ::DrawIcon( ::nIconPos ) EndIf ::nIconPos := nIcon ::DrawIcon( nIcon, .T. ) CursorHand() Return 0 EndIf EndIf If ::nFreeze > 0 For nI := 1 To ::nFreeze nColPixPos += ::GetColSizes()[ nI ] Next If nColPix < nColPixPos lFrozen := .T. EndIf EndIf If ( lHeader := ( nRowLine == 0 ) ) .and. ! Empty( ::aColumns ) .and. ; ! Empty( ::aColumns[ nCol ]:cToolTip ) If ::nToolTip != nCol .or. nRowLine != ::nToolTipRow ctooltip := ::aColumns[ nCol ]:cToolTip If Valtype( ctooltip ) == "B" ctooltip := Eval( ctooltip, Self, nCol, nRowLine ) EndIf SetToolTip( ::hWnd, ctooltip, ::hToolTip ) SysRefresh() ::nToolTipRow := nRowLine EndIf ::nToolTip := nCol Else If ::nToolTip != nCol .or. nRowLine != ::nToolTipRow ctooltip := ::cToolTip If Valtype( ctooltip ) == "B" ctooltip := Eval( ctooltip, Self, nCol, nRowLine ) EndIf SetToolTip( ::hWnd, ctooltip, ::hToolTip ) SysRefresh() ::nToolTipRow := nRowLine EndIf ::nToolTip := nCol EndIf lHeader := ( ::GetTxtRow( nRowPix ) == 0 .or. ::GetTxtRow( nRowPix ) == -2 ) If ! ::lGrasp .and. ( lFrozen .or. ! lHeader .or. ! ::lMChange ) // don't allow MouseMove to drag/resize columns // unless in header row and not in frozen zone CursorArrow() If ::lCaptured If ::lLineDrag ::VertLine() ::lLineDrag := .F. EndIf ReleaseCapture() ::lColDrag := ::lCaptured := ::lMouseDown := .F. ElseIf ::lDontChange CursorStop() Return 0 EndIf lMChange := ::lMChange // save it for restore ::lMChange := .F. If ::lCellBrw .and. ! Empty( ::aColumns[ Max( 1, ::nAtCol( nColPix ) ) ]:cMsg ) ::cMsg := ::aColumns[ Max( 1, ::nAtCol( nColPix ) ) ]:cMsg Else ::cMsg := cMsg EndIf ::cMsg := If( ValType( ::cMsg ) == "B", Eval( ::cMsg, Self, Max( 1, ::nAtCol( nColPix ) ) ), ::cMsg ) ::Super:MouseMove( nRowPix, nColPix, nKeyFlags ) ::lMChange := lMChange ::cMsg := cMsg Return 0 EndIf If ::lMChange .and. ! ::lNoMoveCols .and. ! ::lDontChange If lHeader If ! Empty( ::aSuperHead ) .and. !::lLineDrag nFirst := 0 nLast := 0 Aeval( ::aSuperHead, { | aSup, nCol | nFirst := If( ::nDragCol >= aSup[1] .and. ::nDragCol <= aSup[ 2 ],nCol,nFirst ), ; nLast := max(nLast,aSup[ 2 ])} ) nDestCol := ::nAtCol( nColPix ) if nLast < nDestCol nLast := nFirst+1 else Aeval( ::aSuperHead, { | aSup, nCol | nlast := If( nDestCol >= aSup[1] .and. nDestCol <= aSup[ 2 ],nCol,nlast )} ) endif If nLast != nFirst ::lGrasp := .F. CursorHand() ::lColDrag := ::lCaptured := ::lMouseDown := .F. endif endif If ::lGrasp // avoid dragging between header & rows ::lGrasp := .F. CursorArrow() // restore default cursor EndIf If ::lColDrag CursorSize() Else If ::lLineDrag ::VertLine( nColPix ) CursorWE() Else If AScan( ::GetColSizes(), { | nColumn | nColPixPos += nColumn, ; nColPix >= nColPixPos - 2 .and. nColPix <= nColPixPos + 2 }, ::nColPos ) != 0 CursorWE() Else CursorHand() EndIf EndIf EndIf ElseIf ::lGrasp ::lCaptured := ::lColDrag := .F. // to avoid collision with header/column dragging ::lMouseDown := .T. // has to be down until dragging finishes ::Super:MouseMove( nRowPix, nColPix, nKeyFlags ) Else CursorArrow() EndIf Else If ::lDontChange CursorStop() Else CursorArrow() EndIf EndIf Return 0 [/pre2]

Haz: Cергей, проверил не катит 1 В исходнике календаря пропиши oBrw:nFreeze := 1 oBrw:lLockFreeze := TRUE 2 Запусти и кнопкой вправо до упора пока не появится пустое поле 3 Поставь грызуна на колонку "СР " покажет 2 На экране видим мы ее второй но в бровсе она третья

SergKis: Игорь, конечно, с учетом видимости, ты прав, будет врать. Решить можно новым методом или вводить еще параметр в nAtCol (менять алгоритм nAtCol опасно - задействован сильно кругом)

Haz: SergKis пишет: (менять алгоритм nAtCol опасно - задействован сильно кругом) А что думаешь про смену алгоритма ::MouseMove как я предложил ( расчет номера колонки двумя циклами , можно в один свести ) Ведь там у тебя nColumn, это именно номер колонки бровса. и кроме как в тултипе нигде не используется ( есть в блоке , но там как параметр - локальная переменная ) а ::nAtCol менять не надо [pre2] * ============================================================================ * METHOD TSBrowse:MouseMove() Version 9.0 Nov/30/2009 * ============================================================================ METHOD MouseMove( nRowPix, nColPix, nKeyFlags ) CLASS TSBrowse Local nI, nIcon, lHeader, lMChange, nFirst, nLast, nDestCol, ; cMsg := ::cMsg, ; nColPixPos := 0, ; lFrozen := .F., ; // nColumn := Max( 1, ::nAtCol( nColPix , .T.) ), ; nRowLine := ::GetTxtRow( nRowPix ), ctooltip Default ::lMouseDown := .F., ; ::lNoMoveCols := .F., ; ::lDontChange := .F. If ::lIconView If ( nIcon := ::nAtIcon( nRowPix, nColPix ) ) != 0 If ::nIconPos != 0 .and. ::nIconPos != nIcon ::DrawIcon( ::nIconPos ) EndIf ::nIconPos := nIcon ::DrawIcon( nIcon, .T. ) CursorHand() Return 0 EndIf EndIf If ::nFreeze > 0 For nI := 1 To ::nFreeze IF nColPix > nColPixPos nColumn := nI END nColPixPos += ::GetColSizes()[ nI ] Next If nColPix < nColPixPos lFrozen := .T. EndIf EndIf For nI := 1 To ::nColCount() IF nI > ::nFreeze IF nColPix > nColPixPos nColumn ++ END nColPixPos += IF(::IsColVis2(nI), ::GetColSizes()[ nI ], 0 ) END End If ( lHeader := ( nRowLine == 0 ) ) .and. ! Empty( ::aColumns ) .and. ; ! Empty( ::aColumns[ nColumn ]:cToolTip ) If ::nToolTip != nColumn .or. nRowLine != ::nToolTipRow ctooltip := ::aColumns[ nColumn ]:cToolTip If Valtype( ctooltip ) == "B" ctooltip := Eval( ctooltip, Self, nColumn, nRowLine ) EndIf SetToolTip( ::hWnd, ctooltip, ::hToolTip ) SysRefresh() ::nToolTipRow := nRowLine EndIf ::nToolTip := nColumn Else If ::nToolTip != nColumn .or. nRowLine != ::nToolTipRow ctooltip := ::cToolTip If Valtype( ctooltip ) == "B" ctooltip := Eval( ctooltip, Self, nColumn, nRowLine ) EndIf SetToolTip( ::hWnd, ctooltip, ::hToolTip ) SysRefresh() ::nToolTipRow := nRowLine EndIf ::nToolTip := nColumn EndIf lHeader := ( ::GetTxtRow( nRowPix ) == 0 .or. ::GetTxtRow( nRowPix ) == -2 ) If ! ::lGrasp .and. ( lFrozen .or. ! lHeader .or. ! ::lMChange ) // don't allow MouseMove to drag/resize columns // unless in header row and not in frozen zone CursorArrow() If ::lCaptured If ::lLineDrag ::VertLine() ::lLineDrag := .F. EndIf ReleaseCapture() ::lColDrag := ::lCaptured := ::lMouseDown := .F. ElseIf ::lDontChange CursorStop() Return 0 EndIf lMChange := ::lMChange // save it for restore ::lMChange := .F. If ::lCellBrw .and. ! Empty( ::aColumns[ Max( 1, ::nAtCol( nColPix ) ) ]:cMsg ) ::cMsg := ::aColumns[ Max( 1, ::nAtCol( nColPix ) ) ]:cMsg Else ::cMsg := cMsg EndIf ::cMsg := If( ValType( ::cMsg ) == "B", Eval( ::cMsg, Self, Max( 1, ::nAtCol( nColPix ) ) ), ::cMsg ) ::Super:MouseMove( nRowPix, nColPix, nKeyFlags ) ::lMChange := lMChange ::cMsg := cMsg Return 0 EndIf If ::lMChange .and. ! ::lNoMoveCols .and. ! ::lDontChange If lHeader If ! Empty( ::aSuperHead ) .and. !::lLineDrag nFirst := 0 nLast := 0 Aeval( ::aSuperHead, { | aSup, nCol | nFirst := If( ::nDragCol >= aSup[1] .and. ::nDragCol <= aSup[ 2 ],nCol,nFirst ), ; nLast := max(nLast,aSup[ 2 ])} ) nDestCol := ::nAtCol( nColPix ) if nLast < nDestCol nLast := nFirst+1 else Aeval( ::aSuperHead, { | aSup, nCol | nlast := If( nDestCol >= aSup[1] .and. nDestCol <= aSup[ 2 ],nCol,nlast )} ) endif If nLast != nFirst ::lGrasp := .F. CursorHand() ::lColDrag := ::lCaptured := ::lMouseDown := .F. endif endif If ::lGrasp // avoid dragging between header & rows ::lGrasp := .F. CursorArrow() // restore default cursor EndIf If ::lColDrag CursorSize() Else If ::lLineDrag ::VertLine( nColPix ) CursorWE() Else If AScan( ::GetColSizes(), { | nColumn | nColPixPos += nColumn, ; nColPix >= nColPixPos - 2 .and. nColPix <= nColPixPos + 2 }, ::nColPos ) != 0 CursorWE() Else CursorHand() EndIf EndIf EndIf ElseIf ::lGrasp ::lCaptured := ::lColDrag := .F. // to avoid collision with header/column dragging ::lMouseDown := .T. // has to be down until dragging finishes ::Super:MouseMove( nRowPix, nColPix, nKeyFlags ) Else CursorArrow() EndIf Else If ::lDontChange CursorStop() Else CursorArrow() EndIf EndIf Return 0 [/pre2]

SergKis: Haz пишет:А что думаешь про смену алгоритма ::MouseMove По мне лучше метод (думаю пригодиться в использовании). У себя сделал так на базе твоего алгоритма:[pre2] METHOD nAtColReal( nColPixel ) CLASS TSBrowse Local nColumn := 0, ; aSizes := ::GetColSizes(), ; nI := 0, ; nColPix := 0 For nI := 1 To ::nFreeze IF nColPixel > nColPix nColumn := nI ENDIF nColPix += aSizes[ nI ] Next For nI := 1 To ::nColCount() IF nI > ::nFreeze IF nColPixel > nColPix nColumn ++ ENDIF nColPix += IF(::IsColVis2(nI), aSizes[ nI ], 0 ) ENDIF Next Return nColumn тогда в MouseMove Local nCol := Max( 1, ::nAtColReal( nColPix ) ) ... [/pre2] у себя проверил - нормальненько вроде



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