Форум » 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: SergKis пишет: так вроде не сложно: Сергей, отлично все сделал и реально не сложно. Я под "подумать" имел ввиду, а нужен ли такой функционал вообще. Да он дает гибкость чекбоксам , но в силу логики тогоже чекбокса имеет только 2 состояния. Думаю все же полезен будет т.к. на будущее не оставляю идею сделать раскрывающееся дерево на базе TS а там значки [+] и [-] будут. Так же на потом оставил чекбокс с тремя состояниями true. false. nil т.к. работаю с ADS а там как порядочной SQL есть NULL Подождем что скажет Григорий про aColumns:[]:aCheck

SergKis: Haz пишет: а нужен ли такой функционал вообще .. ... чекбокс с тремя состояниями true. false. nil функционал нужен (разные image в колонках) и с тремя состояниями тоже вот доработал по случаю[pre2] METHOD DrawLine( xRow ) CLASS TSBrowse ... Local cCheckType, nCheckLen ... было lCheck := oColumn:lCheckBox .and. ValType( uData ) == "L" //V90 If lCheck .and. ValType( uData ) == "L" cPicture:= "" nVertText := If( uData, 3, 4 ) EndIf стало lCheck := oColumn:lCheckBox cCheckType := ValType( uData ) If lCheck .and. cCheckType == "L" cPicture:= "" nVertText := If( uData, 3, 4 ) EndIf было If lCheck Default ::aCheck := { StockBmp( 6 ), StockBmp( 7 )} hBitMap := ::aCheck[ If( Upper( uData ) == "T", 1, 2 ) ] nAlign := nMakeLong( DT_CENTER, DT_CENTER ) uData := "" EndIf стало If lCheck Default ::aCheck := { StockBmp( 6 ), StockBmp( 7 )} If Valtype(oColumn:aCheck) =="A" nCheckLen := Len(oColumn:aCheck) If cCheckType == "L" .and. nCheckLen > 1 hBitMap := oColumn:aCheck[ If( Upper( uData ) == "T", 1, 2 ) ] ElseIf nCheckLen > 2 hBitMap := oColumn:aCheck[ 3 ] EndIf ElseIf cChecType == "L" hBitMap := ::aCheck[ If( Upper( uData ) == "T", 1, 2 ) ] EndIf nAlign := nMakeLong( DT_CENTER, DT_CENTER ) uData := "" EndIf [/pre2]

SergKis: PS. ошибочка закралась[pre2] ElseIf cCheckType == "L" hBitMap := ::aCheck[ If( Upper( uData ) == "T", 1, 2 ) ] EndIf [/pre2]


Andrey: Прикрутил к полю выбор из меню: Через DEFINE CONTEXT MENU OF &cForm

Andrey: Вот вопрос возник:

SergKis: Andrey пишет:Вот вопросик ... вот ответик, в TsColumn.prg ... DATA uBmpCell // bitmap in cell (oBmp, hBmp or bBlock) DATA uBmpFoot // bitmap in footer (oBmp, hBmp or bBlock) DATA uBmpHead // bitmap in header (oBmp, hBmp or bBlock) DATA uBmpSpcHd // bitmap in special header (oBmp, hBmp or bBlock)

ММК: Haz пишет: Думаю все же полезен будет т.к. на будущее не оставляю идею сделать раскрывающееся дерево на базе TS а там значки [+] и [-] будут. Вот такой бровс с деревом в FWH если надо , могу исходник бровса прислать :)

Andrey: SergKis пишет: вот ответик, в TsColumn.prg Спасибо ! Не сообразил сразу там посмотреть ! Сделал ! Только страшновато выглядит: Использую прозрачный PNG. Может по другому надо ?

Haz: ММК пишет: если надо , могу исходник бровса прислать :) Ага Скинь в почту 047545(собака)mail(точка)ru плиз или ссылку на облако дай. Скачаю с интересом гляну как там реализовано. Мне нужно дерево с ветвями до восьмого уровня, пока не пойму как его сделать , пока на фильтрах пытаюсь делать

