Автор | Сообщение |
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
[только новые]
|
|
Haz
|
| |
Пост N: 1755
Зарегистрирован: 20.02.11
|
|
Отправлено: 09.09.21 08:42. Заголовок: Andrey пишет: А как..
Andrey пишет: цитата: | А как его поменять можно ? |
|
Андрей, переменные есть , но это пустышки. Они нигде не используются, видимо автор так и не дошёл до этого. Цвет скролбара определяется темой виндовс и легких путей его поменять нет (так же как и титл окна ). Можно нарисовать свой класс по скроллбару , где будет обрабатываться цвет и размер, но такой подход потребует пересчета клиентской области окна бровса и корректировки многих методов опирающихся на эти размеры.
| |
|
Andrey
|
| постоянный участник
|
Пост N: 7041
Зарегистрирован: 12.09.06
|
|
Отправлено: 09.09.21 08:55. Заголовок: Понял, спасибо ! :s..
Понял, спасибо !
| |
|
Haz
|
| |
Пост N: 1756
Зарегистрирован: 20.02.11
|
|
Отправлено: 09.09.21 09:00. Заголовок: Andrey пишет: Понял..
Andrey пишет: чуть дописал выше
| |
|
Haz
|
| |
Пост N: 1757
Зарегистрирован: 20.02.11
|
|
Отправлено: 09.09.21 19:24. Заголовок: Haz пишет: спасибо,..
Haz пишет: Сергей посмотрел , попробуй в примере ( который ты правил ) перед тем как щелкнуть в ячейке, сдвинуть окно чуть в сторону . Во всех случаях GetCellInfo не попадет в координаты ( heading, cell, footing ) Нужна привязка к физическому положению парент окна сегодня изобрел это ( физические , а не относительные координаты ячейки на экране , вне зависимости куда двинули окно с бровсем) Скрытый текст 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
| лень было для теста в класс заворачивать, а может и незачем. Плюс возвращаемое как по классике в массиве rect {nLeft, nTop, nRight, nBottom} Возвращает именно координаты ячейки ( без учета длинны поля редактирования т.к. это посчитал лишним ) параметры как у GetCellInfo() окно ячейки рисуется так ( плюс не стал пока заморачиваться с потерей фокуса ) Скрытый текст 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.
| гонял по всякому с 3DLook и без , в заголовках подвалах ячейках и пр . у меня все корректно рисует. Под 3DLook подбирал поправки попиксельно на большом экране
| |
|
SergKis
|
| постоянный участник
|
Пост N: 3862
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.09.21 21:17. Заголовок: Haz пишет:посмотрел ..
Haz пишет: цитата: | посмотрел , попробуй в примере ( который ты правил ) перед тем как щелкнуть в ячейке, сдвинуть окно чуть в сторону |
| Улыбнуло Столько лет делал и не двигал никогда окно, клиенты похоже тоже. Поправил метод в тсб. 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. Вроде, работает у меня, Глянь тоже
| |
|
Haz
|
| |
Пост N: 1758
Зарегистрирован: 20.02.11
|
|
Отправлено: 09.09.21 21:28. Заголовок: SergKis пишет: Врод..
SergKis пишет: цитата: | Вроде, работает у меня, Глянь тоже |
|
да все работает.
| |
|
Haz
|
| |
Пост N: 1759
Зарегистрирован: 20.02.11
|
|
Отправлено: 09.09.21 21:36. Заголовок: SergKis пишет: Врод..
SergKis пишет: цитата: | Вроде, работает у меня, Глянь тоже |
| у меня координаты ровнее в ячейку сравни , я подбирал значения специально .Но главное что привязка к положению окна заработала Скрытый текст #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
|
| |
|
SergKis
|
| постоянный участник
|
Пост N: 3864
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.09.21 21:55. Заголовок: Haz пишет у меня коо..
Haz пишет цитата: | у меня координаты ровнее в ячейку |
| Возможно, это важно в каких то случаях. В сущест. методе есть поправки на Edit режим nRow += ::aEditCellAdjust[ 1 ] nCol += ::aEditCellAdjust[ 2 ] nWidth += ::aEditCellAdjust[ 3 ] + 2 nHeight += ::aEditCellAdjust[ 4 ] Мне ни разу не понадобились ровные координаты ячейки для встраивания окна, всегда примерно получается. Надо больше ячейки или если ячейка высокая (многострочная), то меньше (на половину или по App.Object:H1 для getbox, к примеру). Чаще надо сверху или снизу, справа или слева от ячейки давать окно для выбора из списка (что бы помещался список) Можно оформить твою ф-ю как метод, если надо сделаю
| |
|
Haz
|
| |
Пост N: 1760
Зарегистрирован: 20.02.11
|
|
Отправлено: 09.09.21 21:59. Заголовок: SergKis пишет: Можн..
SergKis пишет: цитата: | Можно оформить твою ф-ю как метод, если надо сделаю |
|
оформить в метод не сложно,да смысла нет. Просто пару раз наткнулся на выравнивание и везде подбором, вот и стало интересно можно ли автоматом в точку попасть
| |
|
SergKis
|
| постоянный участник
|
Пост N: 3865
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.09.21 22:31. Заголовок: Haz пишет стало инт..
Haz пишет цитата: | стало интересно можно ли автоматом в точку попасть |
| Можно в метод добавить параметр и правку такую 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 ... В примере 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 ; ... Довольно точно дает ячейку, по мне
| |
|
Haz
|
| |
Пост N: 1761
Зарегистрирован: 20.02.11
|
|
Отправлено: 09.09.21 23:01. Заголовок: SergKis пишет: Можн..
SergKis пишет: цитата: | Можно в метод добавить параметр и правку такую |
|
да, это будет использоваться. SergKis пишет: цитата: | Довольно точно дает ячейку, по мне |
|
в границы ячейки попиксельно попадает ? У меня при тесте было смещение снизу и вроде справа. 3dlook не проверял, в нем должно на пиксель внутрь со всех сторон уходить. Завтра посмотрю еще. В принципе думаю , что lEditmode практически всегда будет . f. т.к это окно пользователя и он сам определяет его размер под задачу.
| |
|
|
SergKis
|
| постоянный участник
|
Пост N: 3866
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.09.21 23:20. Заголовок: Haz пишет в границы ..
Haz пишет цитата: | в границы ячейки попиксельно попадает ? |
| Что принимать за границы ячейки ? Внешние или внутренние размеры ? В таком варианте окно встраивается по линиям ячейки, может width 1 пиксел справа не дотягивает (может, так мне кажется, глаз не алмаз у меня). цитата: | В принципе думаю , что lEditmode практически всегда будет . f. т.к это окно пользователя и он сам определяет его размер под задачу. |
| У меня, как раз, с окном такого плана lEditMode := .T., т.к. управляю установкой ::aEditCellAdjust, предварительно сохранив, что там есть и ставлю, что мне по ситуации надо с + или - значениями. Правда это в моей версии будет, тут можно ставить default lEditMode := .F., не принципиально. Если окно идет в высокую ячейку, высота ее больше высоты GetBox и он криво смотрится в таком виде (это имеет место, если клиент просит расстояние между текстами строк делать больше), то нужен lEditMode := .T. и установки в ::aEditCellAdjust для встраивания окна во внутрь ячейки (у себя делаю это автоматом сравнивая высоту ячейки и App.Object:H1 и заполняя ::aEditCellAdjust, если разница > 2 пикселей) или переносить алгоритм на окно. В др. случаях нужно примерная левая или правая координата ячейки, для размещения окна списка, работа не закрывая ячейку цитата: | 3dlook не проверял, в нем должно на пиксель внутрь со всех сторон уходить. |
| В методе есть учет и обработка 3Dlook, но не проверял и даже не смотрел с тех пор как набирал (копипастил из drawline, наверное)
| |
|
SergKis
|
| постоянный участник
|
Пост N: 3867
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.09.21 02:20. Заголовок: Игорь Вот что получи..
Игорь Вот что получилось, очень похожее по размерам ячеек, к реальной работе тсб у клиента. Фонт может быть nSize := 11, пропорции похожие. Это с последними изм. MiniGui.lib Пример тут https://TransFiles.ru/zyaq4 Это вариант oCell := oBrw:GetCellInfo(oBrw:nRowPos, , , .T.) он полностью закрывает ячейку (width += 2 есть) при oCell := oBrw:GetCellInfo(oBrw:nRowPos, , , .F.) справа видна линия, не хватает width
| |
|
Haz
|
| |
Пост N: 1762
Зарегистрирован: 20.02.11
|
|
Отправлено: 10.09.21 08:11. Заголовок: SergKis пишет: Вот ..
SergKis пишет: цитата: | Вот что получилось, очень похожее по размерам ячеек, к реальной работе тсб у клиента. |
|
ты маньяк, 2 часа ночи 😱. От Андрея дурных привычек нахватался ? Сегодня посмотрю ближе к обеду наверное. В целом если с этим параметрам получаются родные координаты ячейки, то у пользователя даже сомнений не будет на счет единства интерфейса при редактировании.
| |
|
Haz
|
| |
Пост N: 1764
Зарегистрирован: 20.02.11
|
|
Отправлено: 10.09.21 08:40. Заголовок: Haz пишет: Вот что ..
Haz пишет: цитата: | Вот что получилось, очень похожее по размерам ячеек, к реальной работе тсб у клиента. |
| Сергей, вот тут поправь пожалста. В целом все ок Скрытый текст 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
|
| |
|
SergKis
|
| постоянный участник
|
Пост N: 3868
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.09.21 11:11. Заголовок: Haz пишет:вот тут по..
Haz пишет: Поправил + вынес +2 к width на постоянку и default lEditMode := .F. оба режима .T./.F. при не заданных ::aEditCellAdjust дают одинаковый результат 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 Пример тут https://TransFiles.ru/tqkss
| |
|
Haz
|
| |
Пост N: 1766
Зарегистрирован: 20.02.11
|
|
Отправлено: 10.09.21 11:15. Заголовок: SergKis пишет: Попр..
SergKis пишет: цитата: | Поправил + вынес +2 к width на постоянку и default lEditMode := .F. оба режима .T./.F. при не заданных ::aEditCellAdjust дают одинаковый результат |
| у меня чего то не поменялось ничего по сравнению с предыдущим примером
| |
|
Haz
|
| |
Пост N: 1767
Зарегистрирован: 20.02.11
|
|
Отправлено: 10.09.21 11:22. Заголовок: Haz пишет: Поправил..
цитата: | Поправил + вынес +2 к width |
| Все , нормально. Можно закончить на этом
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1924
Зарегистрирован: 11.02.10
|
|
Отправлено: 10.09.21 11:41. Заголовок: Haz пишет: Можно за..
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
|
| постоянный участник
|
Пост N: 3869
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.09.21 11:52. Заголовок: Haz пишет Все , норм..
Haz пишет цитата: | Все , нормально. Можно закончить на этом |
| Согласен. Пример без 3Dlook тут https://TransFiles.ru/nwmrr Смущает только default lEditMode := .F., если кто уже что то делал с исп. ::aEditCellAdjus, то будет слом
| |
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|
|