
Таблица
строк — компонент StringGrid
Таблица строк — компонент StringGrid
Страница Additional
Компонент StringGrid представляет собой таблицу, содержащую строки.
Таблица делится на две части - фиксированную и рабочую. Фиксированная служит для показа заголовков столбцов/рядов и для ручного управления их размерами. Обычно фиксированная часть занимает крайний левый столбец и самый верхний ряд таблицы, однако с помощью свойств FixedCols и FixedRows можно задать другое количество фиксированных столбцов и рядов (если эти свойства имеют 0, таблица не содержит фиксированной зоны). Рабочая часть - это остальная часть таблицы. Она может содержать произвольное количество столбцов и рядов, более того, эти величины могут изменяться программно. Рабочая часть может не умещаться целиком в пределах окна компонента, в этом случае в него автоматически помещаются нужные полосы прокрутки. При прокрутке рабочей области фиксированная область не исчезает, но меняется ее содержимое - заголовки строк и рядов.
Данные таблицы могут быть только для чтения или редактируемыми. Каждой ячейке таблицы может быть поставлен в соответствие некоторый объект.
Компонент StringGrid предназначен в первую очередь для отображения таблиц текстовой информации. Однако этот компонент может отображать и графическую информацию.
Основные свойства компонента, определяющие отображаемый текст
Cells[ACol, ARow: Integer]: string – Строка, содержащаяся в ячейке с индексами столбца и строки ACol и ARow.
ColCount : Longint – число столбцов
RowCount : Longint – число строк,
В таблицу TStringGrid невозможно занести что-то во время проектирования. Поэтому тексты или изображения в ячейки заносятся в обработчиках каких-то событий. В качестве простого примера ниже приведен код, заносящий во все ячейки таблицы тексты, содержащие номера ячеек:
var i, j: integer;
...
for i:=0 to StringGrid1.ColCount - 1 do
for j:=0 to StringGrid1.RowCount - 1 do
StringGrid1.Cells[j, i] := IntToStr(i) + ':' + IntToStr(j);
Подобный код (конечно, с более осмысленными текстами) можно вставить, например, в обработчик события OnCreate формы, чтобы обеспечить соответствующий вид таблицы при открытии приложений. А затем можно предоставить пользователю возможность редактирования текстов.
FixedCols : Integer– число фиксированных, непрокручиваемых столбцов
FixedRows : Integer – число фиксированных, непрокручиваемых строк.
Пример считывания и записи матрицы из/в компонент StringGrid. На форме расположены 3 компонента StringGrid: strgrdA, strgrdB, strgrdResult; 2 кнопки btnRead и btnWrite. При нажатии на кнопку btnRead выполняется считывание 2-х массивов из компонент StringGrid .
type
TMatrix = array of array of integer;
TfrmMatrices = class(TForm)
strgrdB: TStringGrid;
strgrdA: TStringGrid;
strgrdResult: TStringGrid;
btnRead: TButton;
btnWrite: Tbutton;
procedure btnRead(Sender: TObject);
procedure btnWrite(Sender: TObject);
private
{ Private declarations }
procedure ReadMatrix(var fg: TMatrix; StringGrid: TStringGrid);
procedure WriteMatrix(var fg: TMatrix; StringGrid: TStringGrid);
public
{ Public declarations }
end;
var
frmMatrices: TfrmMatrices;
A, B: TMatrix;
implementation
{$R *.dfm}
procedure TfrmMatrices.ReadMatrix(var fg: TMatrix; StringGrid: TStringGrid);
var
i, j: integer;
begin
SetLength(fg, StringGrid.RowCount, StringGrid.ColCount);
with StringGrid do
begin
for i:= 0 to RowCount-1 do
for j:= 0 to ColCount-1 do
begin
fg[i, j] := StrToInt(Cells[j, i]);
end;
end;
end;
procedure TfrmMatrices.WriteMatrix(var fg: TMatrix; StringGrid: TStringGrid);
var
i, j: integer;
begin
StringGrid.ColCount := Length(fg[0]);
StringGrid.RowCount := Length(fg);
for i:= 0 to Length(fg)-1 do
for j:= 0 to Length(fg[i])-1 do
StringGrid.Cells[j, i] := IntToStr(fg[i, j]);
end;
procedure TfrmMatrices.btnRead(Sender: TObject);
begin
try
ReadMatrix(A, strgrdA);
ReadMatrix(B, strgrdB);
except
on EConvertError do
begin
MessageDlg('Ошибка конвертирования. В поля можно вводить только числа.' +
#13#10 + 'Все ячейки должны быть заполнены', mtError, [mbOK], 0);
exit;
end;
end;
Задание 1. Напишите обработчик нажатия кнопки btnWrite в котором выведите элементы массива А в StringGrid.
Col : Longint – Индекс столбца, содержащего выделенную ячейку
Row : Longint – Индекс строки выделенной ячейки
Cols[Index: Integer]: TStrings – Список строк, содержащихся в столбце с индексом Index.
Rows[Index: Integer]: TStrings Список строк, содержащихся в строке с индексом Index.
Objects [ACol, ARow: Integer]:TObject – Объект, связанный со строкой, содержащейся в ячейке с индексами столбца и строки ACol и ARow
Все эти свойства доступны во время выполнения. Задавать тексты можно программно или по отдельным ячейкам, или сразу по столбцам и строкам с помощью методов класса TStrings.
FixedColor : TColor, где TColor = -$7FFFFFFF-1..$7FFFFFFF; – Цвет фона фиксированных ячеек
ColWidths [Index: Longint]: Integer – Указывает ширину в пикселях указанного столбца таблицы
RowHeights [Index: Longint]: Integer; – Высота строки с указанным индексом
DefaultColWidth : Integer; – Ширина в пикселях всех столбцов таблицы, размеры которых явно не изменялись
DefaultRowHeight : Integer; – Высота в пикселях всех строк таблицы, размеры которых явно не изменялись
LeftCol : Longint – определяет индекс первого видимого на экране в данный момент прокручиваемого столбца.
TopRow : Longint – определяет индекс первой видимой прокручиваемой строки.
ScrollBars : TScrollStyle, где TScrollStyle = (ssNone, ssHorizontal, ssVertical, ssBoth); – определяет наличие в таблице полос прокрутки. Причем полосы прокрутки появляются и исчезают автоматически в зависимости от того, помещается таблица в соответствующий размер, или нет.
Свойство Options является множеством, определяющим многие свойства таблицы:
goEditing – возможность редактировать содержимое таблицы (по умолчанию False).
goTabs – пользователь может перемещаться по ячейкам, используя Tab и Shift+Tab(по умолчанию False).
goAlwaysShowEditor – при переходе в ячейку, ее содержимое выделяется для редактирования (по умолчанию False). Если goEditing установлено в False, то значение goAlwaysShowEditor игнорируется.
goFixedVertLine и goFixedHorzLine – наличие разделительных вертикальных и горизонтальных линий в фиксированных ячейках (по умолчанию True).
goVertLine и goHorzLine – наличие разделительных вертикальных и горизонтальных линий в нефиксированных ячейках (по умолчанию True).
goColSizing и goRowSizing – возможность для пользователя изменять с помощью мыши размеры столбцов и строк (по умолчанию False),
goColMoving и goRowMoving возможность для пользователя перемещать столбцы и строки
(по умолчанию False)
и многое другое
В основном компонент StringGrid используется для выбора пользователем каких-то значений, отображенных в ячейках. Возможно также выделение пользователем множества ячеек, строк и столбцов.
Чтобы разрешить редактирование в таблице TStringGrid, надо включить в ее свойстве Options опцию goEditing. Во время проектирования это можно сделать с помощью Инспектора Объектов. Во время выполнения это делается оператором:
StringGrid1.Options := StringGrid1.Options + [goEditing];
Если вы разрешаете пользователю редактировать данные, то имеет смысл разрешить пользователю и изменять ширину столбцов (опция goColSizing свойства Options), а возможно, и разрешить ему переставлять столбцы (опция goColMoving). Если разрешение этих операций надо делать программно, приведенный выше оператор изменится следующим образом:
StringGrid1.Options := StringGrid1.Options +
[goEditing, goColSizing, goColMoving];
Selection :TGridRect – Указывает область текущего выделения ячеек.
TGridRect = record
case Integer of
0: (Left, Top, Right, Bottom: Longint);
1: (TopLeft, BottomRight: TGridCoord);
end;
Пример
При потере фокуса таблицей TStringGrid ячейки, которые до этого были выделены, остаются закрашенными, что в ряде случаев создает неприятный эффект и отвлекает внимание пользователя. Устранить это проще всего, удалив выделение при потере таблицей фокуса, т.е. в обработчике события OnExit:
procedure TForm1.StringGrid1Exit(Sender: TObject);
begin
StringGrid1.Selection := TGridRect(Rect(-1, -1, -1, -1));
end;
(функция Rect создает структуру TRect с указанными координатами, затем выполняется приведение типа TRect к типу TGridRect)
В этом коде выделение указывается ячейками с отрицательными индексами. Поскольку таких индексов не бывает, выделение просто снимается.
В некоторых случаях недостатком такого подхода может являться то, что при повторном получении таблицей фокуса в ней не запоминается предшествующее выделение. Это нетрудно исправить, если ввести глобальную переменную, в которой будет запоминаться предшествующее выделение, и из которой оно будет восстанавливаться при получении таблицей фокуса, т.е. в обработчике события OnEnter:
var SelRect: TGridRect;
...
procedure TForm1.StringGrid1Exit(Sender: TObject);
begin
SelRect := StringGrid1.Selection;
StringGrid1.Selection := TGridRect(Rect(-1, -1, -1, -1));
end;
procedure TForm1.StringGrid1Enter(Sender: TObject);
begin
StringGrid1.Selection := SelRect;
end;