Jak automatycznie dostosować szerokość kolumny w StringGrid? Do tej pory tylko ustawiałem na sztywno określoną długość
strngrd1.ColWidths[0] := 30;
Jak automatycznie dostosować szerokość kolumny w StringGrid? Do tej pory tylko ustawiałem na sztywno określoną długość
strngrd1.ColWidths[0] := 30;
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;
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)
.