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

Haz: Andrey пишет: А как его поменять можно ? Андрей, переменные есть , но это пустышки. Они нигде не используются, видимо автор так и не дошёл до этого. Цвет скролбара определяется темой виндовс и легких путей его поменять нет (так же как и титл окна ). Можно нарисовать свой класс по скроллбару , где будет обрабатываться цвет и размер, но такой подход потребует пересчета клиентской области окна бровса и корректировки многих методов опирающихся на эти размеры.

Andrey: Понял, спасибо !

Haz: Andrey пишет: Понял, спасибо чуть дописал выше


Haz: Haz пишет: спасибо, посмотрю завтра Сергей посмотрел , попробуй в примере ( который ты правил ) перед тем как щелкнуть в ячейке, сдвинуть окно чуть в сторону . Во всех случаях GetCellInfo не попадет в координаты ( heading, cell, footing ) Нужна привязка к физическому положению парент окна сегодня изобрел это ( физические , а не относительные координаты ячейки на экране , вне зависимости куда двинули окно с бровсем) [pre2] FUNC GetCellRect( oBrw, nRowPos, nCell, lColSpecHd ) LOCAL nI, nStartX := 0, oCol, cBrw LOCAL nRow, nCol, nWidth, nHeight, nRight, nBottom LOCAL lHead := .F., lFoot := .F. LOCAL aRect := {0,0,0,0} LOCAL aRet := {} IF HB_ISLOGICAL( nRowPos ) IF nRowPos ; lHead := .T. ELSE ; lFoot := .T. ENDIF nRowPos := NIL lColSpecHd := .F. ENDIF DEFAULT nRowPos := oBrw:nRowPos, ; nCell := oBrw:nCell, ; lColSpecHd := .F. oCol := oBrw:aColumns[ nCell ] IF oBrw:nFreeze > 0 FOR nI := 1 TO Min( oBrw:nFreeze, nCell - 1 ) nStartX += oBrw:GetColSizes()[ nI ] NEXT ENDIF FOR nI := oBrw:nColPos TO nCell - 1 nStartX += oBrw:GetColSizes()[ nI ] NEXT nStartX-- IF lColSpecHd nRow := oBrw:nHeightHead + oBrw:nHeightSuper + iif( oCol:l3DLook, 2, 0 ) nCol := nStartX + iif( oCol:l3DLook, 2, 0 ) nWidth := oBrw:GetColSizes()[ nCell ] - iif( oCol:l3DLook, 2, 0 ) nHeight := oBrw:nHeightSpecHd - iif( oCol:l3DLook, 1, 1 ) ELSE nRow := nRowPos - 1 nRow := nRow * oBrw:nHeightCell + oBrw:nHeightHead + ; oBrw:nHeightSuper + oBrw:nHeightSpecHd + iif( oCol:l3DLook, 1, 0 ) nCol := nStartX + iif( oCol:l3DLook, 2, 0 ) nWidth := oBrw:GetColSizes()[ nCell ] - iif( oCol:l3DLook, 3, 0 ) nHeight := oBrw:nHeightCell - iif( oCol:l3DLook, 3, 1 ) ENDIF GetWindowRect(oBrw:hWnd, aRect ) nRow := aRect[2] + 1 + oBrw:nHeightHead + oBrw:nHeightSuper + oBrw:nHeightSpecHd + iif( oCol:l3DLook, 2, 0 ) + (oBrw:nRowPos - 1 ) * oBrw:nHeightCell IF lHead nRow := aRect[2] + oBrw:nHeightSuper + iif( oCol:l3DLook, 2, 1 ) nCol := nStartX + iif( oCol:l3DLook, 2, 0 ) nHeight := oBrw:nHeightHead - iif( oCol:l3DLook, 3, 0 ) nWidth := oBrw:GetColSizes()[ nCell ] - iif( oCol:l3DLook, 3, 0 ) ELSEIF lFoot nRow := aRect[2] + _GetClientRect( oBrw:hWnd )[ 4 ] - oBrw:nHeightFoot + iif( oCol:l3DLook, 3, 1 ) nCol := nStartX + iif( oCol:l3DLook, 2, 0 ) nHeight := oBrw:nHeightFoot - iif( oCol:l3DLook, 3, 0 ) nWidth := oBrw:GetColSizes()[ nCell ] - iif( oCol:l3DLook, 3, 0 ) ENDIF nCol := nCol + oBrw:nLeft + aRect[1] -1 nRight := nCol + nWidth -1 nBottom := nRow + nHeight -1 aRet := {nCol, nRow, nRight, nBottom} RETURN aRet [/pre2] лень было для теста в класс заворачивать, а может и незачем. Плюс возвращаемое как по классике в массиве rect {nLeft, nTop, nRight, nBottom} Возвращает именно координаты ячейки ( без учета длинны поля редактирования т.к. это посчитал лишним ) параметры как у GetCellInfo() окно ячейки рисуется так ( плюс не стал пока заморачиваться с потерей фокуса ) [pre2] Func PrevEdit(xVal, oBrw) LOCAL oCell LOCAL oWnd, hWnd LOCAL aRect := {0,0,0,0} SET OOP ON aRect := GetCellRect(oBrw, oBrw:nRowPos) // // aRect := GetCellRect(oBrw, .t.) // // aRect := GetCellRect(oBrw, .F.) // DEFINE WINDOW Cell ; AT aRect[2] , aRect[1] ; WIDTH aRect[3] - aRect[1] + 1 ; HEIGHT aRect[4] - aRect[2] + 1 ; NOCAPTION ; MODAL ; oWnd := ThisWindow.Object hWnd := oWnd:Handle() END WINDOW SetWindowLong(hWnd, GWL_STYLE, WS_BORDER) _DefineHotKey ( "CELL" , 0 , VK_ESCAPE , {|| oWnd:Release() } ) _DefineHotKey ( "CELL" , 0 , VK_RETURN , {|| oWnd:Release() } ) Cell.Activate oBrw:DrawSeLect() return .F. [/pre2] гонял по всякому с 3DLook и без , в заголовках подвалах ячейках и пр . у меня все корректно рисует. Под 3DLook подбирал поправки попиксельно на большом экране

