Seite 1 von 2

xbpBrowse / XbpColumn -> unterschiedliche Zeilenfarbe?

Verfasst: Mo, 25. Jun 2007 14:07
von notloesung
Hi,

gibt es eine Möglichkeit innerhalb eines Browsers jede zweite Zeile eine andere Hintergrundfarbe zu zuordnen (ganz Unabhängig von den Werten etc.)? Soll rein der Optik dienen.

Gruß,
Notloesung

Verfasst: Mo, 25. Jun 2007 14:18
von Jan
Die Hintergrundfarbe kann man ja recht einfach manipulieren. Das Problem besteht darin, jede 2. Zeile zu treffen. Ich hab mal einen Browse geschrieben, wo die Hintergrundfarbe abhängig von einem bestimmten Wert war. Wenn Du da also nicht mit Index arbeitest, kannst Du das über den Recno() machen, jeder gerade normal und jeder ungerade anders.

Theoretisch sollte das sicher auch bei Index-Nutzung funktionieren. Da wüsste ich im Moment aber nicht, wie man da die Satznummer feststellt. geht aber bestimmt :?

Jan

Verfasst: Mo, 25. Jun 2007 14:30
von notloesung
Jan hat geschrieben:Die Hintergrundfarbe kann man ja recht einfach manipulieren. Das Problem besteht darin, jede 2. Zeile zu treffen. Ich hab mal einen Browse geschrieben, wo die Hintergrundfarbe abhängig von einem bestimmten Wert war. Wenn Du da also nicht mit Index arbeitest, kannst Du das über den Recno() machen, jeder gerade normal und jeder ungerade anders.
Hallo Jan,

das mit den Farben abhängig vom Wert habe ich auch schon gemacht. Aber auf die Idee mit der RecNo() bin ich einfach nicht gekommen.
Das werde ich gleich mal testen.

Danke,
Notloesung

Verfasst: Mo, 25. Jun 2007 15:01
von notloesung
Jan hat geschrieben:kannst Du das über den Recno() machen, jeder gerade normal und jeder ungerade anders.
Hallo Jan,

lässt sich leider nicht so einfach realisieren.
Ich habe es mit der Recno() und der Zeilenummer des Browsers probiert.
Funktionier aber nicht so wie es soll - was auch logisch ist.

Beim blättern ändert sich (ständig) sowohl die Recno() auch die Zeilennummer des Browsers. Und dann wird natürlich jedes Mal die Farbe geändert und zwar immer in jeder! Zeile.

Schade ...

Gruß,
Notloesung

Verfasst: Mo, 25. Jun 2007 15:04
von Jan
??? Die Recno() darf sich doch nicht ändern. Die hat ja nix mit dem Browse zu tun. Da sollte also die Markierung mitwandern.

Mit der Zeilennummer des Browses hast Du natürlich recht - das kann nicht gut gehen, wenn Du die farbige Markierung auf dem Datensatz und nicht auf der Browserzeile haben möchtest.

Jan

Verfasst: Mo, 25. Jun 2007 15:08
von hschmidt
Hallo,

die colorblock ivar von Xbpcolumn ist nicht vollständig dokumentiert.
Es wird nicht nur der Wert , sondern auch die Spalte und Zeilennummer übergeben.

Also kannst Du folgendes in der Init-Methode Deiner (abgeleiteten) xbpbrowseColumn benutzen:

Code: Alles auswählen

    ::colorblock    := {|xValue,oCol,nRow|self:SetCellColor(xValue,oCol,nRow)}
und dann...

Code: Alles auswählen

METHOD xbpColumn:SetCellColor (xValue,a,nRow)

LOCAL aColor    := {}

 IF nRow % 2 = 0
        aColor := {GRA_CLR_BLACK, GRA_CLR_YELLOW}
    ELSE
        aColor := {GRA_CLR_BLACK, GRA_CLR_WHITE}
    ENDIF

