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

Ответов - 181, стр: 1 2 3 4 5 6 7 8 9 10 All

Andrey: Есть длинная строка адреса. В ТСБ естественно будет показываться только то кол-во символов, которые заданы в picture. Допустим 30 символов. А можно сделать чтобы показывало последние 30 символов из строки в колонке ?

SergKis: А можно сделать чтобы показывало последние 30 символов из строки в колонке ? oCol:bDecode := {|ca| ca := trim(ca), iif( Len(ca) > 30, "..."+right(ca, 30), ca ) }

Andrey: Спасибо БОЛЬШОЕ !


alex_II: ТСБ работает с массивом ... s1 := 0 aKv - массив [4,11] ... Br:SetArrayTo(aKv,,aZg,aWi,aFoot,aPict,aAlgn) Хочу при старте заполнить подвал второй колонки, в этой колонке цифры и надо подсчитать сумму Делаю так: Br:aColumns[2]:cFooting := {|| aEval(Br:aArray, {|aVal,nElm| s1 += aVal[2]}), str(s1,10,2)} но aEval почему-то проходит по массиву 4 раза, т.е сумма получается в четыре заза больше.

SergKis: alex_II Тсб - это просто рисование данных в таблице по настройке, ничего не считает. В данном случае прошло 4-е прохода прорисовки. Надо посчитать и записать в нужные колонки :cFooting := cValToChar(...) или в переменные, поля dbf, ... и в :cFooting := блок кода для получения строки из них (для каждой колонки), тогда по каким то действиям меняете значения данных для этих блоков кода и делаете переотображение тсб всех строк oBrw:Refresh(...), курсора oBrw:DrawSelect(), oBrw:DrawFooters()

alex_II: Я извиняюсь, но ничего не понял. Я описал ситуацию, которая происходит при старте программы, когда еще никаких действий не производилось. ТСБ прорисовывает таблицу по данным из массива и я пытаюсь заполнить подвал до всех действий. Тут вопрос думаю не к ТСБ, а а к блоку кода, тем более он у меня вложенный.

SergKis: alex_II 1. Тсб - это просто рисование данных в таблице по настройке, ничего не считает. 2. Выносите свой блок кода, подсчета итоговых сумм, из тсб отдельно 3. Создаете массив для показа в тсб 4. Запускаете подсчет сумм по колонкам массива, т.е. исполняете свой блок кода, итоги запомнили 5. DEFINE TBROWSE ... => в колонки переносите итоги oCol:cFooting := <итоги из массива, как строка> END TBROWSE 6. Тсб нарисуется вместе с итогами (за 4-ре раза, потому в вашей ситуации учетверение сумм, так не надо делать) Если делаем правку строк с суммами в строках массива тсб :lEdit := .T., то итоги надо пересчитать, т.е. запускаем блок кода подсчета сумм п.2, получив новые итоги, заносим их результаты в нужные oCol:cFooting и делаем oBrw:DrawFooters() - перерисовать подвал. Если, например, у вас есть массив итогов aItig, то можно исп. блок кода в oCol:cFooting := {|| hb_ntos(aItog[3]) } и так во все колонки. Блок кода будет обеспечивать данные дли Footers по выполнению oBrw:DrawFooters() PS Примеры APP_OOPREPORT смотрите, там есть итоги в массивах, создаваемых по кнопкам

alex_II: Спасибо за развёрнутый ответ

Andrey: SergKis пишет: Примеры APP_OOPREPORT смотрите, там есть итоги в массивах, создаваемых по кнопкам Можно ещё глянуть этот пример - SAMPLES\Advanced\Tsb_array_4 там тоже идёт подсчёт итогов !

alex_II: Пример: ...\MiniGUI\SAMPLES\Advanced\Tsb_array_2\demo5.prg Сперва думал, что сам как-то повлиял своими настройками, убил на это день. У меня белый фон и вид получается удручающий

Andrey: alex_II пишет: У меня белый фон и вид получается удручающий Картинку в студию ! Красивый и продвинутый ТСБ смотри \SAMPLES\Advanced\Tsb_5Win

