Використання компонента StringGrid

Для введення масиву зручно використовувати компонент StringGrid. Значок компонента StringGrid знаходиться на вкладці Additional (рис. 5.2).


Рис. 5.2. Компонент StringGrid

Компонент StringGrid являє собою таблицю, осередки якої містять рядки символів. У табл. 5.1 перераховані деякі властивості компонента 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 Ознака спадкоємства характеристик шрифту форми

Як приклад використання компонента stringGrid для введення масиву розглянемо програму, яка обчислює середнє арифметичне значення елементів масиву. діалогове вікно програми наведено на рис. 5.3. Компонент stringGrid використовується для введення масиву, компоненти Label1 і Label2 – для виведення пояснювального тексту і результату розрахунку, Buttoni – для запуску процесу розрахунку.

Рис. 5.3. Діалогове вікно програми Введення і обробка масиву

Додається компонент stringGrid в форму точно так же, як і інші компоненти. Після додавання компонента до форми потрібно виконати його настройку відповідно до табл. 5.2. значення властивостей Height і width слід за допомогою миші встановити такими, щоб розмір компонента дорівнював розміру рядка.

Текст програми приведений в лістингу 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. введення і обробка масиву цілих чисел

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;

end.