SergKis: Haz пишет:посмотрел , попробуй в примере ( который ты правил ) перед тем как щелкнуть в ячейке, сдвинуть окно чуть в сторону Улыбнуло Столько лет делал и не двигал никогда окно, клиенты похоже тоже. Поправил метод в тсб.[pre2] METHOD GetCellInfo( nRowPos, nCell, lColSpecHd ) CLASS TSBrowse LOCAL nI, nStartX := 0, oCol, cBrw, cForm //, ix LOCAL nRow, nCol, nWidth, nHeight LOCAL lHead := .F., lFoot := .F. LOCAL oCell := TSBcell():New() LOCAL aRect := {0,0,0,0}, y, x GetWindowRect(::hWnd, aRect ) y := aRect[2] + 1 x := aRect[1] + 1 IF HB_ISLOGICAL( nRowPos ) IF nRowPos ; lHead := .T. ELSE ; lFoot := .T. ENDIF nRowPos := NIL lColSpecHd := .F. ENDIF DEFAULT nRowPos := ::nRowPos, ; nCell := ::nCell, ; lColSpecHd := .F. cForm := ::cParentWnd cBrw := ::cControlName oCol := ::aColumns[ nCell ] IF ::nFreeze > 0 FOR nI := 1 TO Min( ::nFreeze, nCell - 1 ) nStartX += ::GetColSizes()[ nI ] NEXT ENDIF FOR nI := ::nColPos TO nCell - 1 nStartX += ::GetColSizes()[ nI ] NEXT IF lColSpecHd nRow := ::nHeightHead + ::nHeightSuper + iif( oCol:l3DLook, 2, 0 ) nCol := nStartX + iif( oCol:l3DLook, 2, 0 ) nWidth := ::GetColSizes()[ nCell ] - iif( oCol:l3DLook, 2, 1 ) nHeight := ::nHeightSpecHd - iif( oCol:l3DLook, 1, -1 ) ELSE nRow := nRowPos - 1 nRow := ( nRow * ::nHeightCell ) + ::nHeightHead + ; ::nHeightSuper + ::nHeightSpecHd + iif( oCol:l3DLook, 2, 0 ) nCol := nStartX + iif( oCol:l3DLook, 2, 0 ) nWidth := ::GetColSizes()[ nCell ] - iif( oCol:l3DLook, 2, 0 ) nHeight := ::nHeightCell - iif( oCol:l3DLook, 1, -1 ) ENDIF IF oCol:nEditWidthDraw > 0 nWidth := oCol:nEditWidthDraw If ! ::lNoVScroll nWidth -= GetVScrollBarWidth() ENDIF ENDIF IF lHead nRow := ::nHeightSuper + iif( oCol:l3DLook, 2, 0 ) + 1 nHeight := ::nHeightHead ELSEIF lFoot nRow := _GetClientRect( ::hWnd )[ 4 ] - ::nHeightFoot + 1 nHeight := ::nHeightFoot ENDIF //ix := GetControlIndex( cBrw, cForm ) //IF _HMG_aControlContainerRow[ ix ] == -1 //nRow += ::nTop - 1 //nCol += ::nLeft //ELSE //nRow += _HMG_aControlRow[ ix ] - 1 //nCol += _HMG_aControlCol[ ix ] //ENDIF nRow += ::aEditCellAdjust[ 1 ] nCol += ::aEditCellAdjust[ 2 ] nWidth += ::aEditCellAdjust[ 3 ] + 2 nHeight += ::aEditCellAdjust[ 4 ] oCell:nRow := nRow + y oCell:nCol := nCol + x oCell:nWidth := nWidth oCell:nHeight := nHeight RETURN oCell Тогда в примере делаем FUNCTION PrevEdit(xVal, oBrw) LOCAL oCell := oBrw:GetCellInfo(oBrw:nRowPos) LOCAL nY := oCell:nRow //+ oBrw:nHeightHead + 4 LOCAL nX := oCell:nCol LOCAL nW := oCell:nWidth LOCAL nH := oCell:nHeight LOCAL oWnd, hWnd LOCAL hOld := _HMG_InplaceParentHandle LOCAL oParent := _WindowObj(oBrw:cParentWnd) _HMG_InplaceParentHandle := oParent:Handle DEFINE WINDOW Cell AT nY,nX WIDTH nW - 2 HEIGHT nH - 2 MODAL NOCAPTION ; ON LOSTFOCUS oWnd:Release() oWnd := ThisWindow.Object hWnd := oWnd:Handle END WINDOW SetWindowLong(hWnd, GWL_STYLE, WS_BORDER) _DefineHotKey ( "CELL" , 0 , VK_ESCAPE , {|| oWnd:Release() } ) _DefineHotKey ( "CELL" , 0 , VK_RETURN , {|| oWnd:Release() } ) Cell.Activate oBrw:DrawSeLect() ; DO EVENTS _HMG_InplaceParentHandle := hOld RETURN .F. [/pre2] Вроде, работает у меня, Глянь тоже

