Рис. 5.2.
Компонент StringGrid
Компонент
StringGrid
представляет собой таблицу, ячейки которой содержат строки символов. В
табл.
5.1 перечислены некоторые свойства компонента StringGrid.
Свойство | Определяет |
Name | Имя компонента. Используется в программе для доступа к свойствам компонента |
ColCount | Количество колонок таблицы |
RowCount | Количество строк таблицы |
Cells | Соответствующий таблице двумерный массив. Ячейка таблицы, находящаяся на пересечении столбца номер col и строки номер row определяется элементом cells [col, row] |
FixedCols | Количество зафиксированных слева колонок таблицы. Зафиксированные колонки выделяются цветом и при горизонтальной прокрутке таблицы остаются на месте |
FixedRows | Количество зафиксированных сверху строк таблицы. Зафиксированные строки выделяются цветом и при вертикальной прокрутке таблицы остаются на месте |
Options.goEditing | Признак допустимости редактирования содержимого ячеек таблицы. True — редактирование разрешено, False — запрещено |
Options.goTab | Разрешает (True) или запрещает (False) использование клавиши <Таb> для перемещения курсора в следующую ячейку таблицы |
Options.GoAlways-ShowEditor | Признак нахождения компонента в режиме редактирования. Если значение свойства False, то для того, чтобы в ячейке появился курсор, надо начать набирать текст, нажать клавишу <F2> или сделать щелчок мышью |
DefaultColWidth | Ширину колонок таблицы |
DefaultRowHeight | Высоту строк таблицы |
GridLineWi-dth | Ширину линий, ограничивающих ячейки таблицы |
Left | Расстояние от левой границы поля таблицы до левой границы формы |
Top | Расстояние от верхней границы поля таблицы до верхней границы формы |
Height | Высоту поля таблицы |
Width | Ширину поля таблицы |
Font | Шрифт, используемый для отображения содержимого ячеек таблицы |
ParentFont | Признак наследования характеристик шрифта формы |

