XbpBrowse optische Trennlinie horizontal?

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
DelUser01

XbpBrowse optische Trennlinie horizontal?

Beitrag von DelUser01 » Mi, 20. Dez 2017 10:35

Hallo

gibt es in XbpBrowse eine (einfache) Möglichkeit eine horizontale Trennung einzubauen?
Es sollen für den Benutzer eine optische Gruppierung von Werten in der dargestellten Tabelle sein. Wie z.B. die Trennlinien im Hauptmenü.

Habe schon mit farbigen Zeilen experimentiert, ist aber nicht so richtig das was ich möchte, ist irgendwie zu ungewohnt und zu viel Farbe. Auch mit einer Leerzeile habe ich es schon probiert, ist wieder zu viel Abstand...

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7287
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: XbpBrowse optische Trennlinie horizontal?

Beitrag von Tom » Mi, 20. Dez 2017 11:11

Das geht mit Ownerdrawing vergleichsweise einfach. Ich nehme an, Du meinst so etwas (Bild). Da entscheidet eine wechselnde inhaltliche Eigenschaft (in diesem Fall Spalte 3) darüber, ob eine deutliche(re) Trennlinie gezeichnet werden soll oder nicht.
browsetrennlinie.jpg
browsetrennlinie.jpg (41.68 KiB) 768 mal betrachtet
Herzlich,
Tom

DelUser01

Re: XbpBrowse optische Trennlinie horizontal?

Beitrag von DelUser01 » Mi, 20. Dez 2017 11:20

Hallo Tom

so in der Art.
Mit Ownerdrawing wollte ich bei XbpBrowse noch nicht dran. Da habe ich bei der "normalen" Verwendung von XbpBrowse noch viele Punkte die ich noch machen muss in meinen Programmen.

Aber wenn es nicht anders geht...

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7287
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: XbpBrowse optische Trennlinie horizontal?

Beitrag von Tom » Mi, 20. Dez 2017 11:28

Hallo, Roland.

Du musst ja nicht alles selbst zeichnen, das ist ein Vorteil des Ownerdrawings. Ich schaue mal, ob sich eines meiner Ownerdrawing-Beispiele so verbiegen lässt, dass es Deinen Erwartungen entspricht.
Herzlich,
Tom

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7287
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: XbpBrowse optische Trennlinie horizontal?

Beitrag von Tom » Mi, 20. Dez 2017 11:46

Das Beispiel ist ein bisschen betagt, aber es funktioniert. Die letzte Spalte enthält eine Trennlinie, wenn der Inhalt wechselt (Manifest!). Wenn man die anderen Malereien aus der Funktion nimmt oder ihr .T. als Rückgabewert verpasst, bleibt alles andere beim Betriebssystem.

Code: Alles auswählen

*******************************************************************
* Ownerdrawing, Beispiel 3: Wir holen uns die Vordergrundfarbe zurck
* 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,'grn'   ,'Maier'  ,'Berlin' },;
          {2,'gelb'   ,'Mller' ,'Berlin' },;
          {3,'blau'   ,'Schulze','Berlin' },;
          {4,'grn'   ,'Albers' ,'Hamburg'},;
          {5,'rot'    ,'Mayer'  ,'Mnchen'},;
          {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( {|| aData[nRecno,1]}, 10, "Nummer" )
   * 2. Spalte, CustomDrawCell
   oColumn := oBrowse:AddColumn( {|| aData[nRecno,2]}, 10, "Farbe" )
   oColumn:Configure(,,,,aColPres,.T.)
   oColumn:ColorBlock := {|x|{MyGetColor(x),GRA_CLR_WHITE}}
   oColumn:DataArea:DrawMode := XBP_DRAW_OWNER
   oColumn:DataArea:CustomDrawCell := {|oPs,aInfo,oArea|PaintCellWithForeGround(oPs,aInfo,oArea)}
   * 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)}
   * 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,.T.)}

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,lLineWhenDifferent)
* 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 lLineWhenDifferent TO .F.

* 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 fr 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

IF lLineWhenDifferent // 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 := oArea:GetCell( aInfo[ XBP_DRAWINFO_ITEM ] )
  xNextLine := oArea: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
    lPaintBottomLine := .T.
  ENDIF
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 lPaintBottomLine
  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 ] } )
  * GraLine(oPs,{ aInfo[ XBP_DRAWINFO_RECT,1 ]-3,aInfo[ XBP_DRAWINFO_RECT,2 ]-3},{aInfo[ XBP_DRAWINFO_RECT,3 ]+3,aInfo[ XBP_DRAWINFO_RECT,2 ]-3 } )
endif

* Rckgabe .T. wrde bewirken, dass die Zelle berzeichnet wird! (Einfach mal ausprobieren!)
RETURN .F.

******************************************************


STATIC FUNCTION MyGetColor(x)
DO CASE
  CASE x = 'grn'
  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
ownerline.jpg
ownerline.jpg (18.42 KiB) 763 mal betrachtet
Herzlich,
Tom

DelUser01

Re: XbpBrowse optische Trennlinie horizontal?

Beitrag von DelUser01 » Mi, 20. Dez 2017 12:44

Hallo Tom

hier ein Bild von meier Tabelle. Abgeleitet aus den Alaska-Samples.
Da sehen die Felder anders aus, da muss ich vermutlich anders vorgehen.
Dateianhänge
XbpBrowse1.JPG
XbpBrowse1.JPG (111.68 KiB) 749 mal betrachtet

DelUser01

Re: XbpBrowse optische Trennlinie horizontal?

Beitrag von DelUser01 » Mi, 20. Dez 2017 12:47

Tom hat geschrieben:
Mi, 20. Dez 2017 11:46
...aber es funktioniert
Das ist das Wichtigste. Werde mir das später genauer anschauen und ausprobieren.
(nachher kommt Unitymedia - Umstellung Internetzugang)

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7287
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: XbpBrowse optische Trennlinie horizontal?

Beitrag von Tom » Mi, 20. Dez 2017 12:48

Nö. Wenn Du Ownerdrawing für eine Spalte aktivierst und meine Funktion dranklemmst, sollten sich die Linien zeigen (letzter Parameter auf .T.). Falls nichts sichtbar ist - spiel mal mit der Linienstärke (aLineAttrs).
Herzlich,
Tom

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7287
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: XbpBrowse optische Trennlinie horizontal?

Beitrag von Tom » Mi, 20. Dez 2017 13:03

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 zurck
* 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,'grn'   ,'Maier'  ,'Berlin' },;
          {2,'gelb'   ,'Mller' ,'Berlin' },;
          {3,'blau'   ,'Schulze','Berlin' },;
          {4,'grn'   ,'Albers' ,'Hamburg'},;
          {5,'rot'    ,'Mayer'  ,'Mnchen'},;
          {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 fr 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

* Rckgabe .T. wrde bewirken, dass die Zelle berzeichnet wird! (Einfach mal ausprobieren!)
RETURN .F.

******************************************************


STATIC FUNCTION MyGetColor(x)
DO CASE
  CASE x = 'grn'
  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
Herzlich,
Tom

Antworten