Лекции тема 13 Массивы в Delphi


Download 78.26 Kb.
Sana21.09.2020
Hajmi78.26 Kb.
TuriЛекции

текст лекции

тема 13

Массивы в Delphi

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



 



Рис. 5.1. Компонент 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) использование клавиши для перемещения курсора в следующую ячейку таблицы

Options.GoAlwaysShowEditor

Признак нахождения компонента в режиме редактирования. Если значение свойства False, то для того, чтобы в ячейке появился курсор, надо начать набирать текст, нажать клавишу или сделать щелчок мышью

DefaultColWidth

Ширину колонок таблицы

DefaultRowHeight

Высоту строк таблицы

GridLineWidth

Ширину линий, ограничивающих ячейки таблицы

Left

Расстояние от левой границы поля таблицы до левой границы формы

Top

Расстояние от верхней границы поля таблицы до верхней границы формы

Height

Высоту поля таблицы

Width

Ширину поля таблицы

Font

Шрифт, используемый для отображения содержимого ячеек таблицы

ParentFont

Признак наследования характеристик шрифта формы

 

В качестве примера использования компонента StringGrid для ввода массива рассмотрим программу, которая вычисляет среднее арифметическое значение элементов массива. Диалоговое окно программы содержит компоненты: StringGrid — для ввода массива, Label1 и Label2 — для вывода пояснительного текста и результата расчета, Button1 — для запуска процесса расчета.

Добавляется компонент StringGrid в форму точно так же, как и другие компоненты.

После добавления компонента к форме нужно выполнить его настройку в соответствии с табл. 5.2. Значения свойств Height и Width нужно при помощи мыши установить такими, чтобы размер компонента был равен размеру строки.

 

Таблица 5.2. Параметры настройки компонента StringGrid


Свойство

Значение

Name

StringGrid1

ColCount

5

FixedCols

0

RowCount

1

DefaultRowHeight

24

Height

24

DefaultColWidth

64

Width

328

Options.goEditing

True

Options.AlwaysShowEditing

True

Options.goTabs

True

 

Диалоговое окно программы после установки свойств компонента StringGrid1 приведено на рис. 5.2, а текст программы — в листинге 5.2.




Рис. 5.2. Диалоговое окно программы Ввод и обработка массива

 

Листинг 5.2. Ввод и обработка массива целых чисел

 

unit getar_;

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 ButtonlClick(Sender: TObject);

 

private

 

{ Private declarations }

 

public

 

{ Public declarations }

 

end;

 

var

Form1: TForm1;

 

implementation

{$R *.dfm}

 

procedure TForm1.Button1Click(Sender: TObject);

 

var

a : array[1..5] of integer; // массив

summ: integer;    // сумма элементов

sr:    real;    // среднее    арифметическое

i: integer;    // индекс

 

begin

 

// ввод массива



// считаем, что если ячейка пустая, то соответствующий

// ей элемент массива равен нулю

 

for i:= 1 to do

if Length(StringGrid1.Cells[i-1,0]) <> 0

then a[i] := StrToint(StringGrid1.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.

 

После пробных запусков программы возникает желание внести изменения в процесс ввода массива. Например, было бы неплохо, чтобы курсор автоматически переходил в следующую ячейку таблицы, например, в результате нажатия клавиши. Сделать это можно при помощи процедуры обработки события OnKeyPress. На эту же процедуру можно возложить задачу фильтрации вводимых в ячейку таблицы данных. В нашем случае надо разрешить ввод в ячейку только цифр.



Текст процедуры обработки события OnKeyPress приведен в листинге 5.3. Следует обратить внимание на свойство Col, которое во время работы программы содержит номер колонки таблицы, в которой находится курсор. Это свойство можно также использовать для перемещения курсора в нужную ячейку таблицы. Однако нужно учитывать, что колонки таблицы, впрочем, как и строки, нумеруются с нуля.

 

Листинг 5.3. Процедура обработки события OnKeyPress

 

procedure TForm1.StringGridlKeyPress(Sender: TObject; var Key: Char);

begin

case Key of

#8,'0'..'9' : ; // цифры и клавиша 

#13:    // клавиша    

if StringGrid1.Col < StringGrid1.ColCount — 1

then StringGrid1.Col := StringGrid1.Col + 1;

else key := Chr(0); // остальные символы запрещены

end;

end;

 

Если нужно ввести массив дробных чисел (a: array[1..5] of real), то процедура обработки события OnKeyPress несколько усложниться, т. к. помимо цифр допустимым символом является символ-разделитель (запятая или точка, какой — зависит от настройки Windows) и минус. С целью обеспечения некоторой дружественности программы к пользователю можно применить трюк: подменить вводимый пользователем неверный разделитель верным. Определить, какой символ-разделитель допустим в текущей настройке Windows, можно обратившись к глобальной переменной DecimalSeparator.



В листинге 5.4 приведен текст модуля приложения ввода и обработки массива дробных чисел. Процедура обработки события OnKeyPress обеспечивает ввод в ячейку таблицы только допустимых при записи дробного числа символов.

 

Листинг 5.4. Ввод и обработка массива дробных чисел

 

unit getar_l;

 

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 Button1Click(Sender: TObject);

procedure StringGridlKeyPress(Sender: TObject; var Key: Char);

private

{ Private declarations }

public

{ Public declarations }

end;

 

var

Form1: TForm1;

 

implementation

{$R *.dfm}

 

procedure TForm1.Button1Click(Sender: TObject);



var

a : array[1..5] of real; // массив

summ: real; // сумма элементов

sr:    real;    // среднее арифметическое

i: integer;    // индекс

begin

// ввод массива

// считаем, что если ячейка пустая, то соответствующий

// ей элемент массива равен нулю

for i:= 1 to 5 do

if Length(StringGrid1.Cells[i-1,0]) <> 0

then a[i] := StrToFloat(StringGrid1.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.StringGrid1KeyPress(Sender: TObject; var Key: Char);

begin

case Key of

#8,'0'..'9' : ; // цифры и клавиша 

#13:    // клавиша 

 

if StringGrid1.Col < StringGrid1.ColCount — 1



then StringGrid1.Col := StringGrid1.Col + 1;

 

' . ', ' , '; // разделитель целой и дробной частей числа



begin

if Key <> DecimalSeparator then

Key := DecimalSeparator; // заменим разделитель



// на допустимый

 

if Pos(StringGrid1.Cells[StringGrid1.Col,0], DecimalSeparator) <> 0



then Key := Chr(0); // запрет ввода второго

// разделителя

end;

 

' - ' : // минус можно ввести только первым символом,



// т, е. когда ячейка пустая

if Length(StringGrid1.Cells[StringGrid1.Col,0]) <> 0

then Key := Chr(0) ;

else // остальные символы запрещены

key := Chr(0) ;



end;

end;

 

end.



Литература

    1. http://uzinfobiz.ru

    2. http://cppstudio.com

    3. https://works.doklad.ru/view/pD_M-WmKmN8.html

    4. Шлеер С, Меллор С. Объектно-ориентированный анализ: моделирование мира в состояниях: Пер. с англ. — Киев : Диалектика, 1993. — 240 с: ил.

    5. http://labs-org.ru/obektno-orientirovannoe-vizualnoe-programmirovanie/

    6. https://www.bsuir.by/m/12_100229_1_63301.pdf

    7. http://www.delphi-manual.ru/standart.php

Download 78.26 Kb.

Do'stlaringiz bilan baham:




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2020
ma'muriyatiga murojaat qiling