Haz: SergKis пишет: Вроде, работает у меня, Глянь тоже да все работает.

Haz: SergKis пишет: Вроде, работает у меня, Глянь тоже у меня координаты ровнее в ячейку сравни , я подбирал значения специально .Но главное что привязка к положению окна заработала [pre2] #include "minigui.ch" #include "tsbrowse.ch" #include "common.ch" #include "hmg.ch" #include "i_winuser.ch" #include "hbclass.ch" static oMain static hMain FUNCTION Main() LOCAL nBtnW, nBtnH, nEndW, oBrw SET DATE GERMAN SET OOP ON SET FONT TO "Arial", 12 // кнопки toolbar от размера фонта nBtnW := App.Object:W(1.5) nBtnH := App.Object:H1 + 16 + 2 // 16 - это размер по высоте bmp nEndW := App.Object:W(0.7) // DEFINE WINDOW Form_0 AT 0,0 WIDTH Sys.ClientWidth HEIGHT Sys.ClientHeight ; DEFINE WINDOW Form_0 AT 0,0 WIDTH GetDesktopWidth() HEIGHT GetDesktopHeight() ; TITLE "Test ::CellInfo" ; MAIN ; ON INIT NIL ; NOTIFYICON "CRANE" ; NOTIFYTOOLTIP "TestCell" ; oMain := This.Object hMain := ThisWindow.Handle //DEFINE STATUSBAR /*Font "ARIAL" SIZE 9*/ BOLD DEFINE STATUSBAR FONT App.FontName SIZE iif( App.FontSize > 11, 11, App.FontSize ) BOLD STATUSITEM '' WIDTH 100 ACTION Nil STATUSITEM '' WIDTH 150 ACTION Nil STATUSITEM '' ACTION Nil STATUSITEM '' WIDTH 80 ACTION Nil STATUSITEM '' WIDTH 400 ACTION Nil DATE CLOCK END STATUSBAR DEFINE SPLITBOX HANDLE hSpl DEFINE TOOLBAR ToolBar_1 CAPTION "" BUTTONSIZE nBtnW, nBtnH FLAT BUTTON 01 CAPTION 'Справочники' PICTURE 'NEWSUPLOAD16' SEPARATOR BUTTON 02 CAPTION 'Портфель' PICTURE 'n2' WHOLEDROPDOWN SEPARATOR DEFINE DROPDOWN MENU BUTTON 02 ITEM "Моделирование" IMAGE 'factory16' ACTION _wPost(11) NAME 100 END MENU END TOOLBAR DEFINE TOOLBAR ToolBar_2 CAPTION "" BUTTONSIZE nEndW, nBtnH FLAT BUTTON 99 CAPTION 'Выход' PICTURE 'exit' ACTION {|| oMain:Release()} END TOOLBAR END SPLITBOX END WINDOW //DoMethod(oMain:Name, "maximize") oBrw := CreateBrowse( oMain, GetWindowHeight(hSpl) + 2, 2 ) ACTIVATE WINDOW &(oMain:Name) //Form_0.Activate Return nil FUNCTION CreateBrowse( oWnd, nY, nX ) LOCAL i, oBrw LOCAL aDatos := {} FOR i := 1 TO 1000 AAdd( aDatos, { i, RandStr( 30 ), Date() - i, if( i % 2 == 0, TRUE, FALSE ) } ) NEXT if isControlDefined( "oBrw", oWnd:Name ) doMethod( oWnd:Name , "oBrw", "Release") end DEFINE TBROWSE oBrw AT nY, nX OF &(oWnd:Name) ; WIDTH oWnd:ClientWidth() - nX * 2 ; HEIGHT oWnd:ClientHeight() - oWnd:StatusBar:Height - nY ; GRID //FONT "Arial" SIZE 12 oBrw:SetArray( aDatos, .T. ) oBrw:nWheelLines := 1 oBrw:nClrLine := COLOR_GRID oBrw:lNoChangeOrd := TRUE oBrw:lCellBrw := TRUE oBrw:hBrush := CreateSolidBrush( 242, 245, 204 ) oBrw:lNoVScroll := TRUE oBrw:nHeightCell := 22 oBrw:nHeightHead := 22 oBrw:lFooting := .T. oBrw:lDrawFooters := .T. oBrw:nHeightFoot := 20 oBrw:DrawFooters() // oBrw:nLineStyle := 6 // prepare for showing of Double cursor AEval( oBrw:aColumns, {| oCol| oCol:l3DLook := .F. , oCol:lFixLite := oCol:lEdit := TRUE , oCol:bPrevEdit := {|xVal, oBrw| PrevEdit(xVal, oBrw) }} ) // assignment of column's names oBrw:aColumns[ 1 ]:cName := "NUMBER" oBrw:aColumns[ 2 ]:cName := "TEXT" oBrw:aColumns[ 3 ]:cName := "DATE" oBrw:aColumns[ 4 ]:cName := "LOGIC" // the reference to columns by names oBrw:SetColSize( "NUMBER", 100 ) oBrw:SetColSize( "TEXT", 500 ) oBrw:SetColSize( "DATE", 200 ) // Checking the method nColumn() oBrw:SetColSize( oBrw:nColumn( "LOGIC" ), 300 ) oBrw:GetColumn( 'NUMBER' ):nAlign := DT_CENTER oBrw:GetColumn( 'TEXT' ):nAlign := DT_LEFT oBrw:GetColumn( 'DATE' ):nAlign := DT_CENTER oBrw:GetColumn( 'LOGIC' ):nAlign := DT_CENTER oBrw:SetColor( { 1 }, { RGB( 0, 12, 120 ) } ) oBrw:SetColor( { 2 }, { RGB( 242, 245, 204 ) } ) oBrw:SetColor( { 5 }, { RGB( 0, 0, 0 ) } ) oBrw:SetColor( { 6 }, { {|a, b, c| IF( c:nCell == b, { RGB( 66, 255, 236 ), RGB( 111, 183, 155 ) }, ; { RGB( 255, 255, 255 ), RGB( 200, 200, 200 ) } ) } } ) // cursor backcolor END TBROWSE RETURN oBrw FUNCTION RandStr( nLen ) LOCAL cSet := "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM" LOCAL cPass := "" LOCAL i := 0 FOR i := 1 TO nLen cPass += SubStr( cSet, Random( 52 ), 1 ) NEXT RETURN cPass Func PrevEdit(xVal, oBrw) LOCAL oCell LOCAL oWnd, hWnd LOCAL aRect := {0,0,0,0} SET OOP ON aRect := GetCellRect(oBrw, oBrw:nRowPos) // // aRect := GetCellRect(oBrw, .t.) // // aRect := GetCellRect(oBrw, .F.) // DEFINE WINDOW Cell ; AT aRect[2] , aRect[1] ; WIDTH aRect[3] - aRect[1] + 1 ; HEIGHT aRect[4] - aRect[2] + 1 ; NOCAPTION ; MODAL ; oWnd := ThisWindow.Object hWnd := oWnd:Handle() END WINDOW SetWindowLong(hWnd, GWL_STYLE, WS_BORDER) _DefineHotKey ( "CELL" , 0 , VK_ESCAPE , {|| oWnd:Release() } ) _DefineHotKey ( "CELL" , 0 , VK_RETURN , {|| oWnd:Release() } ) Cell.Activate oBrw:DrawSeLect() return .F. FUNC GetCellRect( oBrw, nRowPos, nCell, lColSpecHd ) LOCAL nI, nStartX := 0, oCol, cBrw LOCAL nRow, nCol, nWidth, nHeight, nRight, nBottom LOCAL lHead := .F., lFoot := .F. LOCAL aRect := {0,0,0,0} LOCAL aRet := {} IF HB_ISLOGICAL( nRowPos ) IF nRowPos ; lHead := .T. ELSE ; lFoot := .T. ENDIF nRowPos := NIL lColSpecHd := .F. ENDIF DEFAULT nRowPos := oBrw:nRowPos, ; nCell := oBrw:nCell, ; lColSpecHd := .F. oCol := oBrw:aColumns[ nCell ] IF oBrw:nFreeze > 0 FOR nI := 1 TO Min( oBrw:nFreeze, nCell - 1 ) nStartX += oBrw:GetColSizes()[ nI ] NEXT ENDIF FOR nI := oBrw:nColPos TO nCell - 1 nStartX += oBrw:GetColSizes()[ nI ] NEXT nStartX-- IF lColSpecHd nRow := oBrw:nHeightHead + oBrw:nHeightSuper + iif( oCol:l3DLook, 2, 0 ) nCol := nStartX + iif( oCol:l3DLook, 2, 0 ) nWidth := oBrw:GetColSizes()[ nCell ] - iif( oCol:l3DLook, 2, 0 ) nHeight := oBrw:nHeightSpecHd - iif( oCol:l3DLook, 1, 1 ) ELSE nRow := nRowPos - 1 nRow := nRow * oBrw:nHeightCell + oBrw:nHeightHead + ; oBrw:nHeightSuper + oBrw:nHeightSpecHd + iif( oCol:l3DLook, 1, 0 ) nCol := nStartX + iif( oCol:l3DLook, 2, 0 ) nWidth := oBrw:GetColSizes()[ nCell ] - iif( oCol:l3DLook, 3, 0 ) nHeight := oBrw:nHeightCell - iif( oCol:l3DLook, 3, 1 ) ENDIF GetWindowRect(oBrw:hWnd, aRect ) nRow := aRect[2] + 1 + oBrw:nHeightHead + oBrw:nHeightSuper + oBrw:nHeightSpecHd + iif( oCol:l3DLook, 2, 0 ) + (oBrw:nRowPos - 1 ) * oBrw:nHeightCell IF lHead nRow := aRect[2] + oBrw:nHeightSuper + iif( oCol:l3DLook, 2, 1 ) nCol := nStartX + iif( oCol:l3DLook, 2, 0 ) nHeight := oBrw:nHeightHead - iif( oCol:l3DLook, 3, 0 ) nWidth := oBrw:GetColSizes()[ nCell ] - iif( oCol:l3DLook, 3, 0 ) ELSEIF lFoot nRow := aRect[2] + _GetClientRect( oBrw:hWnd )[ 4 ] - oBrw:nHeightFoot + iif( oCol:l3DLook, 3, 1 ) nCol := nStartX + iif( oCol:l3DLook, 2, 0 ) nHeight := oBrw:nHeightFoot - iif( oCol:l3DLook, 3, 0 ) nWidth := oBrw:GetColSizes()[ nCell ] - iif( oCol:l3DLook, 3, 0 ) ENDIF nCol := nCol + oBrw:nLeft + aRect[1] -1 nRight := nCol + nWidth -1 nBottom := nRow + nHeight -1 aRet := {nCol, nRow, nRight, nBottom} RETURN aRet [/pre2]