RETURN aColor
Das habe ich nicht exakt so getestet, aber es sollte funktionieren.

Hans

Verfasst: Mo, 25. Jun 2007 15:31
von notloesung
hschmidt hat geschrieben:Das habe ich nicht exakt so getestet, aber es sollte funktionieren.
Hallo Hans,

das funktioniert richtig gut.

Danke.

Jan hat geschrieben:Die Recno() darf sich doch nicht ändern.
Hi Jan,

das ist richtig und auch das funktiniert. Habe eben nur die falsche Recno() genommen. Ich nehme jetzt aber die Lösung von Hans, da ich dabei kein Kopf um den Index machen brauch.

Danke für die Hilfe!
Notloesung

Verfasst: Mo, 25. Jun 2007 15:40
von Jan
Hallo Noti,

und ich hatte mich beim Recno() schon gewundert!

Das die Lösung von Hans besser ist ist mir schon klar. Denn dann ist auch ein Index vollkommen egal. Und es ist eleganter. Man muß halt nur die undokumentierten Parameter alle kennen, dann klappts auch mit dem Nachbarn, äh Browse.

Jan

Verfasst: Mo, 25. Jun 2007 17:05
von andreas
Super!
Ich habe schon lange nach der Lösung gesucht und dann aufgegeben. Jetzt kann ich diese Lösung auch bei mir einsetzen.
Danke!

Verfasst: Di, 26. Jun 2007 9:33
von hschmidt
Hallo,

auf diese undokumentierten Parameter bin ich auch nur per Zufall gestoßen und habe es mir zur Gewohnheit gemacht, bei allen Funktionen, die ich bisher noch nicht benutzt habe, nach so etwas zu forschen.

Bin allerdings nicht weiter fündig geworden :|

Hans

Verfasst: Di, 26. Jun 2007 9:45
von Jan
Vielleicht sollten wir solche undokumentierten Sachen hier im Forum sammeln?

Was sagt denn Alaska zu soetwas? Nehmen die Punkte auf wo man die hingewiesen hat, daß das fehlt?

Jan

Verfasst: Di, 26. Jun 2007 9:49
von brandelh
Hallo Jan,

per PDR Formular kann man auch Fehler / fehlende Hinweise in der
Dokumentation melden. Habe ich auch schon gemacht, allerdings
weiß ich jetzt nicht mehr ob sich daraufhin was geändert hat.

Sollten die Parameter noch nicht endgültig sein kann ja Alaska sagen dass das vorläufig ist. :wink:

Verfasst: Di, 26. Jun 2007 10:00
von Martin Altmann
Hallo Jan,
das war schon häufiger Thema...
Funktionen sind aus den unterschiedlichsten Gründen undokumentiert...
  • Das Dokumentieren wurde vergessen (eher selten)
  • Sie sind ursprünglich geplant gewesen, aber aus verschiedenen Gründen durch andere Funktionalität (oder Planungen) obsolet
  • Sie laufen nicht richtig rund und sollen erst noch verfeinert werden
  • ...
Auf jeden Fall sollte nie vergessen werden, dass eine undokumentierte Funktion in der nächsten Version nicht mehr vorhanden zu sein muß!

Viele Grüße,
Martin

Verfasst: Di, 26. Jun 2007 17:33
von AUGE_OHR
hi,
hschmidt hat geschrieben: die colorblock ivar von Xbpcolumn ist nicht vollständig dokumentiert.
Das ist nicht ganz richtig. Der Colorblock ist auf :dataArae, :Heading
und :footing anwendbar. Alle 3 Objecte enthalten eine Refernz auf
XbpCellGroup(). Dort findet man auch die vollständig documentierte
Methode

Code: Alles auswählen

:setCellColor(<nRowPos>, [<nColorFG>], [<nColorBG>], [<lRepaint>] )
gruss by OHR
Jimmy