Andrey: Григорий ! Предлагаю код, который сделал SergKis поместить в исходник TsBrowsa ! Function GetCellSize( oBrw, nRowPos, nCell, lColSpecHd ) // координаты и размеры ячейки TsBrowse LOCAL nI, ix, nStartX := 0, oCol, cBrw, cForm LOCAL nRow, nCol, nWidth, nHeight Default nRowPos := oBrw:nRowPos, ; nCell := oBrw:nCell, ; lColSpecHd := .F. cForm := oBrw:cParentWnd cBrw := oBrw:cControlName 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 IF lColSpecHd // ячейка в SpecHeader nRow := oBrw:nHeightHead + oBrw:nHeightSuper + If( oCol:l3DLook, 2, 0 ) nCol := nStartX + If( oCol:l3DLook, 2, 0 ) nWidth := oBrw:GetColSizes()[ nCell ] - If( oCol:l3DLook, 2, 1 ) nHeight := oBrw:nHeightSpecHd - If( oCol:l3DLook, 1, -1 ) else // ячейка в таблице nRow := nRowPos - 1 nRow := ( nRow * oBrw:nHeightCell ) + oBrw:nHeightHead + ; oBrw:nHeightSuper + oBrw:nHeightSpecHd + If( oCol:l3DLook, 2, 0 ) nCol := nStartX + If( oCol:l3DLook, 2, 0 ) nWidth := oBrw:GetColSizes()[ nCell ] - If( oCol:l3DLook, 2, 0 ) nHeight := oBrw:nHeightCell - If( oCol:l3DLook, 1, -1 ) endif ix := GetControlIndex ( cBrw, cForm ) // размеры и координаты как для if _HMG_aControlContainerRow [ix] == -1 // TGETBOX !!! nRow += oBrw:nTop - 1 nCol += oBrw:nLeft else nRow += _HMG_aControlRow [ix] - 1 nCol += _HMG_aControlCol [ix] endif nRow += oBrw:aEditCellAdjust[1] nCol += oBrw:aEditCellAdjust[2] nWidth += oBrw:aEditCellAdjust[3] + 2 nHeight += oBrw:aEditCellAdjust[4] + 2 Return { nRow, nCol, nWidth, nHeight } Я в своё время намучился, но так и не сделал такую функцию.

Haz: Andrey пишет: // координаты и размеры ячейки TsBrowse Два вопроса : 1) а если ячейка за пределами окна бровса , что вернет ? 2) Для чего нужно ?