SergKis: Haz пишет у меня координаты ровнее в ячейку Возможно, это важно в каких то случаях. В сущест. методе есть поправки на Edit режим nRow += ::aEditCellAdjust[ 1 ] nCol += ::aEditCellAdjust[ 2 ] nWidth += ::aEditCellAdjust[ 3 ] + 2 nHeight += ::aEditCellAdjust[ 4 ] Мне ни разу не понадобились ровные координаты ячейки для встраивания окна, всегда примерно получается. Надо больше ячейки или если ячейка высокая (многострочная), то меньше (на половину или по App.Object:H1 для getbox, к примеру). Чаще надо сверху или снизу, справа или слева от ячейки давать окно для выбора из списка (что бы помещался список) Можно оформить твою ф-ю как метод, если надо сделаю

Haz: SergKis пишет: Можно оформить твою ф-ю как метод, если надо сделаю оформить в метод не сложно,да смысла нет. Просто пару раз наткнулся на выравнивание и везде подбором, вот и стало интересно можно ли автоматом в точку попасть

SergKis: Haz пишет стало интересно можно ли автоматом в точку попасть Можно в метод добавить параметр и правку такую [pre2] METHOD GetCellInfo( nRowPos, nCell, lColSpecHd, lEditMode ) ... y := aRect[2] //+ 1 x := aRect[1] //+ 1 ... DEFAULT nRowPos := ::nRowPos, ; nCell := ::nCell, ; lColSpecHd := .F., ; lEditMode := .T. ... IF lEditMode nRow += ::aEditCellAdjust[ 1 ] nCol += ::aEditCellAdjust[ 2 ] nWidth += ::aEditCellAdjust[ 3 ] + 2 nHeight += ::aEditCellAdjust[ 4 ] ENDIF ... [/pre2] В примере [pre2] FUNCTION PrevEdit(xVal, oBrw) LOCAL oCell := oBrw:GetCellInfo(oBrw:nRowPos, , , .F.) LOCAL nY := oCell:nRow //+ oBrw:nHeightHead + 4 LOCAL nX := oCell:nCol LOCAL nW := oCell:nWidth LOCAL nH := oCell:nHeight LOCAL oWnd, hWnd LOCAL hOld := _HMG_InplaceParentHandle LOCAL oParent := _WindowObj(oBrw:cParentWnd) _HMG_InplaceParentHandle := oParent:Handle DEFINE WINDOW Cell AT nY,nX WIDTH nW HEIGHT nH MODAL NOCAPTION ; ... [/pre2] Довольно точно дает ячейку, по мне

