StringGrid

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
WeHei
Beiträge: 11
Registriert: So 30. Okt 2016, 08:03

StringGrid

Beitrag von WeHei »

Wie kann man in einem StringGrid eine Gitterlinie z.B. die 3. und 5. vertikale und die 2. und 4. horizontale verstärkt hervorheben?

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: StringGrid

Beitrag von wp_xyz »

Quick-and-dirty-Lösung: Mit Hilfe des Ereignisses OnDrawCell des Grid kannst du die gewünschte Gitterlinie nachzeichnen:

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.

Antworten