Размеры колонок и строк, выравнивание
Можно ли сделать так чтобы 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 end;
procedure TForm1.Button1Click(Sender: TObject); begin AutoSizeGridColumn(StringGrid1, 1); end; |
- Подробности
- Родительская категория: StringGrid
- Категория: Размеры колонок и строк, выравнивание
Поскольку в компоненте StringGrid по умолчанию все столбцы имеют одинаковую ширину - в некоторых ячейках текст обрезается. Чтобы этого избежать, после заполнения 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;
|
- Подробности
- Родительская категория: StringGrid
- Категория: Размеры колонок и строк, выравнивание
Автор: 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; |
- Подробности
- Родительская категория: StringGrid
- Категория: Размеры колонок и строк, выравнивание
Автор: Пётр Соболь
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; |
- Подробности
- Родительская категория: StringGrid
- Категория: Размеры колонок и строк, выравнивание
Ниже приведён примен кода, который позволяет автоматически подогнать размер колонки в компененте 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 end;
procedure TForm1.Button1Click(Sender: TObject); begin AutoSizeGridColumn(StringGrid1, 1); end; |
- Подробности
- Родительская категория: StringGrid
- Категория: Размеры колонок и строк, выравнивание