Автор | Сообщение |
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
[только новые]
|
|
gfilatov2002
|
| moderator
|
Пост N: 920
Зарегистрирован: 11.02.10
|
|
Отправлено: 11.04.16 17:17. Заголовок: Haz пишет: без этой..
Haz пишет: цитата: | без этой проверки , если lCheckBox истина и колонка скрыта, в соседнюю выдает мусор от битмапа |
| Благодарю за помощь Поправил, конечно...
| |
|
Haz
|
| |
Пост N: 876
Зарегистрирован: 20.02.11
|
|
Отправлено: 12.04.16 11:57. Заголовок: Григорий еще поправочка
Григорий Пропущено указание алиаса и метод работает только если oBrw:cAlias является текущей METHOD LoadFields() ... nE := If( aNames == Nil, n, ( ::cAlias )->(FieldPos( aNames[ n ] )) )
| |
|
gfilatov2002
|
| moderator
|
Пост N: 921
Зарегистрирован: 11.02.10
|
|
Отправлено: 12.04.16 14:20. Заголовок: Haz пишет: Пропущен..
Haz пишет: цитата: | Пропущено указание алиаса |
| Снова благодарю за исправление Кстати, эта опечатка есть и у автора библиотеки...
| |
|
Haz
|
| |
Пост N: 877
Зарегистрирован: 20.02.11
|
|
Отправлено: 12.04.16 15:03. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Кстати, эта опечатка есть и у автора |
| не важно у кого есть , важно что исправлено я минут 15 тупил почему то работает то нет, пока не полез в сырцы
| |
|
gfilatov2002
|
| moderator
|
Пост N: 922
Зарегистрирован: 11.02.10
|
|
Отправлено: 12.04.16 15:12. Заголовок: Haz пишет: пока не ..
Haz пишет: Сейчас обнаружил, что не могу прикрутить подсказки к датам в Вашем календаре, т.к. при динамическом определении данных в массиве у блока кода cTooltip параметр номер колонки nCol всегда равен номеру последнего столбца. При обычном присвоении массива типа oBrw3:SetArray( aItems ), все работает нормально. Может гляните, что нужно поправить, у меня НЕ выходит...
| |
|
Haz
|
| |
Пост N: 878
Зарегистрирован: 20.02.11
|
|
Отправлено: 12.04.16 15:19. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | параметр номер колонки nCol всегда равен номеру последнего столбца. |
| я это через макроподстановку делаю oBrw:aColumns[ i ]:bData := &( "{|| GetDate( " + NTOC( i ) + ")}") Выложите сюда кусок кода , может что придумаем вместе
| |
|
gfilatov2002
|
| moderator
|
Пост N: 923
Зарегистрирован: 11.02.10
|
|
Отправлено: 12.04.16 15:26. Заголовок: Haz пишет: Выложите..
Haz пишет: Да весь код - это одна строка цитата: | oBrw:cToolTip := {|oBr,nCol,nRow| if( nRow > 0, "Col ="+str(nCol,3)+" Row ="+str(nRow,3), ) } |
| который выдает для любой колонки Col = 7, а ряд показывает правильно...
| |
|
Haz
|
| |
Пост N: 879
Зарегистрирован: 20.02.11
|
|
Отправлено: 12.04.16 15:28. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Да весь код - это одна строка |
| ок, сейчас что нибудь сделаю
| |
|
Haz
|
| |
Пост N: 880
Зарегистрирован: 20.02.11
|
|
Отправлено: 12.04.16 16:00. Заголовок: Все из-за замороженн..
Все из-за замороженных колонок В примере они заморожены все 7 , ::nFreeze := 7 но lLockFreeze := FALSE Это чтоб бровс не панарамировался при перемещении к последней колонке При показе cToolTip используется вычисление колонки исходя из позиции мыши, при этом автоматом прибавляется замороженный кусок это метод ::nAtCol() . Либо менять его , либо тут 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. ) ), ;
| |
|
Haz
|
| |
Пост N: 881
Зарегистрирован: 20.02.11
|
|
Отправлено: 12.04.16 16:04. Заголовок: Haz пишет: nColumn..
Haz пишет: цитата: | nColumn := Max( 1, ::nAtCol( nColPix, .T. ) ), ; |
| Но это тоже не правильно нужно переделывать ::nAtCol() , это он дурит при наличии заморозки. Пока не готов сказать как, думаю ... Посмотрел внимательнее - беда всеже в методе MouseMove , там нужно именно nColumn := Max( 1, ::nAtCol( nColPix, .T. ) ), тогда номер видимой колонки определяется правильно ( именно видимой на экране а не порядковый в бровсе ) Дальше нужно менять логику получения номера колонки бровса из видимого на экране с учетом фриз и скрола и скрытых Опять есть над чем думать ...
| |
|
SergKis
|
| постоянный участник
|
Пост N: 936
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.04.16 16:27. Заголовок: Haz переделывать nA..
Haz переделывать nAtCol не надо, надо сделать так: 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 этого достаточно
| |
|
|
SergKis
|
| постоянный участник
|
Пост N: 937
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.04.16 16:30. Заголовок: PS через ncol := Max..
PS через ncol := Max(1, ::nAtCol(...)) может лучше
| |
|
Haz
|
| |
Пост N: 882
Зарегистрирован: 20.02.11
|
|
Отправлено: 12.04.16 16:52. Заголовок: SergKis пишет: пере..
SergKis пишет: цитата: | переделывать nAtCol не надо, надо сделать так: |
| тоже переделал MouseMove .... nCol := ::nAtCol(nColPix, .T.) показывает видимую ( как мы видим ) на экране колонку и не понимаем на взгляд сколько заморожено и сколько скрыто скролом ( ушло влево за границу ) или сколько из того что видим скрыты логически т.е. ::HideColumn() соответственно nCol не равен номеру колонки бровса. В примере календяря заморозил 1 колонку и скролом спрятал вторую потом проверял что кажет Может я не прав , но по сырцам ::nAtCol зависим от ::nColPos я попробывал рассчитать заново Сначала всю заморозку 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 Вроде кажет правильно , nColumn равен номеру колонки бровса
| |
|
SergKis
|
| постоянный участник
|
Пост N: 938
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.04.16 17:07. Заголовок: У себя сделал: METHO..
У себя сделал: 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 ... заменил nColumn на nCol, что касается ToolTip - вроде нормально ... пример: click here
| |
|
Haz
|
| |
Пост N: 886
Зарегистрирован: 20.02.11
|
|
Отправлено: 12.04.16 17:12. Заголовок: Сергей А такой тест ..
Сергей А такой тест проходит ? В примере календяря заморозил 1 колонку и скролом спрятал вторую потом проверял что кажет или скинь полный код MouseMove , проверю
| |
|
SergKis
|
| постоянный участник
|
Пост N: 940
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.04.16 17:26. Заголовок: Haz пишет:скинь полн..
Haz пишет: цитата: | скинь полный код MouseMove |
| тут: Скрытый текст
* ============================================================================ * 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
|
| |
|
Haz
|
| |
Пост N: 887
Зарегистрирован: 20.02.11
|
|
Отправлено: 12.04.16 17:35. Заголовок: SergKis пишет: тут:..
Cергей, проверил не катит 1 В исходнике календаря пропиши oBrw:nFreeze := 1 oBrw:lLockFreeze := TRUE 2 Запусти и кнопкой вправо до упора пока не появится пустое поле 3 Поставь грызуна на колонку "СР " покажет 2 На экране видим мы ее второй но в бровсе она третья
| |
|
SergKis
|
| постоянный участник
|
Пост N: 941
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.04.16 17:41. Заголовок: Игорь, конечно, с уч..
Игорь, конечно, с учетом видимости, ты прав, будет врать. Решить можно новым методом или вводить еще параметр в nAtCol (менять алгоритм nAtCol опасно - задействован сильно кругом)
| |
|
Haz
|
| |
Пост N: 888
Зарегистрирован: 20.02.11
|
|
Отправлено: 12.04.16 17:49. Заголовок: SergKis пишет: (мен..
SergKis пишет: цитата: | (менять алгоритм nAtCol опасно - задействован сильно кругом) |
| А что думаешь про смену алгоритма ::MouseMove как я предложил ( расчет номера колонки двумя циклами , можно в один свести ) Ведь там у тебя nColumn, это именно номер колонки бровса. и кроме как в тултипе нигде не используется ( есть в блоке , но там как параметр - локальная переменная ) а ::nAtCol менять не надо * ============================================================================ * 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
| |
|
SergKis
|
| постоянный участник
|
Пост N: 942
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.04.16 18:22. Заголовок: Haz пишет:А что дума..
Haz пишет: цитата: | А что думаешь про смену алгоритма ::MouseMove |
| По мне лучше метод (думаю пригодиться в использовании). У себя сделал так на базе твоего алгоритма: 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 ) ) ... у себя проверил - нормальненько вроде
| |
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|
|