Рис.
5.3. Диалоговое
окно программы Ввод и обработка массива
Добавляется
компонент
stringGrid в форму точно так же, как и другие компоненты. После
добавления компонента
к форме нужно выполнить его настройку в соответствии с табл. 5.2.
Значения свойств
Height и width следует при помощи мыши установить такими, чтобы размер
компонента
был равен размеру строки.
Текст
программы приведен
в листинге 5.2.
Свойство | Значение |
ColCount | 5 |
FixedCols | 0 |
RowCount | 1 |
DefaultRowHeight | 24 |
Height | 24 |
DefaultColWidth | 64 |
Width | 328 |
Options.goEditing | True |
Options.AlwaysShowEditing | True |
Options.goTabs | True |
Листинг 5.2. Ввод
и обработка массива целых чисел
unit
getar_;
interface
uses
Windows, Messages, SysUtils, Variants,
Classes,
Graphics, Controls, Forms, Dialogs, Grids, StdCtrls;
type
TForm1
= class(TForm)
Label1:
TLabel;
StringGridl:
TStringGrid;
Button1:
TButton;
Label2:
TLabel;
procedure
ButtonlClick(Sender: TObject); private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1:
TForml ;
implementation
{$R
*.dfm}
procedure
TForml.ButtonlClick(Sender: TObject); var
a : array[1..5] of integer; // массив
summ:
integer; // сумма элементов
sr:
real; // среднее арифметическое
i:
integer; // индекс
begin
//
ввод массива
// считаем, что если ячейка пустая, то соответствующий
// ей элемент массива равен нулю
for
i:= 1 to 5 do
if
Length(StringGridl.Cells[i-1, 0]) <>0
then a[i] := StrToInt(StringGridl.Cells[i-1,0])
else
a[i] := 0;
//
обработка массива
summ
:= 0;
for
i :=1 to 5 do
summ
:= summ + a[i]; sr := summ / 5;
У
вывод результата Label2.Caption :=
'Сумма элементов: ' + IntToStr(summ)
+ #13+ 'Среднее арифметическое: ' + FloatToStr(sr);
end;
end.
После
пробных запусков
программы возникает желание внести изменения в процесс ввода массива.
Так, было
бы неплохо, чтобы курсор автоматически переходил в следующую ячейку
таблицы,
например, в результате нажатия клавиши <Enter>. Сделать это
можно при
помощи процедуры обработки события onKeyPress. На эту же процедуру
можно возложить
задачу фильтрации вводимых в ячейку таблицы данных. В нашем случае
надо разрешить
ввод в ячейку только цифр.
Текст
процедуры обработки
события OnKeyPress приведен в листинге 5.3. Следует обратить внимание
на свойство
Col, которое во время работы программы содержит номер колонки таблицы,
в которой
находится курсор. Это свойство можно также использовать для
перемещения курсора
в нужную ячейку таблицы. Однако нужно учитывать, что колонки таблицы,
впрочем,
как и строки, нумеруются с нуля.
Листинг 5.3.
Процедура обработки события OnKeyPress
procedure TForm1.StringGridlKeyPress(Sender: TObject;
var Key: Char);
begin
case
Key of
#8,'0'..'9' : ; // цифры и клавиша <Backspace>
#13:
// клавиша <Enter>
if
StringGridl.Col < StringGridl.ColCount — 1
then StringGridl.Col := StringGridl.Col + 1;
else key := Chr(0); // остальные символы запрещены
end;
end;
Если
нужно ввести массив
дробных чисел (a: array [1. .5] of real), то процедура обработки
события OnKeyPress
несколько усложнится, т. к. помимо цифр допустимыми символами являются
символ-разделитель
(запятая или точка — зависит от настройки Windows) и минус. С целью
обеспечения
некоторой дружественности программы по отношению к пользователю можно
применить
трюк: подменить вводимый пользователем неверный разделитель верным.
Определить,
какой символ-разделитель допустим в текущей настройке Windows, можно,
обратившись
к глобальной переменной Decimaiseparator.
В
листинге 5.4 приведен
текст модуля приложения ввода и обработки массива дробных чисел.
Процедура обработки
события OnKeyPress обеспечивает ввод в ячейку таблицы только
допустимых при
записи дробного числа символов.
Листинг 5.4.
Ввод и обработка массива дробных чисел
unit.
getar_1; interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics,
Controls, Forms, Dialogs, Grids, StdCtrls;
type
TForm1=
class(TForm)
Label1:
TLabel;
StringGrid1:
TStringGrid;
Button1:
TButton;
Label2:
TLabel;
procedure
Button1ClicktSender: TObject);
procedure StringGridlKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1:
TForm1;
implementation
{$R
*.dfm}
procedure TForm1.ButtonlClick(Sender: TObject);
var
a : array[1..5] of real; // массив
suram:
real; // сумма элементов
sr: real; // среднее арифметическое
i:
integer; // индекс
begin
//
ввод массива
// считаем, что если ячейка пустая, то соответствующий
// ей элемент массива равен нулю
for
i:= 1 to 5 do
if
Length(StringGridl.Cells[i-l,0])<>0
then
a[i] := StrToFloat(StringGridl.Cells[i-1, 0]) else a[i] := 0;
//
обработка массива
summ
:= 0;
for
i :=1 to 5 do
summ
:= summ + a[i]; sr := summ / 5;
//
вывод результата
Label2.Caption
:=
'Сумма элементов: ' + FloatToStr(summ)
+
#13+ 'Среднее арифметическое: ' + FloatToStr(sr); end;
'/ Функция обеспечивает ввод в ячейку только допустимых символов
procedure TForm1.StringGridlKeyPress(Sender: TObject; var Key: Char);
begin
case
Key of
#8,'0'..'9'
: ; // цифры и <Backspace>
#13:
// клавиша <Enter>
if
StringGridl.Col < StringGridl.ColCount - 1
then StringGridl.Col := StringGridl.Col + 1; '.',',':
// разделитель целой и дробной частей числа
begin
if
Key <> DecimalSeparator then
Key
:= DecimalSeparator; // заменим разделитель
// на допустимый
if
Pos(StringGridl.Cells[StringGridl.Col,0],
DecimalSeparator) <> 0
then
Key := Chr(O); // запрет ввода второго
// разделителя end;
' -' : // минус можно ввести только первым символом,
//
т. е. когда ячейка пустая
if Length(StringGrid1.Cells[StringGrid1.Col, 0]) <>0 then
Key := Chr(0) ;
else
// остальные символы запрещены
key := Chr(0);
end;
end;