SergKis: Haz пишет:1) а если ячейка за пределами окна бровса , что вернет ? 2) Для чего нужно ? /quote] 1) проверяешь сам видима\не видима колонка 2) для доп. действий на Edit 3) для реализации external edition ... [pre2] If oCol:bExtEdit != Nil // external edition ::lNoPaint := ::lEditing := .F. uVar := Eval( oCol:bExtEdit, uValue, Self ) ::lChanged := ValType( uVar ) != ValType( uValue ) .or. uVar != uValue ::lPostEdit := .T. ::oWnd:nLastKey := VK_RETURN ::PostEdit( uVar, nCell, bValid ) Return Nil EndIf [/pre2] пример на базе Tsb_array_2 [pre2] #include "minigui.ch" #include "TSBrowse.ch" PROCEDURE MAIN LOCAL oBrw, aDatos, aArray, aHead, aSize, aFoot, aPict, aAlign, aName, aFontHF LOCAL aFont := {} // Local hFontHead, hFontFoot LOCAL cFontName := _HMG_DefaultFontName LOCAL nFontSize := 11 LOCAL nY, nX, oCol SET DECIMALS TO 4 SET DATE TO GERMAN SET EPOCH TO 2000 SET CENTURY ON SET EXACT ON DEFINE FONT Font_1 FONTNAME cFontName SIZE nFontSize DEFINE FONT Font_2 FONTNAME cFontName SIZE nFontSize BOLD AAdd( aFont, GetFontHandle( "Font_1" ) ) AAdd( aFont, GetFontHandle( "Font_2" ) ) DEFINE WINDOW test ; TITLE "SetArray For Report Demo" ; MAIN ; NOMAXIMIZE NOSIZE DEFINE STATUSBAR FONT cFontName SIZE nFontSize STATUSITEM "0" // WIDTH 0 FONTCOLOR BLACK STATUSITEM "Item 1" WIDTH 230 // FONTCOLOR BLACK STATUSITEM "Item 2" WIDTH 230 // FONTCOLOR BLACK STATUSITEM "Item 3" WIDTH 230 // FONTCOLOR BLACK END STATUSBAR nY := test.HEIGHT - GetProperty( "test", "StatusBar", "Height" ) - 70 nX := 20 @ nY, nX LABEL Lbl_Test VALUE "" WIDTH 200 HEIGHT 40 BACKCOLOR { 35, 179, 15} DEFINE TBROWSE oBrw ; AT 1 + iif( IsVistaOrLater(), GetBorderWidth()/2, 0 ), ; 1 + iif( IsVistaOrLater(), GetBorderHeight()/2, 0 ) ; WIDTH test.WIDTH - 2 * GetBorderWidth() ; HEIGHT test.HEIGHT - GetTitleHeight() - ; GetProperty( "test", "StatusBar", "Height" ) - ; 2 * GetBorderHeight() - 50 ; ENUMERATOR ; FONT cFontName SIZE nFontSize ; GRID EDIT aDatos := CreateDatos() aArray := aDatos[ 1 ] aHead := aDatos[ 2 ] aSize := aDatos[ 3 ] aFoot := aDatos[ 4 ] aPict := aDatos[ 5 ] aAlign := aDatos[ 6 ] aName := aDatos[ 7 ] // hFontHead := aFont[1] // normal Header // hFontFoot := aFont[2] // bold Footer // aFontHF := { hFontHead, hFontFoot } // aFontHF := aFont[1] // normal Header, Footer aFontHF := aFont[2] // bold Header, Footer oBrw := SetArrayTo( "oBrw", "test", aArray, aFontHF, aHead, aSize, aFoot, aPict, aAlign, aName ) // oBrw:nLineStyle := LINES_NONE oBrw:nWheelLines := 1 oBrw:nClrLine := COLOR_GRID oBrw:nHeightCell += 5 oBrw:nHeightHead += 5 IF ! Empty( aFoot ) oBrw:nHeightFoot += 5 ENDIF IF oBrw:lEnum oBrw:nHeightSpecHd := oBrw:nHeightCell ENDIF oCol := oBrw:GetColumn("ColName_7") oCol:bPrevEdit := {|uVl,oBr | mPrevEdit(uVl, oBr) } oCol:bPostEdit := {|uVl,oBr,lAp| mPostEdit(uVl, oBr, lAp) } END TBROWSE END WINDOW DoMethod( "test", "Activate" ) RETURN * ====================================================================== STATIC FUNCTION CreateDatos() LOCAL i, k := 1000, aDatos, aHead, aSize, aFoot, aPict, aAlign, aName aDatos := Array( k ) FOR i := 1 TO k aDatos[ i ] := { " ", ; // 1 i, ; // 2 ntoc( i ) + "_123", ; // 3 Date() + i, ; // 4 PadR( "Test line - " + ntoc( i ), 20 ), ; // 5 Round( ( 10000 -i ) * i / 3, 2 ), ; // 6 100.00 * i, ; // 7 0.12, ; // 8 Round( 100.00 * i * 0.12, 2 ), ; // 9 Round( 1234567.00 / i, 3 ), ; // 10 PadR( "Line " + StrZero( i, 5 ), 20 ), ; // 11 Date(), ; // 12 Time(), ; // 13 i % 2 == 0 } // 14 NEXT aHead := AClone( aDatos[ 1 ] ) // AEval(aHead, {|x,n| aHead[ n ] := "Head_" + hb_ntos(n) }) AEval( aHead, {| x, n| aHead[ n ] := "Head" + hb_ntos( n ) + ; iif( n % 2 == 0, CRLF + "SubHead" + hb_ntos( n ), "" ) } ) aFoot := Array( Len( aDatos[ 1 ] ) ) AEval( aFoot, {| x, n| aFoot[ n ] := n } ) // aFoot := .T. // подножие есть с пустыми значениями aPict := Array( Len( aDatos[ 1 ] ) ) // можно не задавать, формируются aPict[ 10 ] := "99999999999.999" // автоматом для C,N по мах значению aSize := Array( Len( aDatos[ 1 ] ) ) // можно не задавать, формируются aSize[ 10 ] := aPict[ 10 ] // автоматом по мах значению в колонке aAlign := Array( Len( aDatos[ 1 ] ) ) // тип поля C - DT_LEFT aAlign[ 2 ] := DT_CENTER // D,L - DT_CENTER // N - DT_RIGHT aName := Array( Len( aDatos[ 1 ] ) ) AEval( aName, {| x, n| aName[ n ] := "ColName_" + hb_ntos( n ) } ) RETURN { aDatos, aHead, aSize, aFoot, aPict, aAlign, aName } Function GetCellSize( oBrw, nRowPos, nCell, lColSpecHd ) // координаты и размеры ячейки TsBrowse LOCAL nI, ix, nStartX := 0, oCol, cBrw, cForm LOCAL nRow, nCol, nWidth, nHeight Default nRowPos := oBrw:nRowPos, ; nCell := oBrw:nCell, ; lColSpecHd := .F. cForm := oBrw:cParentWnd cBrw := oBrw:cControlName 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 IF lColSpecHd // ячейка в SpecHeader nRow := oBrw:nHeightHead + oBrw:nHeightSuper + If( oCol:l3DLook, 2, 0 ) nCol := nStartX + If( oCol:l3DLook, 2, 0 ) nWidth := oBrw:GetColSizes()[ nCell ] - If( oCol:l3DLook, 2, 1 ) nHeight := oBrw:nHeightSpecHd - If( oCol:l3DLook, 1, -1 ) else // ячейка в таблице nRow := nRowPos - 1 nRow := ( nRow * oBrw:nHeightCell ) + oBrw:nHeightHead + ; oBrw:nHeightSuper + oBrw:nHeightSpecHd + If( oCol:l3DLook, 2, 0 ) nCol := nStartX + If( oCol:l3DLook, 2, 0 ) nWidth := oBrw:GetColSizes()[ nCell ] - If( oCol:l3DLook, 2, 0 ) nHeight := oBrw:nHeightCell - If( oCol:l3DLook, 1, -1 ) endif ix := GetControlIndex ( cBrw, cForm ) // размеры и координаты как для if _HMG_aControlContainerRow [ix] == -1 // TGETBOX !!! nRow += oBrw:nTop - 1 nCol += oBrw:nLeft else nRow += _HMG_aControlRow [ix] - 1 nCol += _HMG_aControlCol [ix] endif nRow += oBrw:aEditCellAdjust[1] nCol += oBrw:aEditCellAdjust[2] nWidth += oBrw:aEditCellAdjust[3] + 2 nHeight += oBrw:aEditCellAdjust[4] + 2 Return { nRow, nCol, nWidth, nHeight } STATIC FUNCTION mPrevEdit( uVal, oBrw ) LOCAL cForm := oBrw:cParentWnd LOCAL cBrw := oBrw:cControlName LOCAL nRowPos := oBrw:nRowPos LOCAL nCell := oBrw:nCell LOCAL oCol := oBrw:aColumns[ nCell ] LOCAL lRet := .T., aS, nY, nX, nW, nH, cLbl := "Lbl_Test" LOCAL lSH := .T. // .T. - SpecHead, .F. - Cell, меняем тут If oCol:cName == "ColName_7" aS := GetCellSize(oBrw, nRowPos, nCell, lSH) nY := aS[1] + If( lSH, 0, aS[4] ) nX := aS[2] nW := aS[3] nH := aS[4] SetProperty(cForm, cLbl, "Row" , nY) SetProperty(cForm, cLbl, "Col" , nX) SetProperty(cForm, cLbl, "Width" , nW) SetProperty(cForm, cLbl, "Height" , nH) SetProperty(cForm, cLbl, "Visible", .T.) SetProperty(cForm, cLbl, "Value" , "") EndIf RETURN lRet STATIC FUNCTION mPostEdit( uVal, oBrw, lApp ) LOCAL cForm := oBrw:cParentWnd LOCAL cBrw := oBrw:cControlName LOCAL nCell := oBrw:nCell LOCAL oCol := oBrw:aColumns[ nCell ] LOCAL lRet := .T., cLbl := "Lbl_Test" If oCol:cName == "ColName_7" SetProperty(cForm, cLbl, "Visible", .F.) EndIf RETURN lRet [/pre2]