alex_II: Нужен именно такой вид, максимально приближенный к распечатке. Там. где была корректировка, сетка нарушается. В 21 году вроде эта тема обсуждалась, но с ходу не нашел когда.

Andrey: Попробуй увеличить высоту ячеек. [pre2] oBrw:nHeightCell += 6 [/pre2]

Haz: alex_II пишет: Там. где была корректировка, сетка нарушается. В методе Edit() координаты окна редактирования рассчитываются не пойми как и для каждого контрола отдельно. Погрешность выравнивается подгонкой через массив из 4 значений. Выхода из положения два 1 править edit() 2 перед редактированием задавать сдвиги в массиве корректировки координат окна редактирования. Высота строки бровса тут не при чем т ее изменение не поможет

Andrey: Пример - SAMPLES\Advanced\Tsb_Basic\demo.prg [pre2] oBrw:nHeightCell += 10 // к высоте ячеек таблицы добавим oBrw:nHeightHead += 5 // к высоте шапки таблицы добавим // GetBox встраиваем в ячейку, задаем отступы oBrw:aEditCellAdjust[1] += 4 // cell_Y + :aEditCellAdjust[1] oBrw:aEditCellAdjust[2] += 2 // cell_X + :aEditCellAdjust[2] oBrw:aEditCellAdjust[3] -= 5 // cell_W + :aEditCellAdjust[3] oBrw:aEditCellAdjust[4] -= 8 // cell_H + :aEditCellAdjust[4] [/pre2]

alex_II: С высотой ячеек и не только я игрался целый день, ничего не помогает. Править метод Edit() нет ни желания ни возможности, много работы. Печалька.

SergKis: alex_II пишет Там. где была корректировка, сетка нарушается oBrw:DrawSelect(), oBrw:Refresh() перерисовывают строку курсора и все окно, не понимаю проблему совсем Не нравится oBrw:aEditCellAdjust, положите на ячейку[и] modal окно в размеры или больше со своим вводом Править метод Edit() нет ни желания ни возможности, много работы Метод Edit править нет нужды, даже мыслей на это нет, а сделать свой ввод (можно даже красивый) один раз и использовать везде ЭТО и есть работа над проектом (hmg это продукт как есть и использование его вами это ваш риск ...)

