Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TStringGrid - Zellen nicht färben (https://www.delphipraxis.net/119053-tstringgrid-zellen-nicht-faerben.html)

Stex 20. Aug 2008 09:18


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;

taaktaak 20. Aug 2008 10:29

Re: TStringGrid - Zellen nicht färben
 
Zitat:

bestimmte Zellen gar nicht anzeigen, die komplette Breite des Grids soll allerdings erhalten bleiben
Nur 'ne Idee: Die auszublendenden Spalten auf ColWidth:=-GridLineWidth setzen (sonst doppelte Trennlinien) und die sichtbaren Spalten entsprechend breiter setzen oder eine zusätzliche (leere) letzte Spalte anfügen, damit die Gesamtbreite erhalten bleibt.

//edit: Wieso die Überschrift: "... Zellen nicht färben" ???

Stex 20. Aug 2008 10:40

Re: TStringGrid - Zellen nicht färben
 
Zitat:

Zitat von taaktaak
Zitat:

bestimmte Zellen gar nicht anzeigen, die komplette Breite des Grids soll allerdings erhalten bleiben
Nur 'ne Idee: Die auszublendenden Spalten auf ColWidth:=-GridLineWidth setzen (sonst doppelte Trennlinien) und die sichtbaren Spalten entsprechend breiter setzen oder eine zusätzliche (leere) letzte Spalte anfügen, damit die Gesamtbreite erhalten bleibt.

Entschuldige, ich habe wohl etwas zu wenig beschrieben, was ich eigentlich machen möchte *g*
Das Grid liegt über einem anderen Grid und soll den Zeitraum der Schulferien darstellen (hier blau gefärbt)
http://img.7pics.info/grid1_6ef.jpg

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:

//edit: Wieso die Überschrift: "... Zellen nicht färben" ???

taaktaak 20. Aug 2008 11:00

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.

Stex 20. Aug 2008 13:49

Re: TStringGrid - Zellen nicht färben
 
Zitat:

Zitat von taaktaak
// 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.

Das obere Grid ist ja das Feriengrid und hat nur eine Zeile, keine FixedRows/-Cols.
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.

Hansa 20. Aug 2008 14:08

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.

stahli 20. Aug 2008 14:17

Re: TStringGrid - Zellen nicht färben
 
..oder eben die normalen Headerzellen blau und die Wochenenden zur Unterscheidung etwas dunkler blau...

Stex 20. Aug 2008 16:36

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.

http://img.7pics.info/grid2_475.jpg

taaktaak 20. Aug 2008 18:36

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. diesen Thread.

Stex 21. Aug 2008 10:26

Re: TStringGrid - Zellen nicht färben
 
Wunderbar, herzlichen Dank :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz