Einzelnen Beitrag anzeigen

Perlsau
(Gast)

n/a Beiträge
 
#1

Gelöst: Algorithmus zum Ermitteln bestimmter StringGrid-Zellen

  Alt 29. Jul 2012, 10:34
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 ...
Miniaturansicht angehängter Grafiken
terminverwaltung.jpg  

Geändert von Perlsau (29. Jul 2012 um 11:26 Uhr) Grund: Gelöst
  Mit Zitat antworten Zitat