Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник по Delphi.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.27 Mб
Скачать
  • вывод массива;

  • ввод массива;

  • поиск максимального или минимального элемента массива;

  • поиск заданного элемента массива;

  • сортировка массива.

  • Вывод массива

  • Под выводом массива понимается вывод на экран монитора (в диалоговое окно) значений элементов массива.

  • Если в программе необходимо вывести значения всех элементов массива, то для этого удобно использовать инструкцию for, при этом переменная-счетчик инструкции for может быть использована в качестве индекса элемента массива.

  • В качестве примера на рис. 5.1 приведено диалоговое окно приложения, которое демонстрирует инициализацию и процесс вывода значений элементов массива в поле метки. Программа выводит пронумерованный список футбольных команд. Следует обратить внимание, что для того чтобы список команд выглядел действительно как список, свойству Label1.AutoSize нужно присвоить значение False (присвойте свойству Label1.AutoSize значение True и посмотрите, как будет работать программа). Текст программы приведен в листинге 5.1.

  • Рис. 5.1. Форма и диалоговое окно приложения Вывод массива

  • Листинг 5.1. Инициализация и вывод массива

  • unit outar_;

  • interface

  • uses

  • Windows, Messages, SysUtils, Variants,

  • Classes, Graphics, Controls, Forms,

  • Dialogs, StdCtrls;

  • type

  • TForm1 = class(TForm)

  • Button1: TButton;

  • Label1: TLabel;

  • procedure ButtonlClick(Sender: TObject);

  • private

  • { Private declarations } public

  • { Public declarations } end;

  • var

  • Form1: TForm1;

  • implementation

  • ($R *.dfm}

  • const

  • NT = 5;

  • var

  • team: array[1..NT] of string[10] =

  • ('Зенит','Динамо','Ротор','Спартак','СКА'

  • procedure TForml.ButtonlClick(Sender: TObject);

  • var

  • st:string; // список команд

  • i:integer; // индекс, номер элемента массива

  • begin

  • // формирование списка для отображения в форме

  • for i:=l to NT do st := st + IntToStr(i)+ ' '

  • + team[i] + #13; // вывод списка Label1.Caption := st;

  • end;

  • end.

  • Ввод массива

  • Под вводом массива понимается процесс получения от пользователя (или из файла) во время работы программы значений элементов массива.

  • "Лобовое" решение задачи ввода элементов массива — для каждого элемента массива создать поле ввода. Однако если требуется ввести достаточно большой массив, то такое решение неприемлемо. Представьте форму, например, с десятью полями редактирования!

  • Очевидно, что последовательность чисел удобно вводить в строку таблицы, где каждое число находится в отдельной ячейке. Ниже рассматриваются два варианта организации ввода массива с использованием компонентов

  • StringGrid И Memo.

  • Использование компонента 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.

Использование компонента Memo

В некоторых случаях для ввода массива можно использовать компонент Memo. Компонент Memo позволяет вводить текст, состоящий из достаточно большого количества строк, поэтому его удобно использовать для ввода символьного массива. Компонент Memo добавляется в форму обычным образом. Значок компонента находится на вкладке Standard (рис. 5.4).

Рис. 5.4. Компонент Memo

В табл. 5.3 перечислены некоторые свойства компонента Memo.

Таблица 5.3. Свойства компонента Memo

Свойство

Определяет

Name

Имя компонента. Используется в программе для доступа к свойствам компонента

Text

Текст, находящийся в поле Memo. Рассматривается как единое целое

Lines

Текст, находящийся в поле Memo. Рассматривается как совокупность строк. Доступ к строке осуществляется по номеру

Lines .Count

Количество строк текста в поле Memo

Left

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

Top

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

Height

Высоту поля

Width

Ширину поля

Font

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

ParentFont

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

При использовании компонента Memo для ввода массива значение каждого элемента массива следует вводить в отдельной строке и после ввода каждого элемента массива нажимать клавишу <Enter>.

Получить доступ к находящейся в поле Memo строке текста можно при помощи свойства Lines, указав в квадратных скобках номер нужной строки (строки нумеруются с нуля).

Следующая программа, текст которой приведен в листинге 5.5, демонстрирует использование компонента Memo для ввода символьного массива.

Основной цикл процедуры ввода символьного массива из компонента Memo может выглядеть так:

for i:=l to SIZE do

a [ i ]:= Memol.Lines[i];

где:

  • SIZE — именованная константа, определяющая размер массива;

  • а — массив;

  • Memol — имя Memo-компонента;

  • Lines — свойство компонента Memo, представляющее собой массив, каждый элемент которого содержит одну строку находящегося в поле Memo текста.

Форма программы приведена на рис. 5.5. Помимо поля Memo она содержит командную кнопку (Buttonl), при щелчке на которой выполняется ввод значений элементов массива из поля Memo.

Рис. 5.5. Диалоговое окно приложения Ввод массива