Haz: SergKis пишет: Можно в метод добавить параметр и правку такую да, это будет использоваться. SergKis пишет: Довольно точно дает ячейку, по мне в границы ячейки попиксельно попадает ? У меня при тесте было смещение снизу и вроде справа. 3dlook не проверял, в нем должно на пиксель внутрь со всех сторон уходить. Завтра посмотрю еще. В принципе думаю , что lEditmode практически всегда будет . f. т.к это окно пользователя и он сам определяет его размер под задачу.

SergKis: Haz пишет в границы ячейки попиксельно попадает ? Что принимать за границы ячейки ? Внешние или внутренние размеры ? В таком варианте окно встраивается по линиям ячейки, может width 1 пиксел справа не дотягивает (может, так мне кажется, глаз не алмаз у меня). В принципе думаю , что lEditmode практически всегда будет . f. т.к это окно пользователя и он сам определяет его размер под задачу. У меня, как раз, с окном такого плана lEditMode := .T., т.к. управляю установкой ::aEditCellAdjust, предварительно сохранив, что там есть и ставлю, что мне по ситуации надо с + или - значениями. Правда это в моей версии будет, тут можно ставить default lEditMode := .F., не принципиально. Если окно идет в высокую ячейку, высота ее больше высоты GetBox и он криво смотрится в таком виде (это имеет место, если клиент просит расстояние между текстами строк делать больше), то нужен lEditMode := .T. и установки в ::aEditCellAdjust для встраивания окна во внутрь ячейки (у себя делаю это автоматом сравнивая высоту ячейки и App.Object:H1 и заполняя ::aEditCellAdjust, если разница > 2 пикселей) или переносить алгоритм на окно. В др. случаях нужно примерная левая или правая координата ячейки, для размещения окна списка, работа не закрывая ячейку 3dlook не проверял, в нем должно на пиксель внутрь со всех сторон уходить. В методе есть учет и обработка 3Dlook, но не проверял и даже не смотрел с тех пор как набирал (копипастил из drawline, наверное)

