Можно ли сделать так чтобы TStringGrid автоматически изменял ширину колонок, чтобы вместить самую длинную строчку в колонке?

 

Code:

procedure AutoSizeGridColumn(Grid: TStringGrid; column: integer);

var

i: integer;

temp: integer;

max: integer;

begin

max := 0;

for i := 0 to (Grid.RowCount - 1) do

   begin

     temp := Grid.Canvas.TextWidth(grid.cells

);

     if temp > max then max := temp;

   end;

Grid.ColWidths

:= Max + Grid.GridLineWidth + 3;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

AutoSizeGridColumn(StringGrid1, 1);

end;

 

Поскольку в компоненте StringGrid по умолчанию все столбцы имеют одинаковую ширину - в некоторых ячейках текст обрезается. Чтобы этого избежать, после заполнения StringGrid нужно для каждого столбца находить текст максимальной длины и в соответствии с его длиной устанавливать ширину всего столбца

 

 

Code:

procedure TForm1.GridSumaDrawCell(Sender: TObject; ACol, ARow: Longint;

ARect: TRect; State: TGridDrawState);

var

dx: integer;

begin

with (Sender as TStringGrid).Canvas do

begin

   Font := GridSuma.Font;

   Pen.Color := clBlack;

   if (ACol = 0) or (ARow = 0) then

   begin

     { Рисуем заголовок }

     Brush.Color := clBtnFace;

     FillRect(ARect);

     TextOut(ARect.Left, ARect.Top, GridSuma.Cells[ACol, ARow])

   end

   else

   begin

     { Рисуем ячейку с правым выравниванием }

     Brush.Color := clWhite;

     FillRect(ARect);

     dx := TextWidth(GridSuma.Cells[ACol, ARow]) + 2;

     TextOut(ARect.Right - dx, ARect.Top, GridSuma.Cells[ACol, ARow])

   end

end

end;

 

Автор: Kurt

 Организуйте обработчик события сетки OnDrawCell. Создайте код обработчика подобный этому:

 

Code:

procedure TForm1.StringGrid1DrawCell(Sender: TObject; Col, Row: Longint;

Rect: TRect; State: TGridDrawState);

var

Txt: array[0..255] of Char;

begin

StrPCopy(Txt, StringGrid1.Cells[Col, Row]);

SetTextAlign(StringGrid1.Canvas.Handle,

   GetTextAlign(StringGrid1.Canvas.Handle)

   and not (TA_LEFT or TA_CENTER) or TA_RIGHT);

ExtTextOut(StringGrid1.Canvas.Handle, Rect.Right - 2, Rect.Top + 2,

   ETO_CLIPPED or ETO_OPAQUE, @Rect, Txt, StrLen(Txt), nil);

end;

 

Автор: Пётр Соболь

 

Code:

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow:

Integer; Rect: TRect; State: TGridDrawState);

var

Format: Word;

C: array[0..255] of Char;

r: integer;

begin

C := '';

Format := DT_LEFT or DT_WORDBREAK;

(Sender as TStringGrid).Canvas.FillRect(Rect);

StrPCopy(C, (Sender as TStringGrid).Cells[ACol, ARow]);

if c <> '' then //если есть значения

begin

   r := WinProcs.DrawText((Sender as TStringGrid).Canvas.Handle, C,

     StrLen(C), Rect, Format);

   if r > (Sender as TStringGrid).RowHeights[Arow] then

     //если высота колонки меньше

     (Sender as TStringGrid).RowHeights[Arow] := r;

end;

end;

 

Ниже приведён примен кода, который позволяет автоматически подогнать размер колонки в компененте TStringGrid, под размер самой длинной строки текста в колонке:

 

Code:

procedure AutoSizeGridColumn(Grid : TStringGrid;

                             column : integer);

var

i : integer;

temp : integer;

max : integer;

begin

max := 0;

for i := 0 to (Grid.RowCount - 1) do begin

   temp := Grid.Canvas.TextWidth(grid.cells

);

   if temp > max then max := temp;

end;

Grid.ColWidths

:= Max + Grid.GridLineWidth + 3;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

AutoSizeGridColumn(StringGrid1, 1);

end;