AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

TStringGrid - Zellen nicht färben

Ein Thema von Stex · begonnen am 20. Aug 2008 · letzter Beitrag vom 21. Aug 2008
Antwort Antwort
Stex

Registriert seit: 12. Nov 2006
8 Beiträge
 
Delphi 7 Professional
 
#1

TStringGrid - Zellen nicht färben

  Alt 20. Aug 2008, 09:18
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;
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#2

Re: TStringGrid - Zellen nicht färben

  Alt 20. Aug 2008, 10:29
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" ???
Ralph
  Mit Zitat antworten Zitat
Stex

Registriert seit: 12. Nov 2006
8 Beiträge
 
Delphi 7 Professional
 
#3

Re: TStringGrid - Zellen nicht färben

  Alt 20. Aug 2008, 10:40
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" ???
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#4

Re: TStringGrid - Zellen nicht färben

  Alt 20. Aug 2008, 11:00
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.
Ralph
  Mit Zitat antworten Zitat
Stex

Registriert seit: 12. Nov 2006
8 Beiträge
 
Delphi 7 Professional
 
#5

Re: TStringGrid - Zellen nicht färben

  Alt 20. Aug 2008, 13:49
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.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#6

Re: TStringGrid - Zellen nicht färben

  Alt 20. Aug 2008, 14:08
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: TStringGrid - Zellen nicht färben

  Alt 20. Aug 2008, 14:17
..oder eben die normalen Headerzellen blau und die Wochenenden zur Unterscheidung etwas dunkler blau...
  Mit Zitat antworten Zitat
Stex

Registriert seit: 12. Nov 2006
8 Beiträge
 
Delphi 7 Professional
 
#8

Re: TStringGrid - Zellen nicht färben

  Alt 20. Aug 2008, 16:36
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
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#9

Re: TStringGrid - Zellen nicht färben

  Alt 20. Aug 2008, 18:36
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.
Ralph
  Mit Zitat antworten Zitat
Stex

Registriert seit: 12. Nov 2006
8 Beiträge
 
Delphi 7 Professional
 
#10

Re: TStringGrid - Zellen nicht färben

  Alt 21. Aug 2008, 10:26
Wunderbar, herzlichen Dank
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:55 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