SergKis: Игорь Вот что получилось, очень похожее по размерам ячеек, к реальной работе тсб у клиента. Фонт может быть nSize := 11, пропорции похожие. Это с последними изм. MiniGui.lib Пример тут https://TransFiles.ru/zyaq4 Это вариант oCell := oBrw:GetCellInfo(oBrw:nRowPos, , , .T.) он полностью закрывает ячейку (width += 2 есть) при oCell := oBrw:GetCellInfo(oBrw:nRowPos, , , .F.) справа видна линия, не хватает width

Haz: SergKis пишет: Вот что получилось, очень похожее по размерам ячеек, к реальной работе тсб у клиента. ты маньяк, 2 часа ночи 😱. От Андрея дурных привычек нахватался ? Сегодня посмотрю ближе к обеду наверное. В целом если с этим параметрам получаются родные координаты ячейки, то у пользователя даже сомнений не будет на счет единства интерфейса при редактировании.

Haz: Haz пишет: Вот что получилось, очень похожее по размерам ячеек, к реальной работе тсб у клиента. Сергей, вот тут поправь пожалста. В целом все ок [pre2] method GetCellInfo IF lColSpecHd ... ELSE nRow := nRowPos - 1 nRow := ( nRow * ::nHeightCell ) + ::nHeightHead + ; ::nHeightSuper + ::nHeightSpecHd + iif( oCol:l3DLook, 1, 0 ) nCol := nStartX + iif( oCol:l3DLook, 2, -1 ) nWidth := ::GetColSizes()[ nCell ] - iif( oCol:l3DLook, 4, 1 ) nHeight := ::nHeightCell - iif( oCol:l3DLook, 3, 1 ) ENDIF [/pre2]

