![]() |
TStringGrid - Zellen nicht färben
Hallo,
ich habe ein Stringgrid und möchte nun bestimmte Zellen gar nicht anzeigen, die komplette Breite des Grids soll allerdings erhalten bleiben. An sich dachte ich, ich könnte das DrawCell-Ereignis für diese Zellen einfach per if dazu bringen, nicht auszuführen, aber das funktionierte nicht wirklich. Wie kann ich das Grid dazu bringen, einige Zellen einfach auszublenden, auch wenn die Gesamtbreite des Grids unverändert bleibt und auch die Zellen dahinter an genau der Position sind, an der sie auch wären, wenn die Zellen davor angezeigt würden? Danke schon einmal im Voraus! Inhalt der DrawCell-Methode (durch die zweite Zeile wollte ich das Zeichnen der Zelle verhindern):
Delphi-Quellcode:
invcols := Explode(';', InvisibleCols);
if SearchInDynArray(IntToStr(ACol), invcols) = -1 then begin if assigned(onDrawCell) then onDrawCell(self, aCol, ARow, Rect, State); inherited DrawCell(ACol, Arow, Rect, State); if RightAlignCols <> '' then begin right := Explode(';', RightAlignCols); end; hrowcolor := HTML2Color(SecondRowsHTMLColor); if gdFocused in State then begin selRow := ARow; selCol := ACol; end; if (ARow = 0) and (ACol = lastsortcol) then //Dreiecke zeichnen begin with Self do begin if FProps.ShowAscendingSymbol = true then begin if ascending = false then begin Canvas.Brush.Color := ascsymbolcolor; //$00AB8552; Canvas.Polygon([Point(Rect.Right-20,Rect.Top+2), // Pfeil nach unten Point(Rect.Right-2,Rect.Top+2), Point(Rect.Right-11,Rect.Top+12)]); end else if ascending = true then begin Canvas.Brush.Color := ascsymbolcolor; //$00AB8552; Canvas.Polygon([Point(Rect.Right-11,Rect.Top+7), // Pfeil nach oben Point(Rect.Right-20,Rect.Top+17), Point(Rect.Right-2,Rect.Top+17)]); end; end; end; end; if self.FixedCols > 0 then temp := 0 else temp := -1; if (ARow < self.FixedRows) or (ARow = fboldrow) then if FProps.BoldFixedCaptions = true then begin fonttemp := Canvas.Font; Canvas.Font.Style := [fsBold]; Canvas.TextOut(Rect.Left + 2, Rect.Top + 1, self.Cells[ACol, ARow]); //Dann Text in der Zelle ausgeben canvas.Font := fonttemp; end; if (ACol > temp) and (ARow > 0) then begin with self do begin s := cells[ACol, ARow]; if ((ARow mod 2) = 0) then //jede zweite Zeile berücksichtigen begin if (not (gdSelected in State)) and (FProps.CustomColorForSecondRows = true) then begin Canvas.Brush.Color := hrowcolor; //Farbe die jede zweite Zeile bekommen soll. Canvas.FillRect(Rect); end; end; if ((not (goRowSelect in Options)) and (gdFocused in State)) then //Wenn RowSelect = False die aktive Zelle blau färben begin Canvas.Brush.Color := selcellcolor; //Farbe der selektierten Zelle wenn RowSelect = False; Canvas.FillRect(Rect); end; //Zeilenumbruch if FProps.WordWrap = true then begin If Length(S) > 0 Then Begin drawrect := rect; drawrect.Left := drawrect.left + 2; drawrect.top := drawrect.top + 1; DrawText(canvas.handle, Pchar(S), Length(S), drawrect, dt_calcrect or dt_wordbreak or dt_left ); If (drawrect.bottom - drawrect.top) > RowHeights[Arow] Then RowHeights[Arow] := (drawrect.bottom - drawrect.top) Else Begin drawrect.Right := rect.right; canvas.fillrect( drawrect ); if SearchInDynArray(IntToStr(ACol), right) = -1 then DrawText(canvas.handle, Pchar(S), Length(S), drawrect, dt_wordbreak or dt_left) else Display(self, self.Cells[ACol, ARow], taRightJustify); End; End; end //Zeilenumbruch Ende else begin if SearchInDynArray(IntToStr(ACol), right) = -1 then Canvas.TextOut(Rect.Left + 2, Rect.Top + 1, self.Cells[ACol, ARow]) //Text ohne Zeilenumbruch ausgeben else Display(self, self.Cells[ACol, ARow], taRightJustify); //Text mit Align Right ausgeben end; end; //with end; end; |
Re: TStringGrid - Zellen nicht färben
Zitat:
//edit: Wieso die Überschrift: "... Zellen nicht färben" ??? |
Re: TStringGrid - Zellen nicht färben
Zitat:
Das Grid liegt über einem anderen Grid und soll den Zeitraum der Schulferien darstellen (hier blau gefärbt) ![]() Ich habe zuerst versucht, die Left-Eigenschaft des Feriengrids auf die Position der Spalte "01" des darunterliegenen Grids zu setzen, allerdings kam es dann u.a. aufgrund der Fettschrift zu Verschiebungen. Also hatte ich eigentlich vor, das Feriengrid an derselben Position "starten" zu lassen wie das andere Grid und lediglich die ersten 4 Spalten nicht einzufärben und die darunterliegenden Buttons sichtbar zu machen, daher auch: Zitat:
|
Re: TStringGrid - Zellen nicht färben
Hmmm, wozu benötigst du denn das darunterliegende Grid? Nur für die Darstellung der blauen Markierung? Wenn ja, solltest du das auch mit nur EINEM Grid erledigen können: Definiere in deinem Ferien-Grid 2 FixedRows und zeichne die oberste fixe Zeile (mit den blauen Markierungen) selbst. In den ersten 4 Spalten verbindest du die Zeilen 0 und 1 und setzt die Schrift vertikal in die Mitte.
// weitere Idee: Noch einfacher, wenn du auf diese Zeile (d.h. die zweite FixedRow) ganz verzichtest und die Farbmarkierung direkt in der obersten Zeile des Ferien-Grids darstellst. Das wäre m.E. genau so deutlich zu erkennen. |
Re: TStringGrid - Zellen nicht färben
Zitat:
Das untere Grid dient der Auflistung eines Mitarbeiterstundenzettels, daher müsste die oberste Zeile schon die Fixedrow sein, die Ferien sollen darüber dargestellt werden, daher geht das schonmal nicht. Zu deinem anderen Vorschlag: Wie kann ich denn Zellen über zwei Zeilen verbinden? Ich habe nur Code gefunden, der zwei Spalten miteinander verbinden kann und nicht einmal das besonders hübsch. |
Re: TStringGrid - Zellen nicht färben
Ich würde die Ferienzellen komplett färben. Wenn oben so ein Balken zu sehen ist und unten die Zeile ist da weit weg davon, dann muss man zu genau gucken um sich nicht zu vertun.
|
Re: TStringGrid - Zellen nicht färben
..oder eben die normalen Headerzellen blau und die Wochenenden zur Unterscheidung etwas dunkler blau...
|
Re: TStringGrid - Zellen nicht färben
Das ist das Problem... die Ferien sollen über den Tagen erscheinen und nicht als Hintergrund. Wenn's nach mir ginge, würde ich auch einfach die Farbe der FixedRow ändern, aber das tut's leider nicht :/
Ich habe jetzt noch eine zweite FixedRow angefügt und lasse die Ferien darin anzeigen. Ist nicht so schön als wenn die Ferien als eigenständige Leiste darüberstehen würden, aber es ist eine Lösung. Was ich nicht so schön finde sind die Rahmenlinien zwischen der ersten und der 2. fixedrow im bereich ARow < 4, aber ich weiß auch nicht, wie ich dir am besten wegbekomme. ![]() |
Re: TStringGrid - Zellen nicht färben
Hallo Stex.
Dann bist du ja jetzt einen Schritt weiter. Das Verbinden von Zellen wird hier öfter behandelt. Mit der Suche findest du eine ganze Reihe von beiträgen. Vor kurzem gab es z.B. ![]() |
Re: TStringGrid - Zellen nicht färben
Wunderbar, herzlichen Dank :)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz