Ach so, wenn Du in allen Spalten Trennlinien willst, musst Du natürlich für alle das Merkmal setzen - und zusätzlich mitteilen, welche Spalte das Vergleichskritierium enthält. Das ginge dann in etwa so (geändert sind die Zeichenfunktion und ihre Aufrufe):
Code: Alles auswählen
*******************************************************************
* Ownerdrawing, Beispiel 3: Wir holen uns die Vordergrundfarbe zurck
* CustomDrawCell als Slot von oColumn:DataArea
*******************************************************************
#include "Appevent.ch"
#include "Common.ch"
#include "Gra.ch"
#include "Xbp.ch"
#pragma Library( "XppUi2.lib" )
STATIC aData
STATIC nLastRec
STATIC nRecno
PROCEDURE AppSys; RETURN
FUNCTION Main()
LOCAL oDlg, oBrowse, oColumn, oXbp, mp1, mp2, nEvent, aPres, aColPres
aPres := ;
{ { XBP_PP_COL_DA_ROWHEIGHT, 25 }, ;
{ XBP_PP_COL_DA_CELLHEIGHT, 25 }, ;
{ XBP_PP_COL_DA_ROWSEPARATOR, IF(IsThemeActive(),XBPCOL_SEP_LINE,XBPCOL_SEP_NONE) }, ;
{ XBP_PP_COL_DA_COLSEPARATOR, IF(IsThemeActive(),XBPCOL_SEP_LINE,XBPCOL_SEP_NONE) }, ;
{ XBP_PP_HILITE_BGCLR, GraMakeRGBColor({136,170,214}) }, ;
{ XBP_PP_HILITE_FGCLR, GraMakeRGBColor({255,102,51}) }, ;
{ XBP_PP_COL_DA_CELLFRAMELAYOUT, XBPFRAME_BOX+XBPFRAME_RECESSED }, ;
{ XBP_PP_COL_FA_FRAMELAYOUT, XBPFRAME_BOX+XBPFRAME_RECESSED }, ;
{ XBP_PP_COL_DA_FRAMELAYOUT, XBPFRAME_NONE }, ;
{ XBP_PP_COL_DA_FGCLR, GRA_CLR_BLACK } , ;
{ XBP_PP_COL_DA_BGCLR, GRA_CLR_WHITE } }
aColPres := aClone(aPres)
aAdd(aPres, { XBP_PP_COL_DA_CELLALIGNMENT, XBPALIGN_LEFT+XBPALIGN_VCENTER })
aAdd(aColPres,{ XBP_PP_COL_DA_CELLALIGNMENT, XBPALIGN_RIGHT+XBPALIGN_VCENTER })
aData := {{1,'grn' ,'Maier' ,'Berlin' },;
{2,'gelb' ,'Mller' ,'Berlin' },;
{3,'blau' ,'Schulze','Berlin' },;
{4,'grn' ,'Albers' ,'Hamburg'},;
{5,'rot' ,'Mayer' ,'Mnchen'},;
{6,'schwarz','Kabel' ,'K”ln' }}
nRecno := 1
nLastRec := Len(aData)
oDlg := XbpDialog():new(,,,,, .F. )
oDlg:taskList := .T.
oDlg:clientSize := { 600, 500 }
oDlg:drawingArea:clipChildren := .T.
oDlg:title := 'Beispiel 3'
oDlg:create()
oDlg:drawingArea:setFontCompoundName( '9.Arial' )
CenterControl( oDlg )
SetAppWindow( oDlg )
oBrowse := XbpBrowse():new( oDlg:drawingArea,, { 0, 0 }, oDlg:drawingArea:currentSize(),, .F. )
oBrowse:SkipBlock := {|nSkip,oBrowse| DoSkip(nSkip,oBrowse) }
oBrowse:GoBottomBlock := {|| nRecno := Len(aData) }
oBrowse:GoTopBlock := {|| nRecno := 1 }
oBrowse:PosBlock := {|| nRecno }
oBrowse:PhyPosBlock := {|| nRecno }
oBrowse:LastPosBlock := {|| Len(aData) }
oBrowse:FirstPosBlock := {|| 1 }
oBrowse:CursorMode := XBPBRW_CURSOR_ROW
oBrowse:SetPresParam(aPres)
oBrowse:create()
* 1. Spalte
oColumn := oBrowse:AddColumn( {|| Str(aData[nRecno,1],3,0)}, 10, "Nummer" )
oColumn:Configure(,,,,aColPres,.T.)
oColumn:ColorBlock := {||{GRA_CLR_BLUE,GRA_CLR_WHITE}}
oColumn:DataArea:DrawMode := XBP_DRAW_OWNER
oColumn:DataArea:CustomDrawCell := {|oPs,aInfo,oArea|PaintCellWithForeGround(oPs,aInfo,oArea,oBrowse,4)}
* 2. Spalte, CustomDrawCell
oColumn := oBrowse:AddColumn( {|| aData[nRecno,2]}, 10, "Farbe" )
oColumn:ColorBlock := {|x|{MyGetColor(x),GRA_CLR_WHITE}}
oColumn:DataArea:DrawMode := XBP_DRAW_OWNER
oColumn:DataArea:CustomDrawCell := {|oPs,aInfo,oArea|PaintCellWithForeGround(oPs,aInfo,oArea,oBrowse,4)}
* 3. Spalte, CustomDrawCell
oColumn := oBrowse:AddColumn( {|| aData[nRecno,3]}, 20, "Name" )
oColumn:ColorBlock := {||{GRA_CLR_BLUE,GRA_CLR_YELLOW}}
oColumn:DrawMode := XBP_DRAW_OWNER
oColumn:DataArea:CustomDrawCell := {|oPs,aInfo,oArea|PaintCellWithForeGround(oPs,aInfo,oArea,oBrowse,4)}
* 4. Spalte
oColumn := oBrowse:AddColumn( {|| aData[nRecno,4]}, 20, "Ort" )
oColumn:ColorBlock := {||{GRA_CLR_BLACK,GRA_CLR_WHITE}}
oColumn:DrawMode := XBP_DRAW_OWNER
oColumn:DataArea:CustomDrawCell := {|oPs,aInfo,oArea|PaintCellWithForeGround(oPs,aInfo,oArea,oBrowse,4)}
oBrowse:show()
oDlg:show()
DO WHILE nEvent <> xbeP_Close
nEvent := AppEvent( @mp1, @mp2, @oXbp )
oXbp:handleEvent( nEvent, mp1, mp2 )
ENDDO
QUIT
RETURN NIL
******************************************************
* Hier werden die Zellen gezeichnet
******************************************************
FUNCTION PaintCellWithForeGround(oPs,aInfo,oArea,oBrowse,nLineWhenDifferent)
* Erhebt das Alignment, die Vordergrundfarbe und zeichnet dann den Zellinhalt selbst
LOCAL xData, nFgCol, nAlign := XBPALIGN_VCENTER+XBPALIGN_HCENTER, aPP, nFound, xThisLine, xNextLine, lPaintBottomLine := .F.,;
aPaintPos, aLineAttrs
DEFAULT nLineWhenDifferent TO 0
* Zellinhalt erheben:
xData:= oArea:GetCell( aInfo[ XBP_DRAWINFO_ITEM ] )
IF xData = nil .or. !32 $ aInfo[ XBP_DRAWINFO_ACTION ] // nur selbst zeichnen, wenn Inhalt vorhanden und Vordergrund gezeichnet werden muss!
RETURN .T.
ENDIF
* Vordergrundfarbe erheben:
oArea:GetCellColor( aInfo[ XBP_DRAWINFO_ITEM ],@nFgCol )
* und fr den Presentation Space setzen:
oPs:SetColor(nFgCol)
* Alignment der Spalte erheben:
aPP := oArea:SetParent():SetPresParam()
nFound := AScan(aPP,{|a|Valtype(a[1])=='N' .AND. a[1]==XBP_PP_COL_DA_CELLALIGNMENT } )
IF nFound > 0 .and. aPP[nFound,2] <> nil
nAlign := aPP[nFound,2]
ENDIF
* Text anzeigen (der eigentliche Kern der Angelegenheit):
GraCaptionStr( oPS, aInfo[ XBP_DRAWINFO_RECT ], { aInfo[ XBP_DRAWINFO_RECT, 3 ], aInfo[ XBP_DRAWINFO_RECT, 4 ] }, xData, nAlign )
IF nLineWhenDifferent > 0 // vergleich den Inhalt dieser Spalte mit der vorigen und zeichnet eine durchgehende Linie, wenn diese NICHT gleich sind und die Folgezeile nicht leer ist
xThisLine := oBrowse:GetColumn(nLineWhenDifferent):DataArea:GetCell(aInfo[ XBP_DRAWINFO_ITEM ] )
xNextLine := oBrowse:GetColumn(nLineWhenDifferent):DataArea:GetCell(aInfo[ XBP_DRAWINFO_ITEM ] + 1 )
IF xNextLine # nil .and. xThisLine # nil .and. !AllTrim(Var2Char(xNextLine)) == AllTrim(Var2Char(xThisLine)) .and. Len(AllTrim(Var2Char(xNextLine)))>0
aPaintPos := oArea:CellRect( aInfo[ XBP_DRAWINFO_ITEM ] )
aLineAttrs := ARRAY( GRA_AL_COUNT )
aLineAttrs[ GRA_AL_WIDTH ] := GRA_LINEWIDTH_NORMAL
aLineAttrs[ GRA_AL_COLOR ] := GRA_CLR_DARKGRAY
aLineAttrs[ GRA_AL_TYPE ] := GRA_LINETYPE_SOLID
GraSetAttrLine( oPS, aLineAttrs )
GraLine(oPs,{ aPaintPos[ 1 ],aPaintPos[ 2 ] }, { aPaintPos[ 3 ], aPaintPos[ 2 ] } )
ENDIF
ENDIF
* Rckgabe .T. wrde bewirken, dass die Zelle berzeichnet wird! (Einfach mal ausprobieren!)
RETURN .F.
******************************************************
STATIC FUNCTION MyGetColor(x)
DO CASE
CASE x = 'grn'
RETURN GRA_CLR_GREEN
CASE x = 'gelb'
RETURN GRA_CLR_YELLOW
CASE x = 'blau'
RETURN GRA_CLR_BLUE
CASE x = 'rot'
RETURN GRA_CLR_RED
CASE x = 'schwarz'
RETURN GRA_CLR_BLACK
ENDCASE
RETURN GRA_CLR_BLACK
FUNCTION DoSkip( nSkip )
LOCAL nCanSkip
IF nRecno + nSkip < 1 // "BoF"
nCanSkip := 1 - nRecno
ELSEIF nRecno + nSkip > nLastRec // "EoF"
nCanSkip := nLastRec - nRecno
ELSE
nCanSkip := nSkip
ENDIF
nRecno += nCanSkip
RETURN nCanSkip