Haz: alex_II пишет: Править метод Edit() нет ни желания ни возможности, много работы. Печалька. Там править ничего не надо, нужно просто подменить. У себя , когда лень менять исходники делаю замену [pre] После определения бровса ( DEFINE BROWSE .. OBJ oBrw ...) подменяю методы на свои и нет нужды каждый раз править oBrw := __objModMethod( oBrw, 'edit', @edit() ) oBrw := __objModMethod( oBrw, 'GetCellinfo', @Cell() ) А вот исходники функций #include "minigui.ch" #include "tsbrowse.ch" #include "ads.ch" #include "common.ch" Func Edit( uVar, nCell, nKey, nKeyFlags, cPicture, bValid, nClrFore, nClrBack ) LOCAL nRow, nHeight, cType, uValue, nI, aGet, oCol, cMsg, aRct, bChange, lSpinner, bUp, bDown, ; bMin, bMax, nStartX, nWidth, lCombo, lMulti, nCol, lLogicDrop, lPicker, nTxtHeight, hFont, ix LOCAL oBrw := QSelf() LOCAL cWnd := oBrw:cControlName LOCAL nK, aKey, oGet, cTmp, oCell DEFAULT nCell := oBrw:nCell, ; oBrw:lPostEdit := .F., ; oBrw:lNoPaint := .F. IF oBrw:lPhantArrRow RETURN NIL ENDIF oCol := oBrw:aColumns[ nCell ] oCol:xOldEditValue := oBrw:bDataEval( oCol, , nCell ) // Igor Nazarov DEFAULT oBrw:nHeightSuper := 0, ; nKey := VK_RETURN, ; nKeyFlags := 0, ; uVar := oBrw:bDataEval( oCol ), ; cPicture := oCol:cPicture, ; bValid := oCol:bValid, ; nClrFore := oCol:nClrEditFore, ; nClrBack := oCol:nClrEditBack IF ValType( oBrw:lInsertMode ) == "L" // Igor Nazarov IF IsInsertActive() != oBrw:lInsertMode iif( _HMG_IsXPorLater, KeyToggleNT( VK_INSERT ), KeyToggle( VK_INSERT ) ) ENDIF ENDIF uValue := uVar cType := iif( Empty( oCol:cDataType ), ValType( uValue ), oCol:cDataType ) IF cType != "M" .AND. oBrw:lIsArr .AND. oCol:cDataType # ValType( uValue ) // GF 15/07/2009 cType := ValType( uValue ) oCol:cDataType := cType ENDIF cMsg := oCol:cMsgEdit bChange := oCol:bChange lSpinner := oCol:lSpinner bUp := oCol:bUp bDown := oCol:bDown bMin := oCol:bMin bMax := oCol:bMax nStartX := 0 lCombo := lMulti := .F. oBrw:oGet := oBrw:bValid // JP oBrw:bValid := {|| ! oBrw:lEditing } // JP 1.58 IF ! oCol:lVisible oBrw:lChanged := .F. oBrw:lPostEdit := .F. oBrw:oWnd:nLastKey := VK_RIGHT oBrw:PostEdit( uVar, nCell, bValid ) RETURN NIL ENDIF // End IF oCol:bPassWord != NIL IF ! Eval( oCol:bPassWord, uValue, nCell, oBrw:nAt, Self ) RETURN NIL ENDIF ENDIF lLogicDrop := oBrw:lLogicDrop lPicker := oBrw:lPickerMode // MWS Sep 20/07 IF cType == 'T' lPicker := ( hb_Hour( uValue ) == 0 .AND. hb_Minute( uValue ) == 0 .AND. hb_Sec( uValue ) == 0 ) ENDIF oBrw:lEditing := .T. oBrw:lHitBottom := .F. IF oBrw:nLen > 0 oBrw:lNoPaint := .T. ENDIF IF oCol:bPrevEdit != NIL IF oBrw:lIsArr .AND. ( oBrw:lAppendMode .OR. oBrw:nAt > Len( oBrw:aArray ) ) // append mode for arrays ELSEIF nKey != VK_RETURN // GF 15-10-2015 uVar := Eval( oCol:bPrevEdit, uValue, Self, nCell, oCol ) IF ValType( uVar ) == "A" uVar := uVar[ 1 ] uValue := uVar[ 2 ] ENDIF IF ValType( uVar ) == "L" .AND. ! uVar nKey := VK_RETURN ENDIF ENDIF ENDIF oBrw:FastDrawClear( hb_ntos( oBrw:nAtPos ) + "." + hb_ntos( oCol:nId ) ) cMsg := iif( ValType( cMsg ) == "B", Eval( cMsg, Self, nCell ), cMsg ) IF cType == "L" .AND. oCol:lCheckBox IF nKey != VK_RETURN .OR. ! oCol:lCheckBoxNoReturn .OR. oBrw:lCheckBoxAllReturn IF Upper( Chr( nKey ) ) $ "YCST1" oBrw:lChanged := ( uVar == .F. ) uVar := .T. ELSEIF Upper( Chr( nKey ) ) $ "FN0" oBrw:lChanged := ( uVar == .T. ) uVar := .F. ELSEIF nKey == VK_SPACE .OR. nKey == VK_RETURN uVar := ! uValue oBrw:lChanged := .T. ELSE RETURN 0 ENDIF oBrw:lHasChanged := iif( oBrw:lChanged, .T., oBrw:lHasChanged ) oBrw:oWnd:nLastKey := VK_RETURN oBrw:PostEdit( uVar, nCell ) oBrw:lPostEdit := .F. RETURN 0 ELSE oBrw:lPostEdit := .T. oBrw:lChanged := .F. oBrw:oWnd:nLastKey := nKey oBrw:PostEdit( uValue, nCell ) oBrw:lPostEdit := .F. RETURN 0 ENDIF ENDIF IF oCol:bExtEdit != NIL // external edition oBrw:lNoPaint := oBrw:lEditing := .F. uVar := Eval( oCol:bExtEdit, uValue, Self ) oBrw:lChanged := ( ValType( uVar ) != ValType( uValue ) .OR. uVar != uValue ) oBrw:lPostEdit := .T. oBrw:oWnd:nLastKey := VK_RETURN oBrw:PostEdit( uVar, nCell, bValid ) RETURN NIL ENDIF hFont := iif( oCol:hFontEdit != NIL, oCol:hFontEdit, ; iif( oCol:hFont != NIL, oCol:hFont, oBrw:hFont ) ) IF oCol:oEdit != NIL oCol:oEdit:End() oCol:oEdit := NIL ENDIF 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 nClrFore := iif( ValType( nClrFore ) == "B", ; Eval( nClrFore, oBrw:nAt, nCell, Self ), nClrFore ) nClrBack := iif( ValType( nClrBack ) == "B", ; Eval( nClrBack, oBrw:nAt, nCell, Self ), nClrBack ) oCell := oBrw:GetCellInfo() nRow := oCell:nRow nCol := oCell:nCol nWidth := oCell:nWidth nHeight := oCell:nHeight IF oCol:nEditWidthDraw > 0 nWidth := oCol:nEditWidthDraw IF ! oBrw:lNoVScroll nWidth -= GetVScrollBarWidth() ENDIF ENDIF IF oCol:cResName != NIL .OR. oCol:lBtnGet nRow += oBrw:aEditCellAdjust[ 1 ] nCol += oBrw:aEditCellAdjust[ 2 ] nWidth += oBrw:aEditCellAdjust[ 3 ] nHeight += oBrw:aEditCellAdjust[ 4 ] IF oCol:nEditWidth > 0 nWidth := oCol:nEditWidth ENDIF IF oCol:nEditHeight > 0 nHeight := oCol:nEditHeight ENDIF IF oCol:nEditRow > 0 nRow := oCol:nEditRow ENDIF IF oCol:nEditCol > 0 nCol := oCol:nEditCol ENDIF oBrw:cChildControl := GetUniqueName( "BtnBox" ) oCol:oEdit := TBtnBox():New( nRow, nCol, bSETGET( uValue ), Self, nWidth, nHeight, ; cPicture, nClrFore, nClrBack, hFont, oBrw:cChildControl, cWnd, ; cMsg, bChange, bValid, oCol:cResName, oCol:bAction, ; lSpinner .AND. cType $ "ND", bUp, bDown, ; bMin, bMax, oCol:nBmpWidth, nCell ) oCol:oEdit:lAppend := oBrw:lAppendMode oCol:oEdit:Hide() ELSEIF ( cType == "C" .AND. Chr( 13 ) $ uValue ) .OR. cType == "M" .OR. oCol:lEditBox IF oCol:lEditBox .AND. ! Empty( uValue := Trim( uValue ) ) IF Len( oCol:cEditBoxSep ) > 0 .AND. oCol:cEditBoxSep != CRLF .AND. oCol:cEditBoxSep $ uValue uValue := StrTran( uValue, oCol:cEditBoxSep, CRLF ) ENDIF IF oCol:nEditBoxWrap > 0 cTmp := uValue nK := MLCount( cTmp, oCol:nEditBoxWrap, , .T. ) uValue := "" FOR nI := 1 TO nK uValue += Trim( MemoLine( cTmp, oCol:nEditBoxWrap, nI, , .T. ) ) IF nI != nK uValue += CRLF ENDIF NEXT ENDIF ENDIF IF oBrw:nMemoHE == NIL IF ! Empty( uValue ) nHeight := Max( 5, StrCharCount( uValue, Chr( 10 ) ) ) ELSE nHeight := 5 ENDIF ELSE nHeight := oBrw:nMemoHE ENDIF aRct := oBrw:GetCliRect( oBrw:hWnd ) IF oBrw:nMemoWE == NIL .OR. Empty( oBrw:nMemoWE ) nWidth := Max( nWidth, GetTextWidth( 0, SubStr( uValue, 1, ; At( Chr( 13 ), uValue ) - 1 ), ; iif( hFont != NIL, hFont, 0 ) ) ) nWidth := Min( nWidth, Int( aRct[ 3 ] * .8 ) ) ELSE nWidth := oBrw:nMemoWE ENDIF nTxtHeight := SBGetHeight( oBrw:hWnd, iif( hFont != NIL, hFont, 0 ), 0 ) WHILE ( nRow + ( nTxtHeight * nHeight ) ) > aRct[ 4 ] nRow -= nTxtHeight ENDDO nI := nCol + nWidth - aRct[ 3 ] nCol -= iif( nI <= 0, 0, nI ) nCol := Max( 10, nCol ) nHeight *= nTxtHeight nRow += oBrw:aEditCellAdjust[ 1 ] nCol += oBrw:aEditCellAdjust[ 2 ] nWidth += oBrw:aEditCellAdjust[ 3 ] nHeight += oBrw:aEditCellAdjust[ 4 ] oBrw:cChildControl := GetUniqueName( "EditBox" ) oCol:oEdit := TSMulti():New( nRow, nCol, bSETGET( uValue ), Self, nWidth, nHeight, ; hFont, nClrFore, nClrBack, oBrw:cChildControl, cWnd ) oCol:oEdit:bGotFocus := {|| oCol:oEdit:HideSel(), oCol:oEdit:SetPos( 0 ) } lMulti := .T. IF oCol:lEditBoxROnly oCol:oEdit:SendMsg( EM_SETREADONLY, 1, 0 ) ENDIF oCol:oEdit:Hide() ELSEIF ( cType == "L" .AND. lLogicDrop ) .OR. oCol:lComboBox lCombo := .T. IF oCol:lComboBox aGet := oCol:aItems IF Empty( aGet ) RETURN NIL ENDIF IF nKey == VK_RETURN IF oCol:cDataType != NIL .AND. oCol:cDataType == "N" IF oCol:aData <> NIL uValue := Max( 1, AScan( aGet, uValue ) ) ELSE uValue := iif( uValue < 1 .OR. uValue > Len( aGet ), 1, uValue ) ENDIF ELSE uValue := Max( 1, AScan( aGet, uValue ) ) ENDIF ELSE uValue := Max( 1, AScan( aGet, Upper( Chr( nKey ) ) ) ) ENDIF IF ValType( oBrw:bDataEval( oCol ) ) == "N" nWidth := 0 AEval( aGet, {| x | nWidth := Max( Len( x ), nWidth ) } ) nWidth := Max( GetTextWidth( 0, Replicate( 'B', nWidth ), hFont ), oCol:nWidth ) ENDIF nHeight := Max( 10, Min( 10, Len( aGet ) ) ) * oBrw:nHeightCell ELSE aGet := { oBrw:aMsg[ 1 ], oBrw:aMsg[ 2 ] } IF nKey == VK_RETURN uValue := iif( uValue, 1, 2 ) ELSE uValue := Max( 1, AScan( aGet, Upper( Chr( nKey ) ) ) ) ENDIF nHeight := oBrw:nHeightCell * 4 // 1. ENDIF nRow += oBrw:aEditCellAdjust[ 1 ] nCol += oBrw:aEditCellAdjust[ 2 ] nWidth += oBrw:aEditCellAdjust[ 3 ] nHeight += oBrw:aEditCellAdjust[ 4 ] IF oCol:nEditWidth > 0 nWidth := oCol:nEditWidth ENDIF IF oCol:nEditHeight > 0 nHeight := oCol:nEditHeight ENDIF IF oCol:nEditRow > 0 nRow := oCol:nEditRow ENDIF IF oCol:nEditCol > 0 nCol := oCol:nEditCol ENDIF oBrw:cChildControl := GetUniqueName( "ComboBox" ) oCol:oEdit := TComboBox():New( nRow, nCol, bSETGET( uValue ), aGet, nWidth, nHeight, ; Self, bChange, nClrFore, nClrBack, hFont, cMsg, oBrw:cChildControl, cWnd ) oCol:oEdit:lAppend := oBrw:lAppendMode ELSEIF ( cType $ "DT" ) .AND. lPicker // MWS Sep 20/07 nRow -= 2 nHeight := Max( oBrw:nHeightCell, 19 ) nRow += oBrw:aEditCellAdjust[ 1 ] nCol += oBrw:aEditCellAdjust[ 2 ] nWidth += oBrw:aEditCellAdjust[ 3 ] nHeight += oBrw:aEditCellAdjust[ 4 ] IF oCol:nEditWidth > 0 nWidth := oCol:nEditWidth ENDIF IF oCol:nEditHeight > 0 nHeight := oCol:nEditHeight ENDIF IF oCol:nEditRow > 0 nRow := oCol:nEditRow ENDIF IF oCol:nEditCol > 0 nCol := oCol:nEditCol ENDIF oBrw:cChildControl := GetUniqueName( "DatePicker" ) oCol:oEdit := TDatePicker():New( nRow, nCol, bSETGET( uValue ), Self, nWidth, nHeight, ; cPicture,, nClrFore, nClrBack, hFont, oBrw:cChildControl,, cWnd, ; cMsg,,,,, bChange,,, oBrw:lShowNone, oBrw:lUpDown ) oCol:oEdit:Hide() ELSE ix := GetControlIndex ( cWnd, oBrw:cParentWnd ) IF _HMG_aControlContainerRow[ ix ] == -1 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 IF oCol:nEditWidth > 0 nWidth := oCol:nEditWidth ENDIF IF oCol:nEditHeight > 0 nHeight := oCol:nEditHeight ENDIF IF oCol:nEditRow > 0 nRow := oCol:nEditRow ENDIF IF oCol:nEditCol > 0 nCol := oCol:nEditCol ENDIF IF oCol:cEditPicture != NIL cPicture := oCol:cEditPicture ENDIF oBrw:cChildControl := GetUniqueName( "GetBox" ) oCol:oEdit := TGetBox():New( nRow, nCol, bSETGET( uValue ), oBrw, nWidth, nHeight, ; cPicture,, nClrFore, nClrBack, hFont, oBrw:cChildControl, cWnd, ; cMsg,,,,, bChange, .T.,, lSpinner .AND. cType $ "ND", bUp, bDown, ; bMin, bMax, oCol:lNoMinus ) IF oCol:nEditAlign != NIL _SetAlign( oBrw:cChildControl, oBrw:cParentWnd, { "LEFT", "CENTER", "RIGHT" }[ oCol:nEditAlign + 1 ] ) ENDIF IF ! Empty( oCol:aKeyEvent ) oGet := oCol:oEdit:oGet FOR nK := 1 TO Len( oCol:aKeyEvent ) aKey := oCol:aKeyEvent[ nK ] IF HB_ISNUMERIC( aKey[ 1 ] ) oGet:SetKeyEvent( aKey[ 1 ], aKey[ 2 ], aKey[ 3 ], aKey[ 4 ], aKey[ 5 ] ) ENDIF NEXT ENDIF ENDIF IF oCol:oEdit != NIL oCol:oEdit:oBrw := oBrw oCol:oEdit:oCol := oCol oCol:oEdit:nCol := nCell oCol:oEdit:bLostFocus := {| nKey | oBrw:EditExit( nCell, nKey, uValue, bValid, .F. ) } oCol:oEdit:bKeyDown := {| nKey, nFlags, lExit | iif( lExit != NIL .AND. lExit, ; oBrw:EditExit( nCell, nKey, uValue, bValid ), Nil ), HB_SYMBOL_UNUSED( nFlags ) } DO CASE CASE "TBTNBOX" $ Upper( oCol:oEdit:ClassName() ) oCol:oEdit:bLostFocus := NIL CASE "TGETBOX" $ Upper( oCol:oEdit:ClassName() ) ix := GetControlIndex ( oBrw:cChildControl, oBrw:cParentWnd ) _HMG_InteractiveCloseStarted := .T. IF ix > 0 IF oCol:lOnGotFocusSelect IF ValType( uValue ) == "C" _HMG_aControlGotFocusProcedure[ ix ] := {|| SendMessage( _HMG_aControlHandles[ ix ], EM_SETSEL, 0, iif( Empty( uValue ), -1, Len( Trim(uValue ) ) ) ) } ELSEIF ValType( uValue ) $ "ND" _HMG_aControlGotFocusProcedure[ ix ] := {|| SendMessage( _HMG_aControlHandles[ ix ], EM_SETSEL, 0, -1 ) } ENDIF ENDIF _HMG_aControlLostFocusProcedure[ ix ] := {| nKey | oBrw:EditExit( nCell, nKey, uValue, bValid, .F. ) } ENDIF IF Empty( oBrw:bLostFocus ) oBrw:bLostFocus := {|| iif( _HMG_InteractiveCloseStarted, _HMG_InteractiveCloseStarted := .F., ) } ENDIF ENDCASE oCol:oEdit:SetFocus() IF nKey != NIL .AND. nKey > 31 IF ! lCombo .AND. ! lMulti oBrw:KeyChar( nKey, nKeyFlags ) // 1.53 ENDIF ENDIF IF oCol:oEdit != NIL oCol:oEdit:Show() ENDIF oBrw:SetMsg( oCol:cMsgEdit ) IF oCol:bEditing != NIL Eval( oCol:bEditing, uValue, Self ) ENDIF ENDIF Return nil Func Cell() LOCAL nI, nStartX := 0, oCol, cBrw, cForm, nRowPos, nCell, lColSpecHd, oBrw LOCAL nRow, nCol, nWidth, nHeight LOCAL lHead := .F., lFoot := .F. LOCAL oCell := TSBcell():New() oBrw:= QSelf() nRowPos := oBrw:nRowPos nCell := oBrw:nCell lColSpecHd := oBrw:nColSpecHd != 0 IF HB_ISLOGICAL( nRowPos ) IF nRowPos ; lHead := .T. ELSE ; lFoot := .T. ENDIF nRowPos := NIL lColSpecHd := .F. ENDIF DEFAULT nRowPos := oBrw:nRowPos, ; nCell := QnCell, ; 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 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, 1 ) 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, 2, 0 ) nCol := nStartX + iif( oCol:l3DLook, 2, 0 ) nWidth := oBrw:GetColSizes()[ nCell ] - iif( oCol:l3DLook, 2, 0 ) nHeight := oBrw:nHeightCell - iif( oCol:l3DLook, 1, -1 ) ENDIF IF oCol:nEditWidthDraw > 0 nWidth := oCol:nEditWidthDraw IF ! oBrw:lNoVScroll nWidth -= GetVScrollBarWidth() ENDIF ENDIF IF lHead nRow := oBrw:nHeightSuper + iif( oCol:l3DLook, 2, 0 ) + 1 nHeight := oBrw:nHeightHead ELSEIF lFoot nRow := _GetClientRect( oBrw:hWnd )[ 4 ] - oBrw:nHeightFoot + 1 nHeight := oBrw:nHeightFoot ENDIF oCell:nRow := nRow oCell:nCol := nCol - 1 oCell:nWidth := nWidth oCell:nHeight := nHeight - 3 RETURN oCell [/pre]

SergKis: Haz пишет У себя , когда лень менять исходники делаю замену А мне всегда лень это делать, обхожусь вариантом modal окон как в примере Tsb_addrecord_3 ф-я STATIC FUNCTION Add_Rec( oBrw ) только для всех вариантов ведения (Add, Add+Copy, Del, Edit) и окно может быть как для одной Cell так и нескольких, а GETBOX-ы иметь встроенные кнопки для ACTION и ACTION2

Haz: SergKis пишет: А мне всегда лень это делать, обхожусь вариантом modal окон как в примере Tsb_addrecord_3 ф-я STATIC FUNCTION Add_Rec( oBrw ) только для всех вариантов ведения (Add, Add+Copy, Del, Edit) и окно может быть как для одной Cell так и нескольких, а GETBOX-ы иметь встроенные кнопки для ACTION и ACTION2 Сергей , привет. Согласен, с твоей подачи тоже использую MODAL, подмены метода использую для быстрого моделирования. ну чтоб не совсем стыдно было черновик показывать Потом можно бесконечно наводить красоту.



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