SergKis: Haz пишет:вот тут поправь Поправил + вынес +2 к width на постоянку и default lEditMode := .F. оба режима .T./.F. при не заданных ::aEditCellAdjust дают одинаковый результат [pre2] METHOD GetCellInfo( nRowPos, nCell, lColSpecHd, lEditMode ) CLASS TSBrowse LOCAL nI, nStartX := 0, oCol, cBrw, cForm //, ix LOCAL nRow, nCol, nWidth, nHeight LOCAL lHead := .F., lFoot := .F. LOCAL oCell := TSBcell():New() LOCAL aRect := {0,0,0,0}, y, x GetWindowRect(::hWnd, aRect ) y := aRect[2] //+ 1 x := aRect[1] //+ 1 IF HB_ISLOGICAL( nRowPos ) IF nRowPos ; lHead := .T. ELSE ; lFoot := .T. ENDIF nRowPos := NIL lColSpecHd := .F. ENDIF DEFAULT nRowPos := ::nRowPos, ; nCell := ::nCell, ; lColSpecHd := .F., ; lEditMode := .F. cForm := ::cParentWnd cBrw := ::cControlName oCol := ::aColumns[ nCell ] IF ::nFreeze > 0 FOR nI := 1 TO Min( ::nFreeze, nCell - 1 ) nStartX += ::GetColSizes()[ nI ] NEXT ENDIF FOR nI := ::nColPos TO nCell - 1 nStartX += ::GetColSizes()[ nI ] NEXT IF lColSpecHd nRow := ::nHeightHead + ::nHeightSuper + iif( oCol:l3DLook, 2, 0 ) nCol := nStartX + iif( oCol:l3DLook, 2, 0 ) nWidth := ::GetColSizes()[ nCell ] - iif( oCol:l3DLook, 2, 1 ) nHeight := ::nHeightSpecHd - iif( oCol:l3DLook, 1, -1 ) ELSE nRow := nRowPos - 1 nRow := ( nRow * ::nHeightCell ) + ::nHeightHead + ; ::nHeightSuper + ::nHeightSpecHd + iif( oCol:l3DLook, 1, 0 ) nCol := nStartX + iif( oCol:l3DLook, 2, -1 ) nWidth := ::GetColSizes()[ nCell ] - iif( oCol:l3DLook, 4, 1 ) nHeight := ::nHeightCell - iif( oCol:l3DLook, 3, -1 ) ENDIF IF oCol:nEditWidthDraw > 0 nWidth := oCol:nEditWidthDraw If ! ::lNoVScroll nWidth -= GetVScrollBarWidth() ENDIF ENDIF IF lHead nRow := ::nHeightSuper + iif( oCol:l3DLook, 2, 0 ) + 1 nHeight := ::nHeightHead ELSEIF lFoot nRow := _GetClientRect( ::hWnd )[ 4 ] - ::nHeightFoot + 1 nHeight := ::nHeightFoot ENDIF //ix := GetControlIndex( cBrw, cForm ) //IF _HMG_aControlContainerRow[ ix ] == -1 //nRow += ::nTop - 1 //nCol += ::nLeft //ELSE //nRow += _HMG_aControlRow[ ix ] - 1 //nCol += _HMG_aControlCol[ ix ] //ENDIF IF lEditMode nRow += ::aEditCellAdjust[ 1 ] nCol += ::aEditCellAdjust[ 2 ] nWidth += ::aEditCellAdjust[ 3 ] //+ 2 nHeight += ::aEditCellAdjust[ 4 ] ENDIF oCell:nRow := nRow + y oCell:nCol := nCol + x oCell:nWidth := nWidth + 2 oCell:nHeight := nHeight RETURN oCell [/pre2] Пример тут https://TransFiles.ru/tqkss

Haz: SergKis пишет: Поправил + вынес +2 к width на постоянку и default lEditMode := .F. оба режима .T./.F. при не заданных ::aEditCellAdjust дают одинаковый результат у меня чего то не поменялось ничего по сравнению с предыдущим примером

Haz: Поправил + вынес +2 к width Все , нормально. Можно закончить на этом

gfilatov2002: Haz пишет: Можно закончить на этом Благодарю за исправление Добавил такое описание в текущий файл changelog: * Updated: Adaptation FiveWin Class TSBrowse 9.0 in HMG: - correction and added 4th parameter lEditMode in the method GetCellInfo(). Suggested and contributed by Sergej Kiselev and Igor Nazarov.

SergKis: Haz пишет Все , нормально. Можно закончить на этом Согласен. Пример без 3Dlook тут https://TransFiles.ru/nwmrr Смущает только default lEditMode := .F., если кто уже что то делал с исп. ::aEditCellAdjus, то будет слом



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