StringGrid
StringGrid
Wie kann man in einem StringGrid eine Gitterlinie z.B. die 3. und 5. vertikale und die 2. und 4. horizontale verstärkt hervorheben?
Re: StringGrid
Quick-and-dirty-Lösung: Mit Hilfe des Ereignisses OnDrawCell des Grid kannst du die gewünschte Gitterlinie nachzeichnen:
Allerdings ist die Gitterlinie selbst wegen Clipping nicht zugänglich. Wenn du nur eine Gitterlinie dicker, aber in derselben Farbe malen willst, ist das sicher die Lösung.
Um in einer anderen Farbe zu malen, musst du versuchen, irgendwie das Clipping im Grid auszuhebeln; mein erster Versuch, das ClipRect des Canvas zu vergrößern, hat nicht funktioniert.
Oder aber du probierst diesen Hack, den man manchmal in der Delphi-Community sieht: Hier wird von TStringGrid ein neues Grid abgeleietet und die Methode DrawCellGrid überschrieben.
Der Trick ist, dass die neue Klasse denselben Namen hat wie das Standard-StringGrid. Wenn du die Unit, in der das implementiert wird, in der Uses-Zeile NACH (*) Grids verwendest, verwendet der Compiler die neue Klasse und nimmt den geänderten Code (oder du implementierst das neue Grid gleich in derselben Unit, in der es verwendet wird). Das funktioniert, weil die neue Klasse keine neuen Eigenschaften definiert, so dass alle aus dem Standard-Grid bekannten Properties aus dem Formular gelesen werden können.
(*) Ich kann mir das immer nicht merken, evtl muss die Unit auch VOR Grids stehen. Einfach ausprobieren, eine Möglichkeit funktioniert.
Code: Alles auswählen
procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
aRect: TRect; aState: TGridDrawState);
begin
if (aRow = 2) and (aCol > 0) then begin
StringGrid1.Canvas.Pen.Style := psSolid;
StringGrid1.Canvas.Pen.Color := clRed;
StringGrid1.Canvas.Pen.Width := 1;
StringGrid1.Canvas.Line(ARect.Left, ARect.Bottom-2, ARect.Right, ARect.Bottom-2);
end;
end;
Allerdings ist die Gitterlinie selbst wegen Clipping nicht zugänglich. Wenn du nur eine Gitterlinie dicker, aber in derselben Farbe malen willst, ist das sicher die Lösung.
Um in einer anderen Farbe zu malen, musst du versuchen, irgendwie das Clipping im Grid auszuhebeln; mein erster Versuch, das ClipRect des Canvas zu vergrößern, hat nicht funktioniert.
Oder aber du probierst diesen Hack, den man manchmal in der Delphi-Community sieht: Hier wird von TStringGrid ein neues Grid abgeleietet und die Methode DrawCellGrid überschrieben.
Code: Alles auswählen
type
TStringGrid = class(Grids.TStringGrid)
protected
procedure DrawCellGrid(aCol,aRow: Integer; aRect: TRect; aState: TGridDrawState); override;
end;
procedure TStringGrid.DrawCellGrid(aCol,aRow: Integer; aRect: TRect; aState: TGridDrawState);
begin
inherited;
if (aRow = 2) and (ACol > 0) then begin
Canvas.Pen.Style := psSolid;
Canvas.Pen.Color := clRed;
Canvas.Pen.Width := 3;
Canvas.Line(ARect.Left, ARect.Bottom-1, ARect.Right, ARect.Bottom);
end;
end;
Der Trick ist, dass die neue Klasse denselben Namen hat wie das Standard-StringGrid. Wenn du die Unit, in der das implementiert wird, in der Uses-Zeile NACH (*) Grids verwendest, verwendet der Compiler die neue Klasse und nimmt den geänderten Code (oder du implementierst das neue Grid gleich in derselben Unit, in der es verwendet wird). Das funktioniert, weil die neue Klasse keine neuen Eigenschaften definiert, so dass alle aus dem Standard-Grid bekannten Properties aus dem Formular gelesen werden können.
(*) Ich kann mir das immer nicht merken, evtl muss die Unit auch VOR Grids stehen. Einfach ausprobieren, eine Möglichkeit funktioniert.