SergKis: PS вкл. Edit на колонке 7

Haz: Сергей привет SergKis пишет: проверяешь сам видима\не видима колонка 1) а не проще сразу ::nCell использовать ? ( сам отвечу, проще но так универсальнее ) 2) как использовать и для чего я сразу понял , т. к. делал почти тоже но уже из oEdit объекта PS Пример хороший , сам присматривался к получению координат по аналогии с методом ::Edit() ,как раз то что ты реализовал. PSS правда не увидел в нем внешнего редактирования ) Григорий , действительно полезная функция, добавьте в библиотеку пожалуйста Пра мыслей как можно ее использовать 1) Организация всплывающий подсказок при редактировании ячейки 2) Псевдо комбобоксы под ячейкой ( бровс по вариантам )

SergKis: Haz пишет: а не проще сразу ::nCell использовать ? не всегда нужен ::nCell иногда нужен nCell - 2 и т.д. и т.п. Haz пишет: делал почти тоже но уже из oEdit объекта в bPrevEdit, bExtEdit нет oEdit, потому нужен механизм размеров (в моем проекте это метод ::GetCellSize(...)) Haz пишет: правде не увидел в нем внешнего редактирования под BROWSE такой механизм (несколько GetBox на Label) работает, почему тут не будет ? что исп. для внешнего редактирования GetBox или др. TSB - по ситуации

