Another little thing I've added to my personal library to easy my work: It is a grid sort utility.
I've created as a function but could be added to DoMethod().
SortGrid Function:
Code: Select all
*----------------------------------------------------------------------*
PROCEDURE SortGrid( cWindow , cGrid , nColumn , cSortAs )
*----------------------------------------------------------------------*
LOCAL L
LOCAL I
LOCAL aGrid := {}
LOCAL J
LOCAL TEMP
WAIT WINDOW 'Sorting...' NOWAIT
* nColumn Parameter is Optional. Default is 1
IF VALTYPE(nColumn) = 'U'
nColumn := 1
ENDIF
* cSrotAs parameter is optional. Default is 'C'
IF VALTYPE(cSortAs) = 'U'
cSortAs := 'C'
ENDIF
* Copy the grid content to an array.
L := GetProperty ( cWindow , cGrid , 'ItemCount' )
FOR I := 1 TO L
AADD( aGrid , GetProperty( cWindow , cGrid , 'Item' , I ) )
NEXT I
* Then Sort The Array...
IF ALLTRIM(UPPER(cSortAs)) == 'C' // Sort As Character
FOR i=1 TO L
FOR j=1 TO (L-1)
IF aGrid[j,nColumn] > aGrid[j+1,nColumn]
temp = aGrid[j]
aGrid[j]=aGrid[j+1]
aGrid[j+1]=temp
ENDIF
NEXT j
NEXT i
ELSEIF ALLTRIM(UPPER(cSortAs)) == 'N' // Sort As Number
FOR i=1 TO L
FOR j=1 TO (L-1)
IF VAL(aGrid[j,nColumn]) > VAL(aGrid[j+1,nColumn])
temp = aGrid[j]
aGrid[j]=aGrid[j+1]
aGrid[j+1]=temp
ENDIF
NEXT j
NEXT i
ELSEIF ALLTRIM(UPPER(cSortAs)) == 'D' // Sort As Date
FOR i=1 TO L
FOR j=1 TO (L-1)
IF CTOD(aGrid[j,nColumn]) > CTOD(aGrid[j+1,nColumn])
temp = aGrid[j]
aGrid[j]=aGrid[j+1]
aGrid[j+1]=temp
ENDIF
NEXT j
NEXT i
ENDIF
* Finally, Fill The Grid With The Sorted Array Content...
DoMethod( cWindow , cGrid , 'DeleteAllItems' )
FOR I := 1 TO L
DoMethod( cWindow , cGrid , 'AddItem' , aGrid[I] )
NEXT I
* End
WAIT CLEAR
RETURN
Since the 'nColumn' and 'cSortAs' parameters are optional, it should be handled differently according the parameter count:
Code: Select all
<...>
// Pcount() == 3 // CONTROL
elseIf Arg3 == 'SORT'
SortGrid ( Arg1 , Arg2 )
<...>
// Pcount() == 4 // CONTROL WITH 1 ARGUMENT
<...>
ElseIf Arg3 == 'SORT'
SortGrid ( Arg1 , Arg2 , Arg4 )
<...>
// Pcount() == 5 .And. ValType (Arg3) == 'C' // CONTROL WITH 2 ARGUMENTS
<...>
ElseIf Arg3 == 'SORT'
SortGrid ( Arg2 , Arg1 , Arg4 , Arg5 )
<...>