Moin allerseits, heute hab ich ein eher kniffliges Problem, dessen Lösung mir partout nicht einfallen will:
Ich bastle mir gerade eine eigene Terminverwaltung mit einem StringGrid (TjvStringGrid). Via OnDrawCell manipuliere ich gewisse Zellen hinsichtlich Hintergrund- und Schriftfarbe. So sollen u.a. auch die Tage, die nicht zum aktuellen Monat gehören (ein paar in Row 1 und ein paar in der letzten Zeile) anders gefärbt werden als die zum Monat gehörenden Tage. Die Schriftfarbe dieser Zellen ist auf rot eingestellt, wie man am angehängten Screenshot sehen kann. Zu meiner Verwirrung werden die ersten Tage des nächsten Monats im Gegensatz zu den letzten Tagen des vorherigen Monats nicht rot dargestellt.
Hier einmal die OnDrawCell-Procedure:
Delphi-Quellcode:
procedure TFormTermin.StrGrid_MonatDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
VAR
p : Integer;
Aus : String;
begin
// Farbliche Markierung der Zellen mit einem Termineintrag
Aus := StrGrid_Monat.Cells[ACol,ARow]; // Zelle auslesen
p := POS(CHR(10),Aus); // nach Zeilenumbruch suchen
IF p > 0 THEN // wenn Zeilenumbruch gefunden dann
BEGIN
IF (ACol > 0) AND (ARow > 0) THEN // wenn Spalte > 0 AND Zeile > 0 dann
BEGIN
StrGrid_Monat.Canvas.Font.Color := Konst.Benutzer.TermStrGridEinColorFont; // Schriftfarbe setzen
StrGrid_Monat.Canvas.Brush.Color := Konst.Benutzer.TermStrGridEinColor; // Hintergrundfarbe setzen
StrGrid_Monat.Canvas.FillRect(Rect); // zeichnen
END;
END ELSE // wenn kein Zeilenumbruch gefunden
BEGIN
IF (ACol > 0) AND (ARow > 0) THEN
BEGIN
StrGrid_Monat.Canvas.Font.Color := Benutzer.TermStrGridColorFont;
StrGrid_Monat.Canvas.Brush.Color := Konst.Benutzer.TermStrGridColor;
StrGrid_Monat.Canvas.FillRect(Rect);
END;
END;
// Aus enthält noch immer den Zellen-Inhalt
IF Aus <> '' THEN // wenn Aus nicht leer ist
BEGIN
IF TryStrToInt(Aus,p) THEN // wenn Aus eine Zahl enthält
IF ((ARow = 1) AND (ACol > 0) AND (p > 7)) OR // wenn Zeile 1 AND Spalte > 0 AND Tag > 7 oder
((ARow = StrGrid_Monat.ColCount -1) AND (ACol > 0) AND (p < 7)) THEN // wenn letzte Zeile AND Spalte > 0 AND Tag < 7
StrGrid_Monat.Canvas.Font.Color := Konst.Benutzer.TermStrGridOtherColor;
END;
IF ARow > 0 THEN
StrGridAusrichtung(StrGrid_Monat, Rect, ACol, ARow, taLeftJustify, TRUE) ELSE
StrGridAusrichtung(StrGrid_Monat, Rect, ACol, ARow, taCenter, False);
IF ACol = 0 THEN StrGridAusrichtung(StrGrid_Monat, Rect, ACol, ARow, taRightJustify, FALSE);
Soweit ich das beurteilen kann, ist mein Algorithmus, der die ersten Tage des nächsten Monats ermitteln soll, stimmig. Aber er funktioniert nicht. Also stimmt was nicht. Nur was? Sicher wieder irgend so ein dummer Fehler, den ich vor läuter Bäumen nicht sehe ...