Использование компонента StringGrid
Для ввода массива удобно использовать компонент StringGrid. Значок компонента StringGrid находится на вкладке Additional (рис. 5.2).
Рис. 5.2.
Компонент 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. Диалоговое
окно программы Ввод и обработка массива
Текст программы приведен в листинге 5.2.
Таблица 5.2.
Значения свойств компонента StringGrid1
Свойство |
Значение |
||
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. Ввод
и обработка массива целых чисел
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
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.
Ввод и обработка массива дробных чисел
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;
end.