rathinagiri wrote:Oh! That's nice Roberto. I will check and report.
My suggestion:
set cellnavigation excel|dbf
That was the user's request 'I want it like Excel'
This is the reason I've done another modification.
Now, exiting with TAB from edit mode, the cursor goes right (the same as Excel).
Now, you must to initialize two memory slots in h_init.prg:
Code: Select all
_HMG_SYSDATA [ 284 ] := .F.
_HMG_SYSDATA [ 285 ] := .F.
In h_grid.prg you must change two functions:
Code: Select all
*-----------------------------------------------------------------------------*
PROCEDURE _HMG_GRIDINPLACEKBDEDIT_2(i)
*-----------------------------------------------------------------------------*
LOCAL TmpRow
LOCAL XS
LOCAL XD
LOCAL R
LOCAL IPE_MAXCOL
LOCAL S
Local aColumnWhen := _HMG_SYSDATA [ 40 ] [ i ] [ 6 ]
Local j
Local nWhenRow
Local xTmpCellValue
Local aTemp
//Problem3031
_HMG_GRID_KBDSCROLL(I)
If _HMG_SYSDATA [ 15 ] [i] == 1
r := LISTVIEW_GETITEMRECT ( _HMG_SYSDATA [3] [i] , _HMG_SYSDATA [ 39 ] [i] - 1 )
Else
r := LISTVIEW_GETSUBITEMRECT ( _HMG_SYSDATA [3] [i] , _HMG_SYSDATA [ 39 ] [i]- 1 , _HMG_SYSDATA [ 15 ] [i] - 1 )
EndIf
nWhenRow := _HMG_SYSDATA [ 195]
_HMG_SYSDATA [ 197 ] := _HMG_SYSDATA [ 18 ] [i] + r [1]
_HMG_SYSDATA [ 198 ] := _HMG_SYSDATA [ 19 ] [i] + r [2]
_HMG_SYSDATA [ 199 ] := r[3]
_HMG_SYSDATA [ 200 ] := r[4]
*
_HMG_SYSDATA [ 194 ] := ascan ( _HMG_SYSDATA [ 67 ] , _HMG_SYSDATA [4][i] )
_HMG_SYSDATA [ 231 ] := 'C'
_HMG_SYSDATA [ 203 ] := i
_HMG_SYSDATA [ 316 ] := _HMG_SYSDATA [ 66 ] [ _HMG_SYSDATA [ 194 ] ]
_HMG_SYSDATA [ 317 ] := _HMG_SYSDATA [2] [_HMG_SYSDATA [ 203 ]]
*
S := _HMG_GRIDINPLACEEDIT(I)
IF _HMG_SYSDATA [ 32 ] [I] .AND. _HMG_SYSDATA [ 245 ] == .F.
IF _HMG_SYSDATA [ 15 ] [I] < LEN(_HMG_SYSDATA [ 7 ] [I])
IF _HMG_SYSDATA [ 40 ] [ I ] [ 32 ] == 0
IF S
IF .NOT. _HMG_SYSDATA [ 285 ]
IF _HMG_SYSDATA [ 284 ]
InsertDown()
ELSE
_HMG_SYSDATA [ 15 ] [I]++
ENDIF
ELSE
_HMG_SYSDATA [ 15 ] [I]++
_HMG_SYSDATA [ 285 ] := .F.
ENDIF
If ValType ( aColumnWhen ) == 'A'
nStart := _HMG_SYSDATA [ 15 ] [I]
nEnd := Len ( aColumnWhen )
For j := nStart To nEnd
If ValType ( aColumnWhen [j] ) == 'B'
*******************************************************************************************************************************
IF _HMG_SYSDATA [ 40 ] [ i ] [ 9 ] == .F.
aTemp := this.item( nWhenRow )
xTmpCellValue := aTemp [j]
ELSE
_HMG_SYSDATA [ 201 ] := nWhenRow // QueryRowIndex
_HMG_SYSDATA [ 202 ] := j // QueryColIndex
_HMG_SYSDATA [ 320 ] := .T.
IF valtype ( _HMG_SYSDATA [ 40 ] [ i ] [ 10 ] ) == 'C'
GetDataGridCellData ( i , .t. )
ELSE
Eval( _HMG_SYSDATA [ 6 ] [ i ] )
ENDIF
_HMG_SYSDATA [ 320 ] := .F.
xTmpCellValue := _HMG_SYSDATA [ 230 ]
ENDIF
********************************************************************************************************************************
_HMG_SYSDATA [ 318 ] := xTmpCellValue
_HMG_SYSDATA [ 232 ] := 'GRID_WHEN'
lResult := Eval ( aColumnWhen [j] )
_HMG_SYSDATA [ 232 ] := ''
If lResult == .F.
_HMG_SYSDATA [ 15 ] [I]++
Else
Exit
EndIf
EndIf
Next j
IF .NOT. _HMG_SYSDATA [ 284 ]
IF _HMG_SYSDATA [ 15 ] [I] > nEnd
_HMG_SYSDATA [ 15 ] [I] := nStart - 1
ENDIF
ENDIF
EndIf
ENDIF
ENDIF
ELSEIF _HMG_SYSDATA [ 15 ] [I] == LEN(_HMG_SYSDATA [ 7 ] [I])
IF _HMG_SYSDATA [ 40 ] [ I ] [ 32 ] == 0
IF S
IF .NOT. _HMG_SYSDATA [ 285 ]
IF .NOT. _HMG_SYSDATA [ 284 ]
_HMG_SYSDATA [ 15 ] [I] := 1
ELSE
InsertDown()
ENDIF
ELSE
_HMG_SYSDATA [ 15 ] [I] := 1
_HMG_SYSDATA [ 285 ] := .F.
ENDIF
ENDIF
ENDIF
ENDIF
LISTVIEW_REDRAWITEMS( _HMG_SYSDATA[3][I] , _HMG_SYSDATA[39][I]-1 , _HMG_SYSDATA[39][I]-1 )
_DoControlEventProcedure ( _HMG_SYSDATA [ 12 ] [i] , i )
ENDIF
_HMG_SYSDATA [ 203 ] := 0
_HMG_SYSDATA [ 231 ] := ''
_HMG_SYSDATA [ 195 ] := 0
_HMG_SYSDATA [ 196 ] := 0
_HMG_SYSDATA [ 197 ] := 0
_HMG_SYSDATA [ 198 ] := 0
_HMG_SYSDATA [ 199 ] := 0
_HMG_SYSDATA [ 200 ] := 0
*
_HMG_SYSDATA [ 194 ] := 0
_HMG_SYSDATA [ 232 ] := ''
_HMG_SYSDATA [ 316 ] := ''
_HMG_SYSDATA [ 317 ] := ''
*
RETURN
And:
Code: Select all
*-----------------------------------------------------------------------------*
FUNCTION _HMG_GRIDINPLACEEDIT(IDX)
*-----------------------------------------------------------------------------*
Local r , c , h , i , aTemp , ri , ci , X , DW := 0, DH := 0 , DR := 0 , DC := 0
LOCAL AEDITCONTROLS
LOCAL AEC := 'TEXTBOX'
LOCAL AITEMS := {}
LOCAL ARANGE := {}
LOCAL DTYPE := 'D'
LOCAL ALABELS := { '.T.' ,'.F.' }
LOCAL CTYPE := 'CHARACTER'
LOCAL CINPUTMASK := ''
LOCAL CFORMAT := ''
LOCAL XRES := {}
LOCAL CVA
LOCAL CWH
LOCAL VALID
LOCAL WHEN
LOCAL GFN
LOCAL GFS
LOCAL V
Local nWx := 0
Local nHx := 0
LOCAL ARETURNVALUES
LOCAL Z
Local xValue := 0
Local cRecordSource
Local b
If _HMG_SYSDATA [ 232 ] == 'GRID_WHEN'
MsgHMGError("GRID: Editing within a grid 'when' event procedure is not allowed. Program terminated" )
EndIf
If _HMG_SYSDATA [ 232 ] == 'GRID_VALID'
MsgHMGError("GRID: Editing within a grid 'valid' event procedure is not allowed. Program terminated" )
EndIf
IF _HMG_SYSDATA [32] [idx] == .F.
If This.CellRowIndex != LISTVIEW_GETFIRSTITEM ( _HMG_SYSDATA [3] [ idx ] )
Return .f.
EndIf
ELSE
If This.CellRowIndex != _HMG_SYSDATA [39] [ idx ]
Return .f.
EndIf
ENDIF
ri := This.CellRowIndex
ci := This.CellColIndex
if ri == 0 .or. ci == 0
return .f.
endif
IF valtype ( _HMG_SYSDATA [ 40 ] [ idx ] [ 10 ] ) == 'C'
if IsDataGridDeleted ( idx , ri )
return .f.
endif
cRecordSource := _HMG_SYSDATA [ 40 ] [ idx ] [ 10 ]
if &cRecordSource->(RddName()) == 'PGRDD'
MsgHMGError("GRID: Modify PostGre RDD tables is not allowed. Program terminated" )
endif
if &cRecordSource->(RddName()) == 'SQLMIX'
MsgHMGError("GRID: Modify SQLMIX RDD tables is not allowed. Program terminated" )
endif
endif
GFN := _HMG_SYSDATA [ 27 ] [idx]
GFS := _HMG_SYSDATA [ 28 ] [idx]
//Problem3031
IF _HMG_SYSDATA [ 40 ] [ idx ] [ 9 ] == .F.
aTemp := this.item(ri)
v := aTemp [ci]
ELSE
_HMG_SYSDATA [ 201 ] := ri // QueryRowIndex
_HMG_SYSDATA [ 202 ] := ci // QueryColIndex
_HMG_SYSDATA [ 320 ] := .T.
IF valtype ( _HMG_SYSDATA [ 40 ] [ idx ] [ 10 ] ) == 'C'
GetDataGridCellData ( idx , .t. )
ELSE
Eval( _HMG_SYSDATA [ 6 ] [ idx ] )
ENDIF
_HMG_SYSDATA [ 320 ] := .F.
v := _HMG_SYSDATA [ 230 ] // QueryData
ENDIF
CWH := _HMG_SYSDATA [40] [IDX] [6]
//Problem3031
IF VALTYPE ( CWH ) = 'A'
IF LEN ( CWH ) >= CI
IF VALTYPE ( CWH [CI] ) = 'B'
_HMG_SYSDATA [ 318 ] := V
_HMG_SYSDATA [ 232 ] := 'GRID_WHEN'
WHEN := EVAL ( CWH [CI] )
_HMG_SYSDATA [ 232 ] := ''
IF WHEN = .F.
_HMG_SYSDATA [ 256 ] := .F.
RETURN .f.
ENDIF
ENDIF
ENDIF
ENDIF
h := _HMG_SYSDATA [3] [IDX]
r := This.CellRow + GetWindowRow ( h ) - this.row - 1
if _HMG_SYSDATA [ 23 ] [idx] <> -1
r := r - _HMG_SYSDATA [ 23 ] [idx]
endif
c := This.CellCol + GetWindowCol ( h ) - this.col + 2
if _HMG_SYSDATA [ 24 ] [idx] <> -1
c := c - _HMG_SYSDATA [ 24 ] [idx]
endif
AEDITCONTROLS := _HMG_SYSDATA [ 40 ] [ IDX ] [ 2 ]
CVA := _HMG_SYSDATA [ 40 ] [ IDX ] [ 5 ]
XRES := _HMG_PARSEGRIDCONTROLS ( AEDITCONTROLS , CI )
AEC := XRES [1]
CTYPE := XRES [2]
CINPUTMASK := XRES [3]
CFORMAT := XRES [4]
AITEMS := XRES [5]
ARANGE := XRES [6]
DTYPE := XRES [7]
ALABELS := XRES [8]
ARETURNVALUES := XRES [9]
IF AEC = 'COMBOBOX'
DH := 1
ELSEIF AEC = 'CHECKBOX'
DR := 3
DH := -7
ELSEIF AEC = 'EDITBOX'
_HMG_SYSDATA [321] := .T.
ENDIF
_HMG_SYSDATA [ 109 ] := GetActiveWindow()
* Grid Valid Event Procedure Values
_HMG_SYSDATA [ 209 ] := idx
*
_HMG_SYSDATA [ 245 ] := .F.
IF AEC = 'EDITBOX'
// + IF ( IsVista() .and. IsAppThemed() , 9 , 0 )
// + IF ( IsVista() .and. IsAppThemed() , 6 , 0 )
DEFINE WINDOW _hmg_grid_inplaceedit AT 0 , 0 ;
WIDTH 350 ;
HEIGHT 350 + IF ( IsAppThemed() , 3 , 0 ) ;
TITLE _HMG_SYSDATA [ 7 ] [ idx ] [ ci ] ;
MODAL ;
NOSIZE ;
SHORTTITLEBAR
else
DEFINE WINDOW _hmg_grid_inplaceedit AT r + DR , c + DC ;
WIDTH This.CellWidth + DW ;
HEIGHT This.CellHeight + 6 + DH ;
TITLE '' ;
MODAL NOSIZE NOCAPTION
endif
ON KEY ESCAPE ACTION ( _HMG_SYSDATA [ 256 ] := .T. , THISWINDOW.RELEASE )
IF AEC = 'EDITBOX'
ON KEY CONTROL+W ACTION IF ( _ISWINDOWACTIVE ( '_hmg_grid_inplaceedit' ) , ( _HMG_SYSDATA [ 256 ] := .F. , _HMG_GRIDINPLACEEDITOK ( IDX , CI , RI , AEC , ALABELS , CTYPE , CINPUTMASK , CFORMAT , CVA , aReturnValues ) ) , NIL )
define button ok
row 298
col 278 - IF ( IsAppThemed() , 1 , 0 )
width 28
height 28
action IF ( _ISWINDOWACTIVE ( '_hmg_grid_inplaceedit' ) , ( _HMG_SYSDATA [ 256 ] := .F. , _HMG_GRIDINPLACEEDITOK ( IDX , CI , RI , AEC , ALABELS , CTYPE , CINPUTMASK , CFORMAT , CVA , aReturnValues ) ) , NIL )
picture 'GRID_MSAV'
tooltip _hmg_sysdata [ 133 ] [ 12 ] + ' [Ctrl+W]'
end button
define button cancel
row 298
col 312 - IF ( IsAppThemed() , 1 , 0 )
width 28
height 28
action ( _HMG_SYSDATA [ 256 ] := .T. , THISWINDOW.RELEASE )
picture 'GRID_MCAN'
tooltip _hmg_sysdata [ 133 ] [ 13 ] + ' [Esc]'
end button
ELSE
ON KEY RETURN ACTION IF ( _ISWINDOWACTIVE ( '_hmg_grid_inplaceedit' ) , ( _HMG_SYSDATA [ 256 ] := .F. , _HMG_GRIDINPLACEEDITOK ( IDX , CI , RI , AEC , ALABELS , CTYPE , CINPUTMASK , CFORMAT , CVA , aReturnValues ) ) , NIL )
ON KEY TAB ACTION ( _HMG_SYSDATA [ 285 ] := .T. , InsertReturn() )
ENDIF
ON KEY F2 ACTION IF ( _ISWINDOWACTIVE ( '_hmg_grid_inplaceedit' ) , ( _HMG_SYSDATA [ 256 ] := .F. , _HMG_GRIDINPLACEEDITOK ( IDX , CI , RI , AEC , ALABELS , CTYPE , CINPUTMASK , CFORMAT , CVA , aReturnValues ) ) , NIL )
IF AEC == 'TEXTBOX' //*****************************************
IF _HMG_SYSDATA [321] == .F.
DEFINE TEXTBOX T
ELSE
DEFINE EDITBOX T
HSCROLLBAR .F.
VSCROLLBAR .F.
ENDIF
FONTNAME GFN
FONTSIZE GFS
ROW 0
COL 0
WIDTH This.CellWidth + nWx
HEIGHT This.CellHeight + 6 + nHx
IF CTYPE == 'NUMERIC'
NUMERIC .T.
ELSEIF CTYPE == 'DATE'
DATE .T.
ENDIF
VALUE v
IF ! EMPTY ( CINPUTMASK )
INPUTMASK CINPUTMASK
ENDIF
IF ! EMPTY ( CFORMAT )
FORMAT CFORMAT
ENDIF
IF _HMG_SYSDATA [321] == .F.
END TEXTBOX
ELSE
END EDITBOX
ENDIF
ELSEIF AEC == 'EDITBOX' //**********************************************
DEFINE EDITBOX T
HSCROLLBAR .T.
VSCROLLBAR .T.
FONTNAME GFN
FONTSIZE GFS
ROW 2
COL 2
WIDTH 340
HEIGHT 292
VALUE v
END EDITBOX
ELSEIF AEC == 'DATEPICKER' //*******************************************
DEFINE DATEPICKER D
FONTNAME GFN
FONTSIZE GFS
ROW 0
COL 0
WIDTH This.CellWidth
HEIGHT This.CellHeight + 6
VALUE V
SHOWNONE .T.
IF DTYPE = 'DROPDOWN'
UPDOWN .F.
ELSEIF DTYPE = 'UPDOWN'
UPDOWN .T.
ENDIF
END DATEPICKER
ELSEIF AEC == 'COMBOBOX' //********************************************
DEFINE COMBOBOX C
FONTNAME GFN
FONTSIZE GFS
ROW 0
COL 0
WIDTH This.CellWidth
ITEMS AITEMS
IF LEN ( ARETURNVALUES ) == 0
VALUE v
ELSE
For z := 1 To Len ( aReturnValues )
if v = aReturnValues [z]
xValue := z
exit
endif
Next z
if xValue == 0
xValue := 1
endif
VALUE xValue
ENDIF
ONDROPDOWN _hmg_grid_disablekeys()
ONCLOSEUP _hmg_grid_enablekeys( IDX , CI , RI , AEC , ALABELS , CTYPE , CINPUTMASK , CFORMAT , CVA , aReturnValues )
END COMBOBOX
ELSEIF AEC == 'SPINNER' //*********************************************
DEFINE SPINNER S
FONTNAME GFN
FONTSIZE GFS
ROW 0
COL 0
WIDTH This.CellWidth
HEIGHT This.CellHeight + 6
VALUE V
RANGEMIN ARANGE [1]
RANGEMAX ARANGE [2]
END SPINNER
ELSEIF AEC == 'CHECKBOX' //********************************************
DEFINE CHECKBOX C
FONTNAME GFN
FONTSIZE GFS
ROW 0
COL 0
WIDTH This.CellWidth + DW
HEIGHT This.CellHeight + 6 + DH
VALUE V
IF V == .T.
CAPTION ALABELS [1]
ELSEIF V == .F.
CAPTION ALABELS [2]
ENDIF
BACKCOLOR WHITE
ONCHANGE IF ( THIS.VALUE == .T. , THIS.CAPTION := ALABELS [1] , THIS.CAPTION := ALABELS [2] )
END CHECKBOX
ENDIF
END WINDOW
IF AEC = 'EDITBOX'
SETFOCUS ( GetControlHandle( 't' , '_hmg_grid_inplaceedit' ) )
CENTER WINDOW _hmg_grid_inplaceedit
ENDIF
ACTIVATE WINDOW _hmg_grid_inplaceedit
_HMG_SYSDATA [ 109 ] := 0
SETFOCUS ( _HMG_SYSDATA [3] [IDX] )
_HMG_SYSDATA [321] := .F.
RETURN .t.
Please, test it.