Verfasst: Mi, 27. Jun 2007 9:30
von hschmidt
Jimmy,

ich habe nicht gesagt, dass die setCellColor-Methode unvollständig dokumentiert ist, sondern die Colorblock-Instanzvariable.

aus der Doku:
In die Instanzvariable :colorBlock kann optional ein Codeblock eingetragen werden. Ihm wird als Parameter der Wert übergeben, der in der aktuellen Zelle angezeigt werden soll. Das ist der Rückgabewert des :dataLink Codeblocks. In Abhängigkeit dieses Wertes kann die Farbe einer Zelle definiert werden. Dazu muß der Codeblock in :colorBlock ein Array mit zwei Elementen zurückgeben, die Farbkonstanten für die Vorder- und Hintergrundfarbe der Zelle beinhalten. Die allgemeine Form des Codeblocks lautet:

{|xValue| IIf( <lExpression>, {<nColorFG1>,<nColorBG1>}, ;

{<nColorFG2>,<nColorBG2>} )

Dort wird als Parameter nur xValue und eben nicht oCol und nRow erwähnt.

BTW: hauptsache, es funktioniert.
Hans

Verfasst: Do, 28. Jun 2007 2:37
von AUGE_OHR
hi,

was ich meine ist das zwar "scheinbar" Coordinaten im :ColorBlock
ausgegeben werden, aber ich bin der Meinung das man die nicht
benutzten kann/sollte weil die zur Laufzeit dann nicht mehr stimmen.

Wenn du eine "lange" Liste hast sieht es ja im ersten Moment so aus,
aber wenn du dann scrollst ... (je nachdem ob die letzte Zeile %2=0 )

Das scrollen muss man noch mit xbpColumn:HiliteRow() abfangen
... (auch hier ob die erste/letzte Zeile %2=0 ...)

und dann gibt es auch noch Crtl-PgDn/PgUp ... damit wären wir bei
der xbpColumn:DrawRow( nRow, lRedraw ) Methode ...

wenn man aber schon bei der xbpColumn:DrawRow() Methode ist
kann man hier die "einfärbung" vornehmen in der "richtigen" nRow !

gruss by OHR
Jimmy
Nachtrag : Was man nun für Methoden braucht und wie man die
anwedet kann man sich am Beispiel von Alaska ansehen.
C:\ALASKA\XPPW32\SOURCE\samples\basics\QBrowse\QBROWSE2.prg

Verfasst: Di, 17. Jul 2007 10:13
von andreas
Hat jemand die Lösung schon am Laufen.
Ich habe einfach über XbpBrowse:Additem die Spalten eingefügt und denen ein Colorblock zugewiesen. Es scheint auf den ersten Blick zu funktionieren aber beim Scrollen färben sich dann die Zeilen nur zufällig.

Verfasst: Di, 17. Jul 2007 10:42
von andreas
Ich habe jetzt den von Jimmy genannten Beispiel C:\ALASKA\XPPW32\SOURCE\samples\basics\QBrowse\QBROWSE2.prg
auf XbpBrowse umgestrickt.

Code: Alles auswählen

CLASS XbpColoredBrowse FROM XbpBrowse
EXPORTED:
   VAR EvenRow
   INLINE METHOD Init( p1, p2, p3, p4, p5, p6 )
      ::XbpBrowse:Init( p1, p2, p3, p4, p5, p6 )
      ::EvenRow := .T.
   RETURN self

   INLINE METHOD DrawRow( nRow, nCol, aValues, nCols, lRedraw )
      LOCAL aValue, j
      LOCAL lRGBLightBlue := {201,222,245}, lHilite := .F.

      /*
       * Zeile zeichnen
       */
      ::XbpBrowse:DrawRow( nRow, nCol, aValues, nCols, lRedraw )
      *aValue := ::dataLink:GetRowData( nRow )


      /*
       * Die Zeile einfaerben, abhaengig davon, ob wir aktuell gerade
       * oder ungerade Zeilen einfaerben.
       */
      IF ::EvenRow
         IF nRow % 2 == 0
            lHilite := .T.
         ENDIF
      ELSE
         IF nRow % 2 == 1
            lHilite := .T.
         ENDIF
      ENDIF
      IF lHilite //.AND. ValType(aValues[1]) != "U"
         FOR j := 1 TO ::ColCount
            ::getColumn(j):dataArea:SetCellColor( nRow, NIL, GRA_CLR_PALEGRAY, lRedraw )
            *::dataArea:SetCellColor( nRow, j, NIL, GraMakeRGBColor( lRGBLightBlue ), lRedraw )
         NEXT
      ENDIF
   RETURN .T.

   INLINE METHOD ScrollDown( nScroll )
      IF nScroll % 2 == 1
         ::EvenRow := !::EvenRow
      ENDIF
   RETURN ::XbpBrowse:ScrollDown( nScroll )

   INLINE METHOD ScrollUp( nScroll )
      IF nScroll % 2 == 1
         ::EvenRow := !::EvenRow
      ENDIF
   RETURN ::XbpBrowse:ScrollUp( nScroll )

   INLINE METHOD RefreshAll( p1, p2 )
      ::EvenRow := .T.
   RETURN ::XbpBrowse:RefreshAll( p1, p2 )

   INLINE METHOD GoTop()
      ::EvenRow := .T.
      ::XbpBrowse:GoTop()
   RETURN ::ForceStable()

   INLINE METHOD GoBottom()
      ::EvenRow := .T.
      ::XbpBrowse:GoBottom()
   RETURN ::ForceStable()

ENDCLASS
Soweit funktioniert es jetzt besser, obwohl ich nicht weiss, ob ich alles richtig gemacht habe.
Jetzt habe ich aber ein anderes Problem. Mein an die Spalten zugewiesener Colorblock funktioniert nur in den Spalten, wo die Zeileneinfärbung nicht eingreift.

Verfasst: Di, 17. Jul 2007 22:45
von AUGE_OHR
hi,
andreas hat geschrieben: auf XbpBrowse umgestrickt.
...
hm ... gesehen und probiert und ja da kommen wir der Sache doch
schon ziemlich nahe. So ähnlich sah mein Versuch auch aus, aber

Code: Alles auswählen

INLINE METHOD DrawRow( nRow, nCol, aValues, nCols, lRedraw )
INLINE METHOD ScrollDown( nScroll )
INLINE METHOD ScrollUp( nScroll )
während es die Methode DrawRow wohl auch für QuickBrowse gibt
sind die anderen "eigendlich" für XbpColumn ... wunder ...
andreas hat geschrieben: Soweit funktioniert es jetzt besser, obwohl ich nicht weiss, ob ich alles richtig gemacht habe.
Jetzt habe ich aber ein anderes Problem. Mein an die Spalten zugewiesener Colorblock funktioniert nur in den Spalten, wo die Zeileneinfärbung nicht eingreift.
sowas in der Art hatte mich schon bei einem normalen Cursor (ROW)
gestört wenn der über einem Colorblock stand. Hier eine Lösung wieder
mal von Diego :

Code: Alles auswählen

CLASS XbpColumnLocal FROM XbpColumn
******************************************
EXPORTED:
   INLINE METHOD HiliteRow( nRowPos, lHilite, lFrame, lRepaint )
   *************************************************************
   LOCAL aColor
   LOCAL RETVAR

   IF ( lHilite )              // .AND. ( aColor:= Eval( ::colorBlock ) ) # nil
      IF ::colorBlock # NIL
         aColor:= Eval( ::colorBlock )
         IF aColor = NIL
            RETVAR := ::XbpColumn:HiliteRow( nRowPos, lHilite, lFrame, lRepaint )
         ELSE
            RETVAR := ::dataArea:setCellColor( nRowPos, aColor[ 1 ], aColor[ 2 ] )
         ENDIF
      ELSE
         RETVAR := ::XbpColumn:HiliteRow( nRowPos, lHilite, lFrame, lRepaint )
      ENDIF
   ELSE
      RETVAR := ::XbpColumn:HiliteRow( nRowPos, lHilite, lFrame, lRepaint )
   ENDIF
   RETURN RETVAR
ENDCLASS
vielleicht solltest du versuchen doch das ganze vom XbpColumn abzu-
leiten statt von XbpBrowse ?

gruss by OHR
Jimmy

Verfasst: Mi, 18. Jul 2007 1:03
von AUGE_OHR
hi,
AUGE_OHR hat geschrieben: vielleicht solltest du versuchen doch das ganze vom XbpColumn abzu-
leiten statt von XbpBrowse ?
also damit bin ich nicht weiter gekommen, wohl aber was das Problem
mit vorhandenen Color Codeblock angeht

Code: Alles auswählen

INLINE METHOD DrawRow( nRow, nCol, aValues, nCols, lRedraw )
LOCAL aValue, j
LOCAL aRGB     := {153,255,203}
LOCAL lHilite  := .F.

   /*
    * Zeile zeichnen
    */
   ::XbpBrowse:DrawRow( nRow, nCol, aValues, nCols, lRedraw )

   /*
    * Die Zeile einfaerben, abhaengig davon, ob wir aktuell gerade
    * oder ungerade Zeilen einfaerben.
    */
   IF ::EvenRow
      IF nRow % 2 == 0
         lHilite := .T.
      ENDIF
   ELSE
      IF nRow % 2 == 1
         lHilite := .T.
      ENDIF
   ENDIF
   IF lHilite                    //.AND. ValType(aValues[1]) != "U"
      FOR j := 1 TO ::ColCount
         IF ::getColumn(j):colorBlock <> NIL
            Eval( ::getColumn(j):colorBlock )
         ELSE
            ::getColumn(j):dataArea:SetCellColor( nRow, NIL, GraMakeRGBColor(aRGB), lRedraw )
         ENDIF
      NEXT
   ENDIF
RETURN .T.
wenn du dann auch für Column die einen Colorblock haben die Class
XbpColumnLocal() von Diego benutzt, dann sieht man auch bei einem
XBPBRW_CURSOR_ROW die Farben wenn man draufsteht.

gruss by OHR
Jimmy

Verfasst: Mi, 18. Jul 2007 7:42
von notloesung
Guten Morgen!

Warum denn so kompliziert ( :?: )
Bei funktioniert es, bisher ohne Macken, durch eine einfache ColorBlock Zuweisung. Diesen weise ich aber jeder Column zu :!:

Hier die Column:

Code: Alles auswählen

         // Anfragenummer
         aPP[1][2] := pp_ANFRAGENUMMER
         aPP[8][2] := 8
         oXbpColumn          := XbpColumn():new(,,,,aPP)
         oXbpColumn:dataLink := {|| SQLBSANF->ANF_NR }
         oXbpcolumn:colorBlock := {|xValue,oCol,nRow| IIf( nRow % 2 == 0, ;
                                                           {NIL,pnWINLINE_BG_5}, ;
                                                           {NIL,pnWINLINE_BG_3} ) }
         oXbpColumn:create()
         ::oBrowserSQL:addColumn( oXbpColumn )
Meine aPP:

Code: Alles auswählen

         // Allgemeine Präsentationsparameter für den Browser
         aPP := { ;
                  { XBP_PP_COL_HA_CAPTION     , ""                         }, ;   // Überschrift Kopfzeile
                  { XBP_PP_COL_HA_FGCLR       , GRA_CLR_WHITE              }, ;   // Schriftfarbe - Überschrift
                  { XBP_PP_COL_HA_BGCLR       , pnWINLINE_BG_2             }, ;   // Hintergrundfarbe - Überschrift
                  { XBP_PP_COL_HA_HEIGHT      , 20                         }, ;   // Höhe der Kopfzeile in Pixel
                  { XBP_PP_COL_HA_ALIGNMENT   , XBPALIGN_TOP               }, ;   // Ausrichtung von Text
                  { XBP_PP_COL_DA_FGCLR       , GRA_CLR_BLACK              }, ;   // Hervorgehobene Vordergrundfarbe
                  { XBP_PP_COL_DA_BGCLR       , pnWINLINE_BG_3              }, ;   // Hervorgehobene Hintergrundfarbe
                  { XBP_PP_COL_DA_CHARWIDTH   , XBP_AUTOSIZE               }, ;   // Spaltenbreit in Buchstaben!
                  { XBP_PP_COL_DA_ROWSEPARATOR, XBPCOL_SEP_NONE            }, ;   // Trennlinie zwischen Zeilen
                  { XBP_PP_COL_DA_COLSEPARATOR, XBPCOL_SEP_NONE            }, ;   // Trennlinie zwischen Spalten
                  { XBP_PP_COL_DA_HILITE_FGCLR, GRA_CLR_BLACK              }, ;   // Hervorgehobene Schriftfarbe
                  { XBP_PP_COL_DA_HILITE_BGCLR, pnWINLINE_BG_4             }, ;   // Hervorgehobene Hintergrundfarbe
                  { XBP_PP_COL_DA_ROWHEIGHT   , 9                          }, ;   //
                  { XBP_PP_COL_DA_HILITEFRAMELAYOUT, XBPCOL_SEP_LINE       }, ;   //
                  { XBP_PP_COL_DA_CELLFRAMELAYOUT, XBPFRAME_BOX         }, ; //
                  { XBP_PP_COL_DA_CELLHEIGHT  , 9                          } ;   // Höhe der Zelle in Pixel
                }
Das war’s. Wie gesagt geht ohne Probleme (habe dies bisher nur im Test, ist also noch nicht produktiv - hoffe da tauchen dann nicht irgendwelche Unvorhersehbahren Probleme auf).

Gruß,
Notloesung

Verfasst: Mi, 18. Jul 2007 9:45
von andreas
Hallo Jimmy,

danke, das funktioniert erstmal.

Verfasst: Mi, 18. Jul 2007 9:49
von andreas
Hallo Notloesung,

ich habe es bei mir am Anfang auch so gemacht, mit dem Unterschied, dass ich das ganze in eine Funktion ausgelagert habe, um jedesmal weniger zu schreiben.
Dabei gab es Problem, wenn ich im Browse scrollen musste. Da tauchten plötzlich mehrere Zeilen in gleicher Farbe.
Mit der Lösung von Oben funktioniert es bis jetzt einwandfrei. Zumindest habe ich noch keine Fehler festgestellt.

Re: xbpBrowse / XbpColumn -> unterschiedliche Zeilenfarbe?

Verfasst: Fr, 08. Jun 2018 12:09
von vorti
Hallo,
ich hol das hier nochmal hoch.
Ist es irgendwie möglich, den "Zebra-Stil" zu behalten, auch wenn man danach nochmal mit ColorBlock verfärbt.
Er verfärbt mir zwar die Column`s, die auf die entsprechende Bedingung passen, allerdings mach er den restlichen Hintergrund weiß.
Kann mir jemand helfen. Danke

Re: xbpBrowse / XbpColumn -> unterschiedliche Zeilenfarbe?

Verfasst: Fr, 08. Jun 2018 12:16
von Tom
Wenn der Colorblock NIL zurückliefert, sollten die Standardfarben bzw. Präsentationsparameter greifen:

Code: Alles auswählen

oCol:ColorBlock := {|x|IF(x='Juhu',{GRA_CLR_BLACK,GRA_CLR_GREEN},NIL)}