Einzelnen Beitrag anzeigen

StefanL38

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

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

  Alt 15. Aug 2021, 12: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