Автоматическая ширина колонок в TStringGrid
Материал из DRKB
Автоматическая ширина колонок в TStringGrid[править | править код]
Можно ли сделать так чтобы TStringGrid автоматически изменял ширину колонок, чтобы вместить самую длинную строчку в колонке?
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[column, i]);
if temp > max then max := temp;
end;
Grid.ColWidths[column] := Max + Grid.GridLineWidth + 3;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
AutoSizeGridColumn(StringGrid1, 1);
end;
ID: 00609
procedure SetGridColumnWidths(Grid: TStringGrid;
const Columns: array of Integer);
{
When you double-Click on a Column-Header the Column
autosizes to fit its content
Bei Doppelklick auf eine fixierte Spalte passt sich
die Spaltenbreite der Textgrosse an
}
procedure AutoSizeGridColumn(Grid: TStringGrid; column, min, max: Integer);
{ Set for max and min some minimal/maximial Values}
{ Bei max and min kann eine Minimal- resp. Maximalbreite angegeben werden}
var
i: Integer;
temp: Integer;
tempmax: Integer;
begin
tempmax := 0;
for i := 0 to (Grid.RowCount - 1) do
begin
temp := Grid.Canvas.TextWidth(Grid.cells[column, i]);
if temp > tempmax then tempmax := temp;
if tempmax > max then
begin
tempmax := max;
break;
end;
end;
if tempmax < min then tempmax := min;
Grid.ColWidths[column] := tempmax + Grid.GridLineWidth + 3;
end;
procedure TForm1.StringGrid1DblClick(Sender: TObject);
var
P: TPoint;
iColumn, iRow: Longint;
begin
GetCursorPos(P);
with StringGrid1 do
begin
P := ScreenToClient(P);
MouseToCell(P.X, P.Y, iColumn, iRow);
if P.Y < DefaultRowHeight then
AutoSizeGridColumn(StringGrid1, iColumn, 40, 100);
end;
end;
Source: Взято с сайта: http://www.swissdelphicenter.ch
ID: 01066
procedure TForm1.Button1Click(Sender: TObject);
{ by P. Below }
const
DEFBORDER = 8;
var
max, temp, i, n: Integer;
begin
with Grid do
begin
Canvas.Font := Font;
for n := Low(Columns) to High(Columns) do
begin
max := 0;
for i := 0 to RowCount - 1 do
begin
temp := Canvas.TextWidth(Cells[Columns[n], i]) + DEFBORDER;
if temp > max then
max := temp;
end;
if max > 0 then
ColWidths[Columns[n]] := max;
end;
end;
end;
Source: http://delphiworld.narod.ru/
ID: 01067
{ This will resize the columns of a TStringGrid / TDrawGrid (text
only!) so the text is completely visble. To save some time,
it uses the first 10 rows only, but that should be easy to fix,
if you need more. }
// we need this to access protected methods
type
TGridHack = class(TCustomGrid);
procedure ResizeStringGrid(_Grid: TCustomGrid);
var
Col, Row: integer;
Grid: TGridHack;
MaxWidth: integer;
ColWidth: integer;
ColText: string;
MaxRow: integer;
ColWidths: array of integer;
begin
Grid := TGridHack(_Grid);
SetLength(ColWidths, Grid.ColCount);
MaxRow := 10;
if MaxRow > Grid.RowCount then
MaxRow := Grid.RowCount;
for Col := 0 to Grid.ColCount - 1 do
begin
MaxWidth := 0;
for Row := 0 to MaxRow - 1 do
begin
ColText := Grid.GetEditText(Col, Row);
ColWidth := Grid.Canvas.TextWidth(ColText);
if ColWidth > MaxWidth then
MaxWidth := ColWidth;
end;
if goVertLine in Grid.Options then
Inc(MaxWidth, Grid.GridLineWidth);
ColWidths[Col] := MaxWidth + 4;
Grid.ColWidths[Col] := ColWidths[Col];
end;
end;
Source: Взято с сайта: http://www.swissdelphicenter.ch
ID: 01068
var
i, j, temp, max: integer;
begin
for i := 0 to grid.colcount - 1 do
begin
max := 0;
for j := 0 to grid.rowcount - 1 do
begin
temp := grid.canvas.textWidth(grid.cells[i, j]);
if temp > max then
max := temp;
end;
grid.colWidths[i] := max + grid.gridLineWidth + 1;
end;
end;
Вероятно, вам необходимо будет добавить +1, чтобы текст не прилипал к границам ячеек
Source: http://delphiworld.narod.ru/
ID: 01069
Я использую компонент StringGrid и хотел бы менять ширину его колонок в соответствии с расположенным в них текстом, другими словами я хочу чтобы весь текст в них был виден, но как это сделать?
Попробуйте это:
procedure TForm1.StringGrid1SelectCell(Sender: TObject; vCol,
vRow: Longint; var CanSelect: Boolean);
var
Wid: Integer;
begin
with Sender as TStringGrid do
begin
Wid := Canvas.TextWidth(Cells[Col, Row] + ' ');
if Wid > ColWidths[Col] then
ColWidths[Col] := Wid;
end;
end;
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
var
Wid: Integer;
begin
if Key = #13 then
with Sender as TStringGrid do
begin
Wid := Canvas.TextWidth(Cells[Col, Row] + ' ');
if Wid > ColWidths[Col] then
ColWidths[Col] := Wid;
end;
end;
Имейте в виду, что в обработчике события OnSelectCell я переименовал параметры Col и Row на vCol и vRow, чтобы избежать путаницы со свойствами StringGrid, имеющими те же имена. StringGrid c данными методами всегда расширяет данную колонку, если вновь добавляемая строка имеет ширину большую чем текущая ширина колонки.
Source: http://delphiworld.narod.ru/
ID: 01070