Использование компонента StringGrid
Компонент StringGrid это таблица, содержащая данные, такие как строки типа TString, а также изображения. Таблица может быть только для чтения или редактируемой. Таблица имеет возможность прокрутки, однако некоторое число первых столбцов и строк можно сделать фиксированным - без прокрутки. Этим способом задаются заголовки столбцов и строк, которые должны постоянно отображаться в окне компонента.
Компонент StringGrid удобно использовать для ввода массива. Значок компонента StringGrid находится на вкладке Additional.
StringGrid - компонент для отображения различных данных в табличной форме. Как следует из названия, ячейки компонента StringGrid Delphi могут содержать данные, имеющие тип String, а также отображать графику.
Основные свойства компонента, определяющие отображаемый текст:
Таблица StringGrid состоит из выделенных серым FixedCols и FixedRows - зафиксированных ячеек-заголовков, и обычных, белых ячеек. Содержимое Fixed ячеек недоступно редактированию, и меняется только программно. За возможность редактирования обычных ячеек отвечает одно из значений свойства Options.
Компонент StringGrid имеет возможность адресации каждой отдельной ячейки по номеру столбца и строки. Содержимое ячейки (i, j), где где i - номер столбца, j - номер строки, имеет вид
StringGrid1.Cells[i,j]
Содержимое ячейки доступно как для чтения, так и для записи. Номера столбцов ( i ) и строк ( j ) отсчитываются от 0.
За многие свойства компонента Delphi StringGrid отвечает свойство Options. В Инспекторе Объектов Options - это раскрывающийся список, представляющий собой элементы данного множества. Если значение элемента равно True, то он присутствует в множестве, если False - то нет.
Свойство | Значение |
goFixedVertLine | Наличие вертикальных разделительных линий между "фиксированными" ячейками |
goFixedHorzLine | Наличие горизонтальных разделительных линий между "фиксированными" ячейками |
goVertLine | Наличие вертикальных разделительных линий между "обычными" ячейками |
goHorzLine | Наличие горизонтальных разделительных линий между "обычными" ячейками |
goRangeSelect | Возможность выделить диапазон ячеек |
goDrawFocusSelected | Закрашивание ячейки с фокусом ввода |
goRowSizing | Возможность менять высоту строк мышкой |
goColSizing | Возможность менять ширину столбцов мышкой |
goRowMoving | Возможность менять номер строки, то есть перемещать её, мышкой |
goColMoving | Возможность менять номер столбца, то есть перемещать его, мышкой |
goEditing | Возможность редактировать содержимое ячейки с клавиатуры |
goTabs | При значении True фокус смещается на следующую ячейку в таблице, False - на следующий компонент |
goRowSelect | Выделяется вся строка с "фокусированной" ячейкой |
goAlwaysShowEditor | При значении True содержимое ячейки при получении фокуса сразу доступно редактированию, False - сначала необходимо щёлкнуть по ней мышкой, либо нажать Enter или F2 (прим.: не действует при goRowSelect=True) |
goThumbTracking | При значении True перемещение "бегунка" прокрутки мышкой вызывает немедленное перемещение ячеек, False - ячейки перемещаются только при отпускании "бегунка" |
Как следует из таблицы, за возможность редактировать содержимое ячеек с клавиатуры отвечает элемент goEditing свойства-множества Options. В Инспекторе Объектов установите его значение в True. Чтобы управлять этой возможностью программно, нужно включить или исключить из множества данный элемент:
StringGrid1.Options:=StringGrid1.Options+[goEditing]; //Включаем редактирование, другие элементы не трогаем
StringGrid1.Options:=StringGrid1.Options-[goEditing]; //Выключаем редактирование, другие элементы не трогаем
StringGrid1.Options:=[goEditing, goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRowSelect]; //Задаём список необходимых элементов
Если элементы заданы списком, это аналогично присвоению в Инспекторе Объектов этим элементам значения True, остальным - False.
Ячеек в таблице, как правило, много, и в рамках компонента видна только часть из них. В программе доступна информация как об общем количестве строк и столбцов, так и номерах и количестве строк и столбцов, видимых в рамках таблицы.
Количество строк в Delphi StringGrid равно StringGrid1.RowCount.
Количество столбцов в Delphi StringGrid равно StringGrid1.ColCount.
Если ячейки не помещаются в таблице, появляются полосы прокрутки. При прокручивании
StringGrid1.LeftCol | Номер столбца, видимого самым левым |
StringGrid1.TopRow | Номер строки, видимой самой верхней |
StringGrid1.VisibleColCount | Количество столбцов, видимых в рамках таблицы |
StringGrid1.VisibleRowCount | Количество строк, видимых в рамках таблицы |
У таблицы StringGrid также есть свойство и для управления размером ячеек.Для всех ячеек
DefaultRowHeight - высота строк по умолчанию |
DefaultColWidth - ширина столбцов по умолчанию |
Эти значения ширины и высоты принимают все новые ячейки. При необходимости индивидуально установить ширину и высоту столбцов и строк соответственно, пользуемся свойствами
RowHeights - массив, содержащий высоты строк. То есть, например, RowHeights[5] - высота строки с индексом 5 |
ColWidths - массив, содержащий ширины столбцов. То есть, например, ColWidths[5] - ширина строки с номером 5 |
Все эти свойства настраиваем в обработчике события OnCreate Формы, так же как и надписи заголовков, располагающиеся в строках и столбцах "фиксированной" зоны таблицы. В результате таблица появляется уже в "настроенном" виде!
Поскольку ячейки компонента StringGrid можно редактировать, точно так же как и строку ввода Edit, то возникает вопрос, можно ли программно установить курсор в заданную позицию в содержимом ячейки? Оказывается, есть такая возможность. Для этого требуются дополнительный тип данных на основе таблицы и вспомогательная процедура:
type TGridCracker = class(TStringGrid);
procedure SetCaretPosition(Grid: TStringGrid; col, row, x_pos: Integer);
begin
Grid.Col := Col;
Grid.Row := Row;
with TGridCracker(Grid) do
InplaceEditor.SelStart := x_pos;
end;
Теперь можно установить желаемую позицию курсора в ячейке, например, по нажатию кнопки:
procedure TForm1.Button1Click(Sender: TObject);
begin
StringGrid1.SetFocus;
with StringGrid1 do
SetCaretPosition(StringGrid1, Col, Row, 2);
end;
Чтобы код сработал, нужно установить в Инспекторе Объектов значение параметра goAlwaysShoweEditor свойства Options в True. Можно это сделать также и программно, в той же процедуре нажатия кнопки:
StringGrid.Options:=StringGrid.Options+[goAlwaysShoweEditor];
Отдельно требуется осветить вопрос очистки содержимого таблицы StringGrid. Так как таблица StringGrid, в отличие от, например, компонента Memo, не имеет метода для очистки содержимого сразу всех ячеек, то для удаления внесённых в таблицу ранее данных приходится очищать каждую ячейку отдельно. Делается это двумя вложенными циклами for, пробегающими по столбцам и строкам:
var i, j: Integer;
begin
with StringGRid1 do
for i:=1 to RowCount-1 do //Заголовки строк не трогаем
for j:=1 to ColCount-1 do //Заголовки столбцов не трогаем
Cells[j, i]:='';
end;
Хотя, оказывается, есть метод для очищения содержимого целого столбца или строки:
StringGrid1.Cols[i].Clear; //Очищается столбец с номером i
StringGrid1.Rows[i].Clear; //Очищается строка с номером i
Очевидно, очищение этими методами гораздо быстрее. Однако будут очищены и ячейки фиксированной зоны, содержащие, например, названия строк и столбцов, которые удалять не нужно. Их после очистки нужно просто "написать" заново, на глаз эта манипуляция совершенно незаметна. Для очистки всей таблицы достаточно последовательно очистить только строки или только столбцы:
var i, j: Integer;
begin
with StringGRid1 do
for i:=1 to RowCount-1 do //Заголовки столбцов не трогаем - цикл от 1
begin
Rows[i].Clear;
Cells[0, i]:="Заголовок строки i";
end;
end;
Казалось бы, можно поступить и по-другому, просто обнулить количество строк или столбцов! Однако так делать неправильно, так как при их последующем добавлении может оказаться, что каждая ячейка содержит прежние данные. А в Delphi4 даже при уменьшении количества строк или столбцов содержавшиеся в них данные вообще не пропадали, а так и повисали в воздухе! Так что так можно поступать только если в добавляемых ячейках сразу будет новое непустое содержимое.
Пример использования компонента StringGrid:
Разместить на форме кнопки вывода и очистки таблицы умножения, а также компонент StringGrid для вывода с помощью него самой таблицы умножения. Пример формы показан на следующем рисунке:
Зададим следующие свойства компоненту StringGrid
(Object Inspector à Properties):
№ | Свойство | Значение |
ColCount | ||
DefaultColWidth | ||
DefaultRowHeight | ||
RowCount |
В обработчике нажатия кнопки вывода таблицы умножения добавим следующий код:
procedure TForm1.Button2Click(Sender: TObject);
Var
i,j : integer;
Begin
for i:=0 to 9 do// проходим по каждому столбцу
for j:=0 to 9 do// проходим по каждой строке
Begin
if (i=0) then// если это столбец – заголовок для строк...
StringGrid1.Cells[i,j] := IntToStr(j) // ... то присваиваем ему номер строки
else if (j=0) then// иначе если это строка заголовков столбцов
StringGrid1.Cells[i,j] := IntToStr(i);// ... то присваиваем ячейке номер столбца
if (i>0) and (j>0) then// если это не столбец/строка заголовков...
StringGrid1.Cells[i,j] := IntToStr(i*j); // то производим умножение и присваиваем
end; // ячейке
End;
В обработчике нажатия кнопки очистки таблицы умножения добавим следующий код:
procedure TForm1.Button3Click(Sender: TObject);
var i:integer;
Begin
for i:=0 to StringGrid1.RowCount do// проходим по каждой строке
StringGrid1.Rows[i].Clear; // и очищаем содержимое ее ячеек
end;