AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign StringGrid erste Zeile fixiert aber JEDE Row-0-Zelle mit anderer Farbe
Thema durchsuchen
Ansicht
Themen-Optionen

StringGrid erste Zeile fixiert aber JEDE Row-0-Zelle mit anderer Farbe

Ein Thema von StefanL38 · begonnen am 15. Aug 2021 · letzter Beitrag vom 15. Aug 2021
Antwort Antwort
StefanL38

Registriert seit: 3. Nov 2013
11 Beiträge
 
#1

StringGrid erste Zeile fixiert aber JEDE Row-0-Zelle mit anderer Farbe

  Alt 15. Aug 2021, 12:29
Hallo,

also ich habe jetzt so einiges probiert um in einem StringGrid bei dem die erste Zeile (FixedRows = 1) fixiert ist
die Zellen eben dieser ersten, fixierten Reihe mit verschiedenen Farben zu versehen.

Die üblichen Vorschläge dazu sind, dass man in den Eventhandler DrawCell Bedingungen einbaut und
- von hinten durch die Brust ins Auge - das man mit einem farbigen Rechteck und evtl. den Textinhalt der Zelle
sozusagen übermalt.

Das habe ich aber für die fixierte Zelle nicht hinbekommen.
fixierte Zellen scheinen vom
    with TStringGrid(Sender).Canvas do ausgenommen zu sein.

Wenn ich in der DrawCwell-procedure FixedRow zwischen 0 um darauf malen zu können
und nach dem malen auf 1 hin- und herschalte löst das immer neue DrawCell-Ereignisse aus.

Die andere Idee ist die erste Zeile fixiert zu lassen und mir die Koordinaten zu berechnen.
Da aber der Stringgrid mehr Spalten hat als im Ausschnitt gleichzeitig darstellbar müsste ich beim Scrollen
eine Menge Positionsmanagement machen damit die farbigen Rects immer an der richtigen Stelle gemalt werden.

Die ganze Spalte einfärben möchte ich lieber nicht weil ich dann auch noch die Schriftfarbe abhängig von der Hintergrundfarbe auf eine kontrastreiche Farbe ändern müsste.

Am einfachsten wäre natürlich eine Grid-Komponente die color als property für jede einzelne Zelle hat.
Einmal Farbe setzen und gut is.
Gibt es so eine Komponente?

Wenn jemand noch eine andere Idee postet wie man das realisieren kann wäre ich sehr dankbar.

viele Grüße Stefan
  Mit Zitat antworten Zitat
StefanL38

Registriert seit: 3. Nov 2013
11 Beiträge
 
#2

AW: StringGrid erste Zeile fixiert aber JEDE Row-0-Zelle mit anderer Farbe

  Alt 15. Aug 2021, 13:55
So jetzt habe ich doch eine Lösung gefunden:

Ich habe einen Array
  Spaltenfarbe : Array[0..100] of TColor; definiert. Der Einfachheit halber 100 Elemente = mehr als ich maximal brauche.

Die Farbwerte im Array werden mit clWhite initialisiert
Delphi-Quellcode:
  for i := 0 to 100 do
  begin
    Spaltenfarbe[i] := clWhite;
  end;

Der Eventhandler SelectCell speichert mir die Spalte / Reihe der angeklickten Zelle
Delphi-Quellcode:
procedure TForm1.StringGridVorschauSelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);

  begin
  SelectedCellCol := ACol;
  SelectedCellRow := ARow;

  //ShowMessage('Col=' + IntToStr(SelectedCellCol) + ' Row=' + IntToStr(SelectedCellRow) );
end;
Doppelklick ruft den Farbauswahldialog auf

Delphi-Quellcode:
procedure TForm1.StringGridVorschauDblClick(Sender: TObject);
begin
  ColorCellCol := SelectedCellCol;
  ColorCellRow := SelectedCellRow;
  ColorDialog1.Execute;
  Spaltenfarbe[ColorCellCol] := ColorDialog1.Color;
end;
Und weist dem Array-Element die Farbe aus dem Colordialog zu.


Dem Farbauswahldialog habe ich gleich noch einen hinweisgebenden Titel verpasst
Delphi-Quellcode:
procedure TForm1.ColorDialog1Show(Sender: TObject);
begin
  SetWindowText(ColorDialog1.Handle, 'Farbe für Spalte '
  + StringGridVorschau.Cells[SelectedCellCol, 0] + ' setzen' );
end;
Im DrawCell-Eventhandler werden dann die farbigen Rects und mit weiß/schwarz als Kontrastfarbe
der Text geschrieben.
Aber nur dann wenn auch eine Farbe <> weiß gesetzt wurde.

Delphi-Quellcode:
procedure TForm1.StringGridVorschauDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);

begin
  with sender as Tstringgrid do
    if ( (ARow = 0) and (Spaltenfarbe[ACol] <> clWhite) ) then
    begin
      Canvas.brush.Color := Spaltenfarbe[ACol];
      Canvas.Font.Color := BlackWhiteContrastColor(Spaltenfarbe[ACol]);
      canvas.fillRect(Rect);
      canvas.TextOut(Rect.Left,Rect.Top,Cells[ACol,ARow]);
    end;
end;
Die Schriftfarbe schwarz/weiß wird von dieser function ermittelt
Delphi-Quellcode:
function BlackWhiteContrastColor(value: TColor):TColor;
var
  intensity : Integer;
begin
  value := ColorToRGB(value);

  intensity := GetBValue(value) * 21 // Blue
    + GetGValue(value) * 174 // Green
    + GetRValue(value) * 61; // Red

   // intensity = 0 -> dark
   // intensity = 255*256 -> bright

  if intensity >= (128*256) then
    Result := clBlack
  else
    Result := clWhite;
end;
viele Grüße Stefan
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 04:50 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