2
votes

Is it possible to add that arrow pointer thing to a String Grind in Delphi 7? You know what I mean, that arrow pointer that you can see at the left in a DBGrid.

2
Please don't put information in the title (like '(Delphi 7)') that you can include in the tags. The tag system works extremely well here, and repeating the information in the subject isn't necessary. Thanks. :-) - Ken White

2 Answers

4
votes

Yes, but not automatically. You would need to display a triangle manually. You can override OnDrawCell for your grid. It seems you need to set the FixedCols to 0 since it doesn't appear to redraw the fixed cells again when the row selection changes.

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  aCanvas: TCanvas;
  oldColor: TColor;
  triangle: array [0..2] of TPoint;
const
  spacing = 4;
begin
  if (ACol = 0) and (aRow = StringGrid1.Row) then
  begin
    aCanvas := (Sender as TStringGrid).Canvas;  // To avoid with statement
    oldColor := aCanvas.Brush.Color;
    // Shape the triangle
    triangle[0] := TPoint.Create(Rect.Left + spacing, Rect.Top + spacing);
    triangle[1] := TPoint.Create(Rect.Left + spacing, Rect.Top + Rect.Height - spacing);
    triangle[2] := TPoint.Create(Rect.Left + Rect.Width - spacing, Rect.Top + Rect.Height div 2);

    // Draw the triangle
    aCanvas.Pen.Color := clBlack;
    aCanvas.Brush.Color := clBlack;
    aCanvas.Polygon(triangle);
    aCanvas.FloodFill(Rect.Left + Rect.Width div 2, Rect.Top + Rect.Height div 2, clBlack, fsSurface);
    aCanvas.Brush.Color := oldColor;
  end;
end;

This draws a triangle in the box. You should get the general idea.

1
votes

Not automatically; it's not part of the standard TStringGrid. The "arrow pointer thing" is called the row indicator, and it's a feature added in TDBGrid. It's declared in TDBGridOptions, specifically dgIndicator, as seen below:

TDBGridOption = (dgEditing, dgAlwaysShowEditor, dgTitles, dgIndicator,
    dgColumnResize, dgColLines, dgRowLines, dgTabs, dgRowSelect,
    dgAlwaysShowSelection, dgConfirmDelete, dgCancelOnExit, dgMultiSelect);

Note that this is different from TGridOption declared in the Grids unit, which does not contain anything similar. (There is no goIndicator or equivalent.)

In order to get the indicator, you'd have to draw it yourself in the OnDrawCell event when you receive a ACol value of 0 with ARow equivalent to the Grid.Row value. There's an example of TStringGrid.OnDrawCell in this answer, although it's demonstrating setting a custom row height and not drawing the row indicator.