Haz: SergKis пишет: потому нужен механизм размеров (в моем проекте это метод ::GetCellSize(...)) Сергей , раз уж начал ..... Может в метод переделаешь METHOD GetCellInfo() Возвращает объект oCell c данными ( примерно эти , дальше нарастет по необходимости ) ::nRow ::nCol ::nWidth ::nHeight и код из твоего примера станет таким oCell := oBrw:GetCellinfo(nRowPos, nCell, lSH) nY := oCell:nRow + If( lSH, 0, oCell:nHeight ) nX := oCell:nCol nW := oCell:nWidth nH := oCell:nHeight

SergKis: Haz пишет:Может в метод переделаешь METHOD GetCellInfo() хорошее название - сделаю пример на 2-а GetBox для ввода в 7-ю колонку (Label не прикрутил - прорисовка линий на нем от TSB) [pre2] #include "minigui.ch" #include "TSBrowse.ch" PROCEDURE MAIN LOCAL oBrw, aDatos, aArray, aHead, aSize, aFoot, aPict, aAlign, aName, aFontHF LOCAL aFont := {} // Local hFontHead, hFontFoot LOCAL cFontName := _HMG_DefaultFontName LOCAL nFontSize := 11 LOCAL nY, nX, oCol LOCAL cForm := "test" SET DECIMALS TO 4 SET DATE TO GERMAN SET EPOCH TO 2000 SET CENTURY ON SET EXACT ON DEFINE FONT Font_1 FONTNAME cFontName SIZE nFontSize DEFINE FONT Font_2 FONTNAME cFontName SIZE nFontSize BOLD AAdd( aFont, GetFontHandle( "Font_1" ) ) AAdd( aFont, GetFontHandle( "Font_2" ) ) DEFINE WINDOW test ; TITLE "SetArray For Report Demo" ; MAIN ; NOMAXIMIZE NOSIZE DEFINE STATUSBAR FONT cFontName SIZE nFontSize STATUSITEM "0" // WIDTH 0 FONTCOLOR BLACK STATUSITEM "Item 1" WIDTH 230 // FONTCOLOR BLACK STATUSITEM "Item 2" WIDTH 230 // FONTCOLOR BLACK STATUSITEM "Item 3" WIDTH 230 // FONTCOLOR BLACK END STATUSBAR DEFINE TBROWSE oBrw ; AT 1 + iif( IsVistaOrLater(), GetBorderWidth()/2, 0 ), ; 1 + iif( IsVistaOrLater(), GetBorderHeight()/2, 0 ) ; WIDTH test.WIDTH - 2 * GetBorderWidth() ; HEIGHT test.HEIGHT - GetTitleHeight() - ; GetProperty( "test", "StatusBar", "Height" ) - ; 2 * GetBorderHeight() - 50 ; ENUMERATOR ; FONT cFontName SIZE nFontSize ; GRID EDIT aDatos := CreateDatos() aArray := aDatos[ 1 ] aHead := aDatos[ 2 ] aSize := aDatos[ 3 ] aFoot := aDatos[ 4 ] aPict := aDatos[ 5 ] aAlign := aDatos[ 6 ] aName := aDatos[ 7 ] // hFontHead := aFont[1] // normal Header // hFontFoot := aFont[2] // bold Footer // aFontHF := { hFontHead, hFontFoot } // aFontHF := aFont[1] // normal Header, Footer aFontHF := aFont[2] // bold Header, Footer oBrw := SetArrayTo( "oBrw", "test", aArray, aFontHF, aHead, aSize, aFoot, aPict, aAlign, aName ) // oBrw:nLineStyle := LINES_NONE oBrw:nWheelLines := 1 oBrw:nClrLine := COLOR_GRID oBrw:nHeightCell += 5 oBrw:nHeightHead += 5 IF ! Empty( aFoot ) oBrw:nHeightFoot += 5 ENDIF IF oBrw:lEnum oBrw:nHeightSpecHd := oBrw:nHeightCell ENDIF oCol := oBrw:GetColumn("ColName_7") oCol:bPrevEdit := {|uVl,oBr| mPrevEdit(uVl, oBr) } // oCol:bPostEdit := {|uVl,oBr,lAp| mPostEdit(uVl, oBr, lAp) } // oCol:bExtEdit := {|uvl,oBr | mExtEdit (uVl, oBr ) } END TBROWSE // контролы ОБЯЗАТЕЛЬНО после TsBrowse, что бы z-ордер был большим у них, чем у TSB nY := test.HEIGHT - GetProperty( "test", "StatusBar", "Height" ) - 80 nX := 20 @ nY, nX LABEL Lbl_Test VALUE "" WIDTH 40 HEIGHT 40 BACKCOLOR { 35, 179, 15} nX += 40 + 10 @ nY, nX GETBOX Get_Sum1 WIDTH 40 HEIGHT 20 VALUE 0 PICTURE "999.99" ; VALID mGet_Sum() ON LOSTFOCUS mLostFocus() nX += 40 + 10 @ nY, nX GETBOX Get_Sum2 WIDTH 40 HEIGHT 20 VALUE 0 PICTURE "999.99" ; VALID mGet_Sum() ON LOSTFOCUS mLostFocus() test.Get_Sum1.Cargo := oBrw test.Get_Sum2.Cargo := oBrw oBrw:SetFocus() END WINDOW DoMethod( "test", "Activate" ) RETURN * ====================================================================== STATIC FUNCTION CreateDatos() LOCAL i, k := 1000, aDatos, aHead, aSize, aFoot, aPict, aAlign, aName aDatos := Array( k ) FOR i := 1 TO k aDatos[ i ] := { " ", ; // 1 i, ; // 2 ntoc( i ) + "_123", ; // 3 Date() + i, ; // 4 PadR( "Test line - " + ntoc( i ), 20 ), ; // 5 Round( ( 10000 -i ) * i / 3, 2 ), ; // 6 100.00 * i, ; // 7 0.12, ; // 8 Round( 100.00 * i * 0.12, 2 ), ; // 9 Round( 1234567.00 / i, 3 ), ; // 10 PadR( "Line " + StrZero( i, 5 ), 20 ), ; // 11 Date(), ; // 12 Time(), ; // 13 i % 2 == 0 } // 14 NEXT aHead := AClone( aDatos[ 1 ] ) // AEval(aHead, {|x,n| aHead[ n ] := "Head_" + hb_ntos(n) }) AEval( aHead, {| x, n| aHead[ n ] := "Head" + hb_ntos( n ) + ; iif( n % 2 == 0, CRLF + "SubHead" + hb_ntos( n ), "" ) } ) aFoot := Array( Len( aDatos[ 1 ] ) ) AEval( aFoot, {| x, n| aFoot[ n ] := n } ) // aFoot := .T. // подножие есть с пустыми значениями aPict := Array( Len( aDatos[ 1 ] ) ) // можно не задавать, формируются aPict[ 10 ] := "99999999999.999" // автоматом для C,N по мах значению aSize := Array( Len( aDatos[ 1 ] ) ) // можно не задавать, формируются aSize[ 10 ] := aPict[ 10 ] // автоматом по мах значению в колонке aAlign := Array( Len( aDatos[ 1 ] ) ) // тип поля C - DT_LEFT aAlign[ 2 ] := DT_CENTER // D,L - DT_CENTER // N - DT_RIGHT aName := Array( Len( aDatos[ 1 ] ) ) AEval( aName, {| x, n| aName[ n ] := "ColName_" + hb_ntos( n ) } ) RETURN { aDatos, aHead, aSize, aFoot, aPict, aAlign, aName } Function GetCellSize( oBrw, nRowPos, nCell, lColSpecHd ) // координаты и размеры ячейки TsBrowse LOCAL nI, ix, nStartX := 0, oCol, cBrw, cForm LOCAL nRow, nCol, nWidth, nHeight Default nRowPos := oBrw:nRowPos, ; nCell := oBrw:nCell, ; lColSpecHd := .F. cForm := oBrw:cParentWnd cBrw := oBrw:cControlName 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 IF lColSpecHd // ячейка в SpecHeader nRow := oBrw:nHeightHead + oBrw:nHeightSuper + If( oCol:l3DLook, 2, 0 ) nCol := nStartX + If( oCol:l3DLook, 2, 0 ) nWidth := oBrw:GetColSizes()[ nCell ] - If( oCol:l3DLook, 2, 1 ) nHeight := oBrw:nHeightSpecHd - If( oCol:l3DLook, 1, -1 ) else // ячейка в таблице nRow := nRowPos - 1 nRow := ( nRow * oBrw:nHeightCell ) + oBrw:nHeightHead + ; oBrw:nHeightSuper + oBrw:nHeightSpecHd + If( oCol:l3DLook, 2, 0 ) nCol := nStartX + If( oCol:l3DLook, 2, 0 ) nWidth := oBrw:GetColSizes()[ nCell ] - If( oCol:l3DLook, 2, 0 ) nHeight := oBrw:nHeightCell - If( oCol:l3DLook, 1, -1 ) endif ix := GetControlIndex ( cBrw, cForm ) // размеры и координаты как для if _HMG_aControlContainerRow [ix] == -1 // TGETBOX !!! nRow += oBrw:nTop - 1 nCol += oBrw:nLeft else nRow += _HMG_aControlRow [ix] - 1 nCol += _HMG_aControlCol [ix] endif nRow += oBrw:aEditCellAdjust[1] nCol += oBrw:aEditCellAdjust[2] nWidth += oBrw:aEditCellAdjust[3] + 2 nHeight += oBrw:aEditCellAdjust[4] + 2 Return { nRow, nCol, nWidth, nHeight } STATIC FUNCTION mLostFocus() LOCAL ix, lSum, hFocus := GetFocus() LOCAL cForm := _HMG_ThisFormName LOCAL cSm1 := "Get_Sum1" LOCAL cSm2 := "Get_Sum2" If hFocus != 0 ix := ascan(_HMG_aControlHandles, hFocus) If ix > 0 lSum := _HMG_aControlNames[ ix ] == cSm1 .or. ; _HMG_aControlNames[ ix ] == cSm2 If ! lSum SetProperty(cForm, cSm1, "Visible", .F.) SetProperty(cForm, cSm2, "Visible", .F.) EndIf EndIf EndIf RETURN Nil STATIC FUNCTION mGet_Sum() LOCAL lRet := .T., nCell, oCol, nSm1, nSm2, nSum LOCAL cForm := _HMG_ThisFormName LOCAL cName := _HMG_ThisControlName LOCAL oBrw := GetProperty(cForm, cName, "Cargo") LOCAL cSm1 := "Get_Sum1" LOCAL cSm2 := "Get_Sum2" If Valtype(oBrw) == "O" nCell := oBrw:nCell oCol := oBrw:GetColumn(nCell) If cName == "Get_Sum2" nSm1 := GetProperty(cForm, cSm1, "Value") nSm2 := GetProperty(cForm, cSm2, "Value") nSum := nSm1 * nSm2 mPostEdit(nSum, oBrw) EndIf EndIf RETURN lRet STATIC FUNCTION mPrevEdit( uVal, oBrw ) LOCAL cForm := oBrw:cParentWnd LOCAL cBrw := oBrw:cControlName LOCAL nRowPos := oBrw:nRowPos LOCAL nCell := oBrw:nCell LOCAL oCol := oBrw:aColumns[ nCell ] LOCAL lRet := .T., aS, nY, nX, nW, nH, nD := 4 LOCAL cLbl := "Lbl_Test" LOCAL cSm1 := "Get_Sum1" LOCAL cSm2 := "Get_Sum2" If oCol:cName == "ColName_7" aS := GetCellSize(oBrw, nRowPos, nCell - 1) nY := aS[1] nX := aS[2] nW := aS[3] nH := aS[4] SetProperty(cForm, cSm1, "Row" , nY) SetProperty(cForm, cSm1, "Col" , nX) SetProperty(cForm, cSm1, "Width" , nW) SetProperty(cForm, cSm1, "Height" , nH) SetProperty(cForm, cSm1, "Visible", .T.) SetProperty(cForm, cSm1, "Value" , 0) nY := aS[1] + aS[4] nX := aS[2] nW := aS[3] nH := aS[4] SetProperty(cForm, cSm2, "Row" , nY) SetProperty(cForm, cSm2, "Col" , nX) SetProperty(cForm, cSm2, "Width" , nW) SetProperty(cForm, cSm2, "Height" , nH) SetProperty(cForm, cSm2, "Visible", .T.) SetProperty(cForm, cSm2, "Value" , 0) DoMethod(cForm, cSm1, "SetFocus") lRet := .F. EndIf RETURN lRet STATIC FUNCTION mPostEdit( uVal, oBrw, lApp ) LOCAL cForm := oBrw:cParentWnd LOCAL cBrw := oBrw:cControlName LOCAL nCell := oBrw:nCell LOCAL oCol := oBrw:aColumns[ nCell ] LOCAL lRet := .T. LOCAL cLbl := "Lbl_Test" LOCAL cSm1 := "Get_Sum1" LOCAL cSm2 := "Get_Sum2" LOCAL nSum If oCol:cName == "ColName_7" SetProperty(cForm, cSm2, "Visible", .F.) SetProperty(cForm, cSm1, "Visible", .F.) nSum := EVal(oCol:bData) If uVal != nSum oBrw:aArray[oBrw:nAt][nCell] := uVal oBrw:DrawSelect() EndIf EndIf RETURN lRet [/pre2]

