HMG 3.0.39

HMG announcements; Latest HMG-related news, releases, fixes and updates.

Moderator: Rathinagiri

User avatar
Roberto Lopez
HMG Founder
Posts: 4004
Joined: Wed Jul 30, 2008 6:43 pm

Re: HMG 3.0.39

Post by Roberto Lopez »

Hi Rathi,

I have a proposition for a small experimental addition to 3.0.39.

An user asked to me for loading data in a 'cellnavigation' grid, by column.

I mean, that instead of moving cursor to the right when you accepted cell editing, the cursor should be moved down.

I've made this optional and used an _HMG_SYSDATA unused slot as flag.

To test it, please add the following at init.prg (about line #650):

Code: Select all

	_HMG_SYSDATA [ 284 ] := .F.
Then replace the function _HMG_GRIDINPLACEKBDEDIT_2 in h_grid.prg with the following:

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 _HMG_SYSDATA [ 284 ]
						InsertDown()
					ELSE
						_HMG_SYSDATA [ 15 ] [I]++
					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 _HMG_SYSDATA [ 15 ] [I] > nEnd

							_HMG_SYSDATA [ 15 ] [I] := nStart - 1

						ENDIF

					EndIf

				ENDIF

			ENDIF

		ELSEIF _HMG_SYSDATA [ 15 ] [I] == LEN(_HMG_SYSDATA [  7 ] [I])

			IF _HMG_SYSDATA [ 40 ] [ I ] [ 32 ] == 0

			        IF S
					_HMG_SYSDATA [ 15 ] [I] := 1
				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
To activate it, you must simply set the flag value to .t.:

Code: Select all

 _HMG_SYSDATA [ 284 ] := .T.
Please test it. If you like it and if it is working fine, we should create a SET command to swith it, but I've not found and adequate name to it yet :)

Any idea?
Regards/Saludos,

Roberto


(Veritas Filia Temporis)
User avatar
esgici
Posts: 4543
Joined: Wed Jul 30, 2008 9:17 pm
DBs Used: DBF
Location: iskenderun / Turkiye
Contact:

Re: HMG 3.0.39

Post by esgici »

Hi

Does this subject isn't related to that : http://hmgforum.com/viewtopic.php?f=2&t=1351 :?:

Best regards

--

Esgici
Viva INTERNATIONAL HMG :D
User avatar
Roberto Lopez
HMG Founder
Posts: 4004
Joined: Wed Jul 30, 2008 6:43 pm

Re: HMG 3.0.39

Post by Roberto Lopez »

Hi All,

I've found a bug and fixed.

The correct function is the following:

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 _HMG_SYSDATA [ 284 ]
						InsertDown()
					ELSE
						_HMG_SYSDATA [ 15 ] [I]++
					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 [ 284 ]
						_HMG_SYSDATA [ 15 ] [I] := 1
					ELSE
						InsertDown()
					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
Regards/Saludos,

Roberto


(Veritas Filia Temporis)
User avatar
Roberto Lopez
HMG Founder
Posts: 4004
Joined: Wed Jul 30, 2008 6:43 pm

Re: HMG 3.0.39

Post by Roberto Lopez »

esgici wrote:Hi

Does this subject isn't related to that : http://hmgforum.com/viewtopic.php?f=2&t=1351 :?:

Best regards

--

Esgici
That topic refers to LOCKCOLUMNS that is a different thing.
Regards/Saludos,

Roberto


(Veritas Filia Temporis)
User avatar
Rathinagiri
Posts: 5471
Joined: Tue Jul 29, 2008 6:30 pm
DBs Used: MariaDB, SQLite, SQLCipher and MySQL
Location: Sivakasi, India
Contact:

Re: HMG 3.0.39

Post by Rathinagiri »

Oh! That's nice Roberto. I will check and report.

My suggestion:

set cellnavigation excel|dbf
East or West HMG is the Best.
South or North HMG is worth.
...the possibilities are endless.
User avatar
Rathinagiri
Posts: 5471
Joined: Tue Jul 29, 2008 6:30 pm
DBs Used: MariaDB, SQLite, SQLCipher and MySQL
Location: Sivakasi, India
Contact:

Re: HMG 3.0.39

Post by Rathinagiri »

It's working nice with the following sample Roberto:

Code: Select all

#include <hmg.ch>

Function Main
   _HMG_SYSDATA [ 284 ] := .T.
   define window sample at 0, 0 width 320 height 200 title 'Sample Cell Navigation Downwards...' main
      define grid grid_1
         row 10
         col 10
         width 300
         height 150
         widths { 100, 170 }
         headers { 'Sl.No.', 'Name' }
         cellnavigation .t.
         columnwhen { {|| .t. }, {|| .t. } }
         columncontrols { { 'TEXTBOX', 'NUMERIC', '999' }, { 'TEXTBOX', 'CHARACTER' } }
         allowedit .t.
         items { { 0, '' }, { 0, '' }, { 0, '' }, { 0, '' }, { 0, '' }, { 0, '' }, { 0, '' }, { 0, '' }, { 0, '' } }
      end grid         
   end window
   sample.center
   sample.activate
   Return
My doubts:

1. Like row editing, why should not the cell right below is in edit mode? ie., we have to press enter again to start editing.

2. If cellnavigation is set to .f., this feature has no effect?
East or West HMG is the Best.
South or North HMG is worth.
...the possibilities are endless.
User avatar
esgici
Posts: 4543
Joined: Wed Jul 30, 2008 9:17 pm
DBs Used: DBF
Location: iskenderun / Turkiye
Contact:

Re: HMG 3.0.39

Post by esgici »

Roberto Lopez wrote: That topic refers to LOCKCOLUMNS that is a different thing.
I'm about FREEZE not LOCK of columns.

In dBase cursor was gone next (in the right) column of current line when pressed ENTER key in any cell. FREEZEing a column was changed this behavior by send cursor to down line, instead of the right.

Only my random thoughts to your "any idea?" question.

Best regards

--

Esgici
Viva INTERNATIONAL HMG :D
User avatar
Roberto Lopez
HMG Founder
Posts: 4004
Joined: Wed Jul 30, 2008 6:43 pm

Re: HMG 3.0.39

Post by Roberto Lopez »

rathinagiri wrote:It's working nice with the following sample Roberto:

My doubts:

1. Like row editing, why should not the cell right below is in edit mode? ie., we have to press enter again to start editing.

2. If cellnavigation is set to .f., this feature has no effect?
1. I've was thinking about it. I'll wait until we be sure that it is working fine 'as-is'.

2. I guess that it should be implemente for cellnavigation grids only (at leas by now).
Regards/Saludos,

Roberto


(Veritas Filia Temporis)
User avatar
Roberto Lopez
HMG Founder
Posts: 4004
Joined: Wed Jul 30, 2008 6:43 pm

Re: HMG 3.0.39

Post by Roberto Lopez »

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.
Regards/Saludos,

Roberto


(Veritas Filia Temporis)
User avatar
Rathinagiri
Posts: 5471
Joined: Tue Jul 29, 2008 6:30 pm
DBs Used: MariaDB, SQLite, SQLCipher and MySQL
Location: Sivakasi, India
Contact:

Re: HMG 3.0.39

Post by Rathinagiri »

It is working as desired.

However, if you press tab after editing in the last column in any row, the first column of the same row is selected. In Excel, the same cell will be selected.
East or West HMG is the Best.
South or North HMG is worth.
...the possibilities are endless.
Post Reply