also some changes to abstractgrid ..
Most imported reasen: when was evalued everty time. Also when the table was not yet stable.
This is my version:
/*
* $Id$
*/
/*
* HMG Source Code
*
* Copyright 2010 Carlos Bacco <carlosbacco at gmail.com>
* www -
http://harbour-project.org
*
* Copyright 2002-2010 Roberto Lopez <
mail.box.hmg@gmail.com>
*
http://sites.google.com/site/hmgweb/
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation; either version 2 of the License, or( at your option ) any later
* version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License FOR more details.
*
* You should have received a copy of the GNU General Public License along with
* this software; see the file COPYING. IF not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA( or
* visit the web site
http://www.gnu.org/ ).
*
* As a special exception, you have permission FOR additional uses of the text
* contained in this release of HMG.
*
* The exception is that, IF you link the HMG library with other
* files to produce an executable, this does not by itself cause the resulting
* executable to be covered by the GNU General Public License.
* Your use of that executable is in no way restricted on account of linking the
* HMG library code into it.
*/
#include "hbclass.ch"
#include "common.ch"
#include "hbqtgui.ch"
#include "hmg.ch"
/*----------------------------------------------------------------------*/
CLASS ABSTRACTGRID FROM CONTROL
* Internal Data
DATA cClass INIT "ABSTRACTGRID"
DATA nMode INIT ARRAY_MODE
DATA cWorkArea INIT NIL
DATA aColumnFields INIT NIL
DATA aItems INIT NIL
DATA aColumnHeaders INIT NIL
DATA aColumnWidths INIT NIL
DATA aColumnJustify INIT NIL
DATA aDynamicBackColor INIT NIL
DATA aDynamicForeColor INIT NIL
DATA aDynamicDisplay INIT NIL
DATA bOnHeadClick INIT NIL
DATA bOnDblClick INIT NIL
DATA aHeaderImages INIT NIL
DATA aHeaderPixMaps INIT NIL
DATA lAllowEdit INIT .F.
DATA lLines INIT .T.
DATA lVScrollBar INIT .T.
DATA aColumnWhen INIT NIL
DATA aColumnValid INIT NIL
DATA aValidMessages INIT NIL
DATA lShowColHeader INIT NIL
DATA lShowHeaders INIT NIL
DATA lShowRowHeader INIT NIL
DATA aColumnControls INIT NIL
* Data Variables FOR in-place edit
DATA nCellRow INIT 0
DATA nCellCol INIT 0
* Properties
METHOD WorkArea SETGET
METHOD ColumnFields SETGET
METHOD ColumnHeaders SETGET
METHOD ColumnWidths SETGET
METHOD ColumnJustify SETGET
METHOD DynamicBackColor SETGET
METHOD DynamicForeColor SETGET
METHOD DynamicDisplay SETGET
METHOD Header SETGET
METHOD HeaderImages SETGET
METHOD AllowEdit SETGET
METHOD Lines SETGET
METHOD VSCrollBar SETGET
METHOD ColumnWhen SETGET
METHOD ColumnValid SETGET
METHOD ValidMessages SETGET
METHOD CellRowIndex SETGET
METHOD CellColIndex SETGET
METHOD ShowColHeader SETGET
METHOD ShowHeaders SETGET
METHOD ShowRowHeader SETGET
* Events
METHOD OnDblClick SETGET
METHOD OnHeadClick SETGET
* Methods
METHOD CreateLocal
METHOD OnQueryData
METHOD StandardItemDisplay
METHOD StandardFieldDisplay
ENDCLASS
/*----------------------------------------------------------------------*/
* Properties
/*----------------------------------------------------------------------*/
METHOD ColumnWhen( aValue ) CLASS ABSTRACTGRID
IF Pcount() == 0
RETURN ::aColumnWhen
ELSEIF Pcount() == 1 .AND. hb_Isarray( aValue )
::aColumnWhen := aValue
ENDIF
RETURN Self
/*----------------------------------------------------------------------*/
METHOD ValidMessages( aValue ) CLASS ABSTRACTGRID
IF Pcount() == 0
RETURN ::aValidMessages
ELSEIF Pcount() == 1 .AND. hb_Isarray( aValue )
::aValidMessages := aValue
ENDIF
RETURN Self
/*----------------------------------------------------------------------*/
METHOD ColumnValid( aValue ) CLASS ABSTRACTGRID
IF Pcount() == 0
RETURN ::aColumnValid
ELSEIF Pcount() == 1 .AND. hb_Isarray( aValue )
::aColumnValid := aValue
ENDIF
RETURN Self
/*----------------------------------------------------------------------*/
METHOD ColumnJustify( aValue ) CLASS ABSTRACTGRID
IF Pcount() == 0
RETURN ::aColumnJustify
ELSEIF Pcount() == 1 .AND. hb_Isarray( aValue )
::aColumnJustify := aValue
ENDIF
RETURN Self
/*----------------------------------------------------------------------*/
METHOD AllowEdit( lValue ) CLASS ABSTRACTGRID
//FP nella Browse non e' implementato
IF Pcount() == 0
RETURN ::lAllowEdit
ELSEIF Pcount() == 1 .AND. hb_IsLogical( lValue )
::lAllowEdit := lValue
ENDIF
RETURN Self
/*----------------------------------------------------------------------*/
// FP e' per il This.
METHOD CellRowIndex( nValue ) CLASS ABSTRACTGRID
IF Pcount() == 1 .AND. hb_IsNumeric( nValue )
::nCellRowIndex := nValue
ENDIF
RETURN ::nCellRowIndex
/*----------------------------------------------------------------------*/
// FP e' per il This.
METHOD CellColIndex( nValue ) CLASS ABSTRACTGRID
IF Pcount() == 1 .AND. hb_IsNumeric( nValue )
::nCellColIndex := nValue
ENDIF
RETURN ::nCellColIndex
/*----------------------------------------------------------------------*/
METHOD WorkArea( cValue ) CLASS ABSTRACTGRID
IF Pcount() == 0
RETURN ::cWorkArea
ELSEIF Pcount() == 1 .AND. hb_IsChar( cValue )
::cWorkArea := cValue
::nMode := DATA_MODE
ENDIF
RETURN NIL
/*----------------------------------------------------------------------*/
METHOD ColumnFields( aValue ) CLASS ABSTRACTGRID
IF Pcount() == 0
RETURN ::aColumnFields
ELSEIF Pcount() == 1 .AND. hb_Isarray( aValue )
::aColumnFields := aValue
ENDIF
RETURN NIL
/*----------------------------------------------------------------------*/
METHOD Lines( lValue ) CLASS ABSTRACTGRID
IF Pcount() == 0
RETURN ::lLines
ELSEIF Pcount() == 1 .AND. hb_IsLogical( lValue )
::lLines := lValue
::oQTObject:setShowGrid( ::lLines )
ENDIF
RETURN Self
/*----------------------------------------------------------------------*/
METHOD VSCrollBar( lValue ) CLASS ABSTRACTGRID
IF Pcount() == 0
RETURN ::lVScrollBar
ELSEIF Pcount() == 1 .AND. hb_IsLogical( lValue )
::lVScrollBar := lValue
IF ::lVScrollBar
::oQTObject:setVerticalScrollBarPolicy( 2 )
ELSE
::oQTObject:setVerticalScrollBarPolicy( 1 )
ENDIF
ENDIF
RETURN Self
/*----------------------------------------------------------------------*/
METHOD Header( nCol , cValue ) CLASS ABSTRACTGRID
IF Pcount() == 1 .AND. hb_IsNumeric( nCol )
RETURN ::aColumnHeaders[nCol]
ELSEIF Pcount() == 2 .AND. hb_IsChar( cValue )
::aColumnHeaders[nCol] := cValue
::Refresh() // FP: only if lCreated = T ?
ENDIF
RETURN NIL
/*----------------------------------------------------------------------*/
METHOD HeaderImages( aValue ) CLASS ABSTRACTGRID
LOCAL i
IF Pcount() == 0
RETURN ::aHeaderImages
ELSEIF Pcount() == 1 .AND. hb_Isarray( aValue )
::aHeaderImages := aValue
::aHeaderPixmaps := array( len( ::aHeaderImages ) )
FOR i := 1 to len( ::aHeaderImages )
::aHeaderPixmaps
:= QPixmap( ::aHeaderImages )
NEXT i
ENDIF
RETURN Self
/*----------------------------------------------------------------------*/
METHOD DynamicBackColor( aValue ) CLASS ABSTRACTGRID
IF Pcount() == 0
RETURN ::aDynamicBackColor
ELSEIF Pcount() == 1 .AND. hb_Isarray( aValue )
::aDynamicBackColor := aValue
ENDIF
RETURN Self
/*----------------------------------------------------------------------*/
METHOD DynamicForeColor( aValue ) CLASS ABSTRACTGRID
IF Pcount() == 0
RETURN ::aDynamicForeColor
ELSEIF Pcount() == 1 .AND. hb_Isarray( aValue )
::aDynamicForeColor := aValue
ENDIF
RETURN Self
/*----------------------------------------------------------------------*/
METHOD DynamicDisplay( aValue ) CLASS ABSTRACTGRID
IF Pcount() == 0
RETURN ::aDynamicDisplay
ELSEIF Pcount() == 1 .AND. hb_Isarray( aValue )
::aDynamicDisplay := aValue
ENDIF
RETURN Self
/*----------------------------------------------------------------------*/
METHOD ColumnWidths( aValue ) CLASS ABSTRACTGRID
IF Pcount() == 0
RETURN ::aColumnWidths
ELSEIF Pcount() == 1 .AND. hb_Isarray( aValue )
::aColumnWidths := aValue
ENDIF
RETURN NIL
/*----------------------------------------------------------------------*/
METHOD ColumnHeaders( aValue ) CLASS ABSTRACTGRID
IF Pcount() == 0
RETURN ::aColumnHeaders
ELSEIF Pcount() == 1 .AND. hb_Isarray( aValue )
::aColumnHeaders := aValue
ENDIF
RETURN NIL
/*----------------------------------------------------------------------*/
METHOD ShowColHeader( lValue ) CLASS ABSTRACTGRID
IF Pcount() == 0
RETURN ::lShowColHeader
ELSEIF Pcount() == 1 .AND. hb_IsLogical( lValue )
IF lValue
::oQTObject:horizontalHeader():Show()
ELSE
::oQTObject:horizontalHeader():Hide()
ENDIF
::lShowColHeader := lValue
ENDIF
RETURN NIL
/*----------------------------------------------------------------------*/
METHOD ShowHeaders( lValue ) CLASS ABSTRACTGRID
IF Pcount() == 0
RETURN ::lShowHeaders
ELSEIF Pcount() == 1 .AND. hb_IsLogical( lValue )
IF lValue
::oQTObject:verticalHeader():Show()
::oQTObject:horizontalHeader():Show()
ELSE
::oQTObject:verticalHeader():hide()
::oQTObject:horizontalHeader():hide()
ENDIF
::lShowHeaders := lValue
ENDIF
RETURN NIL
/*----------------------------------------------------------------------*/
METHOD ShowRowHeader( lValue ) CLASS ABSTRACTGRID
IF Pcount() == 0
RETURN ::lShowRowHeader
ELSEIF Pcount() == 1 .AND. hb_IsLogical( lValue )
IF lValue
::oQTObject:verticalHeader():Show()
ELSE
::oQTObject:verticalHeader():Hide()
ENDIF
::lShowRowHeader := lValue
ENDIF
RETURN NIL
/*----------------------------------------------------------------------*/
* Events
/*----------------------------------------------------------------------*/
METHOD OnDblClick( bValue ) CLASS ABSTRACTGRID
IF Pcount() == 0
RETURN ::bOnDblClick
ELSEIF Pcount() == 1 .AND. hb_IsBlock( bValue )
::bOnDblClick := bValue
ENDIF
RETURN NIL
/*----------------------------------------------------------------------*/
METHOD OnHeadClick( bValue ) CLASS ABSTRACTGRID
IF Pcount() == 0
RETURN ::bOnHeadClick
ELSEIF Pcount() == 1 .AND. hb_IsBlock( bValue )
::bOnHeadClick := bValue
ENDIF
RETURN Self
/*----------------------------------------------------------------------*/
* Methods
/*----------------------------------------------------------------------*/
METHOD CreateLocal() CLASS ABSTRACTGRID
LOCAL i
::oSize := QSize( 24,24 )
::lCreated := .T.
DO CASE
CASE ::nMode == DATA_MODE
IF valtype( ::aColumnFields ) == 'U' ;
.and. ;
valtype( ::aColumnHeaders ) == 'U' ;
.and. ;
valtype( ::aColumnWidths ) == 'U' ;
.and. ;
hb_IsChar( ::cWorkArea )
::aStruct := &( ::cWorkArea )->( DBStruct() )
ELSE
::aStruct := {}
FOR i := 1 to len( ::aColumnFields )
aadd( ::aStruct , { ::aColumnFields , Type( ::aColumnFields ) , 0 , 0 } )
NEXT i
ENDIF
CASE ::nMode == ARRAY_MODE
::aStruct := {}
FOR i := 1 to len( ::aColumnHeaders )
IF hb_IsArray( ::aColumnControls )
DO CASE
CASE upper( ::aColumnControls [i, 1] ) == 'TEXTBOX'
DO CASE
CASE upper( ::aColumnControls [i, 2] ) == 'CHARACTER'
aadd( ::aStruct , { ::aColumnHeaders , 'C' , 0 , 0 } )
CASE upper( ::aColumnControls [i, 2] ) == 'NUMERIC'
aadd( ::aStruct , { ::aColumnHeaders , 'N' , 0 , 0 } )
CASE upper( ::aColumnControls [i, 2] ) == 'DATE'
aadd( ::aStruct , { ::aColumnHeaders , 'D' , 0 , 0 } )
ENDCASE
CASE upper( ::aColumnControls [i, 1] ) == 'COMBOBOX'
aadd( ::aStruct , { ::aColumnHeaders , 'C' , 0 , 0 } )
CASE upper( ::aColumnControls [i, 1] ) == 'DATEPICKER'
aadd( ::aStruct , { ::aColumnHeaders , 'D' , 0 , 0 } )
CASE upper( ::aColumnControls [i, 1] ) == 'SPINNER'
aadd( ::aStruct , { ::aColumnHeaders , 'N' , 0 , 0 } )
CASE upper( ::aColumnControls [i, 1] ) == 'CHECKBOX'
aadd( ::aStruct , { ::aColumnHeaders [i] , 'L' , 0 , 0 } )
ENDCASE
ELSE
IF LEN( ::aItems ) > 0
aadd( ::aStruct , { ::aColumnHeaders [i] , VALTYPE(::aItems[1,i]) , 0 , 0 } )
ELSE
aadd( ::aStruct , { ::aColumnHeaders [i] , 'C' , 0 , 0 } )
ENDIF
ENDIF
NEXT i
ENDCASE
::Refresh()
::oQTObject:verticalHeader():setDefaultSectionSize( 24 )
::QAbstractItemDelegate := ::oQTObject:itemDelegate()
::QAbstractItemDelegate:connect( "commitData(QWidget*)", {| w | ::OnSave( w ) } )
::oQTObject:connect( "doubleClicked(QModelIndex)", {| n | ::CellDoubleClicked( n )} )
::oQTObject:connect( QEvent_KeyPress , {|e|Self:DoKeyBoardEvents( e )} ) //deze staatin grid, virtualgrid en virtualwindow=dochter
::oQHeaderView := QHeaderView( ::oQTObject:horizontalHeader() )
IF hb_IsArray( ::bOnHeadClick )
::oQHeaderView:disconnect( "sectionClicked(int)" )
::oQHeaderView:connect( "sectionClicked(int)",{|i| if( hb_IsBlock( ::bOnHeadClick[i+1] ), Eval( ::bOnHeadClick[i+1] ),nil ) } )
ENDIF
::Refresh()
FOR i := 1 To Len( ::aStruct )
IF valtype( ::aColumnWidths ) = 'U'
::oQtObject:setColumnWidth( i - 1, ::aStruct[ i, 3 ] * 6 + 60 )
ELSE
::oQtObject:setColumnWidth( i - 1, ::aColumnWidths [i] )
ENDIF
NEXT
// ::oParent:ChildAdd( ::cName , Self )
IF ValType( ::lVisible ) != 'U'; Self:Visible := ::lVisible ; ELSE ; ::oQTObject:show() ; ENDIF
IF ::nMode == DATA_MODE
::nCurrent := 1
&( ::cWorkArea )->( dbGoTop() )
::nMasterRecNo := &( ::cWorkArea )->( recno() )
ELSE
IF VALTYPE( ::xValue ) != 'U'
::Value := ::xValue
ENDIF
ENDIF
IF hb_IsArray( ::aColumnControls )
IF LEN( ::aColumnControls ) > 0
::oQTObject:setEditTriggers( 0 )
ENDIF
ENDIF
RETURN Self
/*----------------------------------------------------------------------*/
METHOD OnQueryData( aStru, t, role, x, y ) CLASS ABSTRACTGRID
LOCAL aRetVal , aColor, nRetVal, nRecNo , nArea
// msginfo("onquerydata")
SWITCH t
CASE HBQT_QAIM_flags
IF ::lAllowEdit
nRetVal := Qt_ItemIsEnabled + Qt_ItemIsSelectable
IF hb_IsArray( ::aColumnWhen )
IF hb_IsBlock( ::aColumnWhen [x+1] )
DO CASE
CASE ::nMode == DATA_MODE
::setRecordPos( y )
CASE ::nMode == ARRAY_MODE
::setItemPos( y )
ENDCASE
//DEZE EVAL DOEN WE ALLEEN BIJ INVOEREN EN NIET BIJ OPBOUWEN SCHERM
//IF eval( ::aColumnWhen [x+1] )
nRetVal += Qt_ItemIsEditable
//ENDIF
ELSE
nRetVal += Qt_ItemIsEditable
ENDIF
ELSE
nRetVal += Qt_ItemIsEditable
ENDIF
RETURN nRetVal
ELSE
RETURN Qt_ItemIsEnabled + Qt_ItemIsSelectable
ENDIF
CASE HBQT_QAIM_data
// msginfo( "QAIM_DATA" )
SWITCH role
CASE Qt_DisplayRole
DO CASE
CASE ::nMode == DATA_MODE
::setRecordPos( y )
CASE ::nMode == ARRAY_MODE
::setItemPos( y )
ENDCASE
IF valtype( ::aDynamicDisplay ) = 'U'
DO CASE
CASE ::nMode == DATA_MODE
RETURN ::StandardFieldDisplay( aStru, x )
CASE ::nMode == ARRAY_MODE
RETURN ::StandardItemDisplay( aStru, x, y )
ENDCASE
ELSE
IF hb_IsBlock( ::aDynamicDisplay [ x+1 ] )
RETURN Eval( ::aDynamicDisplay [ x+1 ] )
ELSE
DO CASE
CASE ::nMode == DATA_MODE
RETURN ::StandardFieldDisplay( aStru, x )
CASE ::nMode == ARRAY_MODE
RETURN ::StandardItemDisplay( aStru, x, y )
ENDCASE
ENDIF
ENDIF
CASE Qt_EditRole /* Here we can specify different formats FOR editing*/
DO CASE
CASE ::nMode == DATA_MODE
::setRecordPos( y )
SWITCH aStru[ x + 1, 2 ]
CASE "C"
RETURN AllTrim( &( ::cWorkArea )->( &( aStru [ x+1 ] [ 1 ] ) ) )
CASE "N"
RETURN hb_NToS( &( ::cWorkArea )->( &( aStru [ x+1 ] [ 1 ] ) ) )
CASE "L"
RETURN IIf( &( ::cWorkArea )->( &( aStru [ x+1 ] [ 1 ] ) ), "Y", "N" )
CASE "D"
RETURN DToC( &( ::cWorkArea )->( &( aStru [ x+1 ] [ 1 ] ) ) )
ENDSWITCH
RETURN "?"
CASE ::nMode == ARRAY_MODE
::setItemPos( y )
SWITCH aStru[ x + 1, 2 ]
CASE "C"
RETURN AllTrim( ::aItems [ y+1 ] [ x+1 ] )
CASE "N"
RETURN hb_NToS( ::aItems [ y+1 ] [ x+1 ] )
CASE "L"
RETURN IIf( ::aItems [ y+1 ] [ x+1 ] , "Y", "N" )
CASE "D"
RETURN DToC( ::aItems [ y+1 ] [ x+1 ] )
ENDSWITCH
RETURN "?"
ENDCASE
CASE Qt_ForegroundRole
IF hb_IsArray( ::aDynamicForeColor )
DO CASE
CASE ::nMode == DATA_MODE
::setRecordPos( y )
CASE ::nMode == ARRAY_MODE
::setItemPos( y )
ENDCASE
::nCellRowIndex := y + 1
::nCellColIndex := x + 1
aColor := eval( ::aDynamicForeColor [ x + 1 ], y + 1 )
aRetVal := qColor( aColor [1] , aColor [2] , aColor [3] )
ELSE
aRetVal := NIL
ENDIF
RETURN aRetVal
CASE Qt_BackgroundRole
IF hb_IsArray( ::aDynamicBackColor )
DO CASE
CASE ::nMode == DATA_MODE
::setRecordPos( y )
CASE ::nMode == ARRAY_MODE
::setItemPos( y )
ENDCASE
::nCellRowIndex := y + 1
::nCellColIndex := x + 1
aColor := eval( ::aDynamicBackColor [ x + 1 ], y + 1 )
aRetVal := qColor( aColor [1] , aColor [2] , aColor [3] )
ELSE
aRetVal := NIL
ENDIF
RETURN aRetVal
CASE Qt_TextAlignmentRole
IF valtype( ::aColumnJustify ) = 'U'
SWITCH aStru[ x + 1, 2 ]
CASE "C"
RETURN Qt_AlignVCenter + Qt_AlignLeft
CASE "N"
RETURN Qt_AlignVCenter + Qt_AlignRight
ENDSWITCH
RETURN Qt_AlignCenter
ELSE
RETURN Qt_AlignVCenter + ::aColumnJustify [ x+1 ]
ENDIF
ENDSWITCH
RETURN NIL
CASE HBQT_QAIM_headerData
SWITCH role
CASE Qt_DisplayRole
IF x == Qt_Horizontal
IF hb_IsArray( ::aColumnHeaders )
RETURN ::aColumnHeaders[ y + 1 ]
ELSE
RETURN aStru[ y + 1, 1 ]
ENDIF
ELSE
IF ::nCy == y
RETURN '>'
ELSE
RETURN ''
ENDIF
ENDIF
CASE Qt_TextAlignmentRole
IF x == Qt_Horizontal
RETURN Qt_AlignCenter
ELSE
RETURN Qt_AlignVCenter + Qt_AlignRight
ENDIF
CASE Qt_SizeHintRole
RETURN ::oSize
CASE Qt_DecorationRole
IF x == Qt_Horizontal
IF ValType( ::aHeaderPixmaps ) != 'U'
RETURN ::aHeaderPixmaps[y+1]
ENDIF
ENDIF
ENDSWITCH
RETURN NIL
CASE HBQT_QAIM_rowCount
DO CASE
CASE ::nMode == DATA_MODE
IF ( empty( &( ::cWorkArea )->( dbFilter() ) ) ) .and.( .Not. Set( _SET_DELETED ) )
::nRecordCount := &( ::cWorkArea )->( OrdKeyCount() )
ELSE
nArea := Select()
nRecNo := recno()
dbSelectArea( ::cWorkArea )
COUNT TO ::nRecordCount
dbSelectArea( nArea )
dbgoto( nRecNo )
ENDIF
RETURN ::nRecordCount
CASE ::nMode == ARRAY_MODE
IF hb_IsArray( ::aItems )
::nItemCount := LEN( ::aItems )
ELSE
::nItemCount := 0
ENDIF
RETURN ::nItemCount
ENDCASE
CASE HBQT_QAIM_columnCount
DO CASE
CASE ::nMode == DATA_MODE
RETURN &( ::cWorkArea )->( Len( aStru ) )
CASE ::nMode == ARRAY_MODE
RETURN Len( aStru )
ENDCASE
ENDSWITCH
RETURN NIL
/*----------------------------------------------------------------------*/
METHOD StandardItemDisplay( aStru , x, y ) CLASS ABSTRACTGRID
LOCAL cText, nCol, xValue
nCol := x + 1
xValue := ::aItems[ y + 1, x + 1 ]
// msginfo("stabd: " +str(y)+" "+str(x) )
IF valtype( ::aColumnControls ) != 'U'
DO CASE
CASE upper( alltrim( ::aColumnControls[nCol][1] ) ) == 'TEXTBOX'
DO CASE
CASE upper( alltrim( ::aColumnControls[nCol][2] ) ) == 'NUMERIC'
IF len( ::aColumnControls[nCol] ) > 2 // with inputmask|format
IF ValType( ::aColumnControls[nCol] [3] ) != 'U'
IF len( ::aColumnControls[nCol] [3] ) > 0
cText := Transform( xValue ,( ::aColumnControls[nCol] [3] ) )
ENDIF
ENDIF
ELSE
cText := Alltrim( Str( Int( xValue ) ) )
ENDIF
CASE upper( alltrim( ::aColumnControls[nCol][2] ) ) == 'DATE'
cText := rtrim( dtoc( xValue ) )
OTHERWISE
cText := xValue
ENDCASE
CASE upper( alltrim( ::aColumnControls[nCol][1] ) ) == 'CHECKBOX'
IF xValue
cText := ::aColumnControls[nCol][2]
ELSE
cText := ::aColumnControls[nCol][3]
ENDIF
CASE upper( alltrim( ::aColumnControls[nCol][1] ) ) == 'DATEPICKER'
cText := DtoC( xValue )
CASE upper( alltrim( ::aColumnControls[nCol][1] ) ) == 'SPINNER'
cText := alltrim( Str( int( xValue ) ) )
CASE upper( alltrim( ::aColumnControls[nCol][1] ) ) == 'COMBOBOX'
cText := ::aColumnControls[nCol][2][xValue]
ENDCASE
RETURN cText
ELSE
SWITCH aStru[ x + 1, 2 ]
CASE "C"
RETURN AllTrim( ::aItems [ y+1 ] [ x+1 ] )
CASE "N"
RETURN hb_NToS( ::aItems [ y+1 ] [ x+1 ] )
CASE "L"
RETURN IIf( ::aItems [ y+1 ] [ x+1 ] , "Yes", "No" )
CASE "D"
RETURN DToC( ::aItems [ y+1 ] [ x+1 ] )
CASE "M"
RETURN '<memo>'
ENDSWITCH
ENDIF
RETURN "?"
/*----------------------------------------------------------------------*/
METHOD StandardFieldDisplay( aStru , x ) CLASS ABSTRACTGRID
SWITCH aStru[ x + 1, 2 ]
CASE "C"
RETURN AllTrim( &( ::cWorkArea )->( &( aStru [ x+1 ] [ 1 ] ) ) )
CASE "N"
RETURN hb_NToS( &( ::cWorkArea )->( &( aStru [ x+1 ] [ 1 ] ) ) )
CASE "L"
RETURN IIf( &( ::cWorkArea )->( &( aStru [ x+1 ] [ 1 ] ) ), "Yes", "No" )
CASE "D"
RETURN DToC( &( ::cWorkArea )->( &( aStru [ x+1 ] [ 1 ] ) ) )
CASE "M"
RETURN '<memo>'
ENDSWITCH
RETURN "?"
/*----------------------------------------------------------------------*/