SergKis: Haz переделал [pre2] CLASS TSBcell VAR nRow AS NUMERIC INIT 0 VAR nCol AS NUMERIC INIT 0 VAR nWidth AS NUMERIC INIT 0 VAR nHeight AS NUMERIC INIT 0 METHOD New() INLINE ( Self ) ENDCLASS METHOD GetCellInfo( nRowPos, nCell, lColSpecHd ) CLASS TSBrowse LOCAL nI, ix, nStartX := 0, oCol, cBrw, cForm LOCAL nRow, nCol, nWidth, nHeight LOCAL oCell := TSBcell():New() 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 + If( oCol:l3DLook, 2, 0 ) nCol := nStartX + If( oCol:l3DLook, 2, 0 ) nWidth := ::GetColSizes()[ nCell ] - If( oCol:l3DLook, 2, 1 ) nHeight := ::nHeightSpecHd - If( oCol:l3DLook, 1, -1 ) else nRow := nRowPos - 1 nRow := ( nRow * ::nHeightCell ) + ::nHeightHead + ; ::nHeightSuper + ::nHeightSpecHd + If( oCol:l3DLook, 2, 0 ) nCol := nStartX + If( oCol:l3DLook, 2, 0 ) nWidth := ::GetColSizes()[ nCell ] - If( oCol:l3DLook, 2, 0 ) nHeight := ::nHeightCell - If( oCol:l3DLook, 1, -1 ) 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] + 2 oCell:nRow := nRow oCell:nCol := nCol oCell:nWidth := nWidth oCell:nHeight := nHeight Return oCell [/pre2]

Haz: SergKis пишет: переделал отлично теперь с форума будем собирать идеи по наполнению класса CLASS TSBcell

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



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