I have a procedure to auto-resize a column in a grid to accommodate for the largest string in that column. However when there’s over 2,000 records in the grid, it takes a little too much time. Any tips on speeding this up?
//lstSKU = grid
procedure TfrmExcel.ResizeCol(const ACol: Integer);
var
M: Integer;
X: Integer;
S: String;
R: TRect;
begin
M:= 20;
lstSKU.Canvas.Font.Assign(lstSKU.Font);
for X:= 1 to lstSKU.RowCount - 1 do begin
S:= lstSKU.Cells[ACol, X];
R:= Rect(0, 0, 20, 20);
DrawText(lstSKU.Canvas.Handle, PChar(S), Length(S), R,
DT_LEFT or DT_VCENTER or DT_CALCRECT);
if R.Right > M then
M:= R.Right;
end;
M:= M + 15;
lstSKU.ColWidths[ACol]:= M;
end;
Is this a standard TStringGrid/TDrawGrid?
You can iterate through using
Canvas.TextWidth(S)instead to measure the content width of each cell, save the largest, add any padding, and then set theGrid.ColWidths[Col] := M;. This will trigger a single redraw if needed. (Basically what you’re doing, without repeating the drawing operation 2001 times.)If you want to set both width and height of the cell to accomodate larger fonts or something, use
TextExtentinstead ofTextWidth;TextExtentreturns aTSize, from which you can readWidthandHeight.