Rubrik: Controls · MSFlexGrid/DataGrid | VB-Versionen: VB5, VB6 | 16.10.06 |
FlexGrid einfärben Dieser Tipp stellt Ihnen Funktionen zur Verfügung mit deren Anwendung Sie die Zeilen des Flexgrids in Abhängigkeit von den Werten einer "Schlüsselspalte" färben können. | ||
Autor: Dietrich Herrmann | Bewertung: | Views: 14.544 |
ohne Homepage | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Für das alternierende "Einfärben" von FlexGrid-Zeilen haben Sie sicher schon Lösungen gesehen. Dieser Tipp stellt Ihnen Funktionen zur Verfügung mit deren Anwendung Sie die Zeilen des Flexgrids in Abhängigkeit von den Werten einer "Schlüsselspalte" färben können. D.h., ändert sich der Wert in einem Tabellenfeld der Schlüsselspalte, wird die Zeile anders gefärbt; alle Zeilen mit dem gleichen Schlüsselwert erhalten die gleiche Farbe.
Als erstes muss dafür ein Feld erstellt werden, das die Werte der Schlüsselspalte enthält, und zwar jeden Wert nur einmal. Folgende Funktion erstellt das Feld:
' Erzeugen eines Feldes mit den Werten einer FlexGrid-Spalte ' flGrid- das Flexgrid, das bearbeitet werden soll ' arrayCol- die Schlüsselspalte '----------------------------------------------------------- Public Function makeArrayFromCol(flGrid As MSFlexGrid, arrayCol As Long) Dim i&, idx& Dim feld() As String With flGrid ReDim feld(.Rows - .FixedRows - 1) idx = 0 For i = .FixedRows To .Rows - 1 feld(idx) = .TextMatrix(i, arrayCol) idx = idx + 1 Next i End With QuickSort feld, LBound(feld), UBound(feld) feld = RemoveDoubleValues(feld) makeArrayFromCol = feld End Function
Sie sehen, dass hier die Funktion QuickSort zum Sortieren des Feldes (Tipp: QuickSort in VB), als auch die Funktion RemoveDoubleValues zum Beseitigen von doppelten Einträgen benutzt wird (Tipp: Andys VisualBasic Tipps).
Als nächstes benötigt man ein zu dem eben erzeugten Werte-Feld ein "Parallel-Feld", das dem jeweiligen Schlüsselwert einen Farbwert für den Zeilenhintergrund zuordnet.
Ich habe dafür zwei Funktionen geschrieben. Die erste erzeugt unter Benutzung der zweiten ein "korrespondierendes" Feld mit Farbwerten für die Zeilenhintergründe.
Wichtig: das Feld "farbPalette" muss als Public vereinbart werden.
' Erzeugen eines Feldes von Farbcodes ' anzElements- Anzahl der benötigten Feldelemente ' (in unserem Fall Ubound(des Wertefelds) ' param- ein Index für die Farbpalettenauswahl ' (siehe Bsp. In der Funktion setPalette) Public Function subArrayColors(anzElements As Integer, param As Integer) Dim feld() As Long Dim i% setPalette param ReDim feld(anzElements) For i = 0 To anzElements feld(i) = farbPalette(i) Next i subArrayColors = feld End Function
Die folgende Funktion erzeugt das Feld "farbPalette". Ich habe dazu ein Modul, in dem ich mehrere Farbpaletten als Enumerationen gespeichert habe. Für diesen Tipp zeige ich nur eine Möglichkeit, und zwar mit der VB-Palette.
' Setzen der Long-Werte der Farbpalette ' art- Index einer auszuwählenden Farbpalette Public Sub setPalette(art As Integer) Select Case art ' ................................. Case 2 farbPalette = Array( _ palColor1, palColor2, palColor3, palColor4, palColor5, palColor6, _ palColor7, palColor8, palColor9, palColor10, palColor11, palColor12, _ palColor13, palColor14, palColor15, palColor16, palColor17, palColor18, _ palColor19, palColor20, palColor21, palColor22, palColor23, palColor24, _ palColor25, palColor26, palColor27, palColor28, palColor29, palColor30, _ palColor31, palColor32, palColor33, palColor34, palColor35, palColor36, _ palColor37, palColor38, palColor39, palColor40, palColor41, palColor42, _ palColor43, palColor44, palColor45, palColor46, palColor47, palColor48) ' ................................. End Select End Sub
Und die zugehörige Enumeration:
Dim farbPakette As Variant Public Enum paletteColors palColor1 = &HFFFFFF palColor2 = &HC0C0FF palColor3 = &HC0E0FF palColor4 = &HC0FFFF palColor5 = &HC0FFC0 palColor6 = &HFFFFC0 palColor7 = &HFFC0C0 palColor8 = &HFFC0FF palColor9 = &HE0E0E0 palColor10 = &H8080FF palColor11 = &H80C0FF palColor12 = &H80FFFF palColor13 = &H80FF80 palColor14 = &HFFFF80 palColor15 = &HFF8080 palColor16 = &HFF80FF palColor17 = &HC0C0C0 palColor18 = &HFF& palColor19 = &H80FF& palColor20 = &HFFFF& palColor21 = &HFF00& palColor22 = &HFFFF00 palColor23 = &HFF0000 palColor24 = &HFF00FF palColor25 = &H808080 palColor26 = &HC0& palColor27 = &H40C0& palColor28 = &HC0C0& palColor29 = &HC000& palColor30 = &HC0C000 palColor31 = &HC00000 palColor32 = &HC000C0 palColor33 = &H404040 palColor34 = &H80& palColor35 = &H4080& palColor36 = &H8080& palColor37 = &H8000& palColor38 = &H808000 palColor39 = &H800000 palColor40 = &H800080 palColor41 = &H0& palColor42 = &H40& palColor43 = &H404080 palColor44 = &H4040& palColor45 = &H4000& palColor46 = &H404000 palColor47 = &H400000 palColor48 = &H400040 End Enum
Sind beide Felder erstellt, kann das Flexgrid mit der folgenden Funktion farbig erstellt werden:
' Erzeugen gefärbter Zeilen anhand von Werten in einer Spalte '--------------------------------------------------------------- ' flGrid- das FlexGrid, ' compCol- die Spalte mit den Vergleichswerten, ' werteFeld- ein Feld mit den Vergleichswerten, ' colorFeld- ein Feld mit den Farbwerten, ' defaultColor- die Normalfarbe ' compMethod- die Vergleichsmethode („all“- ganzer Wert, „in“- Teil des Werts) Public Sub coloredOfValue(flGrid As MSFlexGrid, _ compCol As Long, _ werteFeld As Variant, _ colorFeld As Variant, _ defaultColor As Long, _ compMethod As String) Dim i&, j&, cColor, fColor With flGrid .Redraw = False .BackColor = defaultColor .FillStyle = flexFillRepeat For i = .FixedRows To .Rows - 1 cColor = defaultColor .Row = i For j = 0 To UBound(werteFeld) If compMethod = "all" Then If werteFeld(j) = .TextMatrix(.Row, compCol) Then cColor = colorFeld(j) End If Else If InStr(.TextMatrix(.Row, compCol), werteFeld(j)) > 0 Then cColor = colorFeld(j) End If End If Next j .Col = .FixedCols .ColSel = .Cols - 1 .CellBackColor = cColor fColor = GegenFarbe_sw(cColor) .CellForeColor = fColor Next i .FillStyle = flexFillSingle .ScrollTrack = True .Redraw = True End With End Sub
Diese Funktion enthält eine weitere Funktion:
GegenFarbe_sw, die dem Tipp Klare Textfarbe bei variabler Hintergrundfarbe entnommen wurde. Sie gewährleistet, dass die Vordergrundfarbe der Zeile immer gut auf dem Hintergrund lesbar bleibt.
Nun zeige ich nur noch, wie die Aufrufe aussehen könnten, die Sie immer dann ausführen sollten, wenn das Flexgrid geladen oder verändert wird.
Dim keyFeld() As String Dim farbFeld() As Long keyFeld = makeArrayFromCol(MSFlexgrid1, 1) ' ....2- param für dieses Beispiel im Tipp farbFeld = subArrayColors(UBound(keyFeld), 2) coloredOfValue MSFlexgrid1, 1, keyFeld, farbFeld, palColor1, "all"
Wichtig zu sagen ist, dass die hier als Beispiel gezeigte Palette nur 48 Farben beinhaltet. Sind in Ihrer Anwendung wesentlich mehr unterschiedliche Schlüsselwerte zu erwarten, müssen Sie die Funktion zum Erzeugen der Farbpalette verändern, doch es gibt ja Millionen Farben im System...
Die Palette des IE stellt schon viel mehr Farben zur Verfügung, ich habe hier eben nur auch aus Platzgründen eine kleinere Palette benutzt.
Nun kann ich nur noch viel Spaß beim Colorieren wünschen!