Ein kleines Problem bekomme ich noch nicht weg, es wird am Anfang immer die erste Zelle im Grid mit der Farbe überzeichnet, welche für die Selektion gedacht ist.
Auch wenn ich die Selektion komplett aufhebe bleibt sie in der falschen Farbe.
Zum nachvollziehen habe ich unten den ganzen Code der Unit, kann man direkt so übernehmen zum testen. Ist diesmal mit der Standard Komponente.
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Variants, Grids, Forms, Dialogs, Controls,
StdCtrls, LCLIntf, LCLType, Graphics;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
StringGrid1: TStringGrid;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
aRect: TRect; aState: TGridDrawState);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
var
Reihe: Integer = 0;
procedure TForm1.FormCreate(Sender: TObject);
begin
with StringGrid1 do
begin
Cells[1,1]:= 'Hallo';
FixedCols := 0;
FixedRows := 0;
end;
end;
procedure TForm1.Button1Click(Sender: TObject); // Ganze Reihen nacheinander markieren
begin
if Reihe > StringGrid1.RowCount-1 then Reihe:= 0;
StringGrid1.Selection := TGridRect(Rect(0,Reihe,StringGrid1.ColCount-1,Reihe));
Inc(Reihe);
end;
procedure TForm1.Button2Click(Sender: TObject); //Auswahl löschen
begin
StringGrid1.Selection := TGridRect(Rect(-1,-1,-1,-1));
end;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
aRect: TRect; aState: TGridDrawState);
var
ZeilenText: string;
MyTxtStyle: TTextStyle;
begin
with StringGrid1 do
begin
if (gdSelected in AState) then //Wenn die Zelle ausgewählt ist
begin
Canvas.Font.Color := clblack;
Canvas.Brush.Color := clGray; //Farbe wenn Zelle ausgewählt ist
end
else if ACol mod 2 = 0 then //Jede zweite Spalte
begin
Canvas.Font.Color := clWhite;
Canvas.Brush.Color := clBlue; //Farbe auswählen zum Zeichnen
end
else //sonstige Zellen
begin
Canvas.Font.Color := clWindowText;
Canvas.Brush.Color := clWindow; //Farbe auswählen zum Zeichnen
end;
Canvas.FillRect(ARect); //Zelle Zeichnen
ZeilenText := Cells[ACol, ARow]; // Text der Zelle holen
//Text zentriert zeichnen
MyTxtStyle.Alignment := taCenter;
MyTxtStyle.Layout := tlCenter;
Canvas.TextRect(aRect,aRect.Left, aRect.Top, ZeilenText,MyTxtStyle);
end;
end;
end.