Jak ustawić autosize kolumn w StringGrid?

0

Jak automatycznie dostosować szerokość kolumny w StringGrid? Do tej pory tylko ustawiałem na sztywno określoną długość

   strngrd1.ColWidths[0] := 30;
2

Dostosować do czego? Jak do zawartości to nie ma właściwości która na to pozwoli jedyne wyjście to po każdej zmianie zawartości wywoływać sobie procedurę w stylu:

procedure AutoSizeCol(AGrid: TStringGrid; ACol: Integer);
const
  MARGIN = 5;
var
  i, TexWidth, ColWidth: Integer;
begin
  if (not Assigned(AGrid)) or (ACol > AGrid.ColCount - 1) then exit;
  ColWidth:= 0;
  for i:=0 to AGrid.RowCount - 1 do
  begin
    TexWidth:= AGrid.Canvas.TextWidth(AGrid.Cells[ACol, i]);
    if TexWidth > ColWidth then
      ColWidth:= TexWidth;
  end;
  AGrid.ColWidths[ACol]:= ColWidth + 2 * MARGIN;
end;
0

Kod podany przez @kAzek powinien w zupełności wystarczyć, ale można się podłączyć pod istniejące mechanizmy w kontrolce i zaimplementować sobie w dość prosty sposób takie automatyczne dostosowywanie szerokości kolumn; Ewentualnie napisać sobie helper dla istniejącej klasy, który by używał tego co podał poprzednik, ale poprawiając czytelność składni wywołania;

Przykład:

type
  TStringGridHelper = class helper for TStringGrid
  public
    procedure AutoSizeCol(AColIndex: Integer);
  end;
  
procedure TStringGridHelper.AutoSizeCol(AColIndex: Integer);
var
  COLUMN_MARGIN = 10;
var
  LRowIdx, LColWidth: Integer;
begin
  LColWidth := 0;
  
  for LRowIdx := 0 to Self.RowCount - 1 do
    LColWidth := Max(LColWidth, Self.Canvas.TextWidth(Self.Cells[AColIndex, LRowIdx]));
    
  Self.ColWidths[AColIndex] := LColWidth + COLUMN_MARGIN;
end;

Wtedy też zamiast wołać AutoSizeCol(MyGrid, 2), wystarczy MyGrid.AutoSizeCol(2).

1 użytkowników online, w tym zalogowanych: 0, gości: 1