Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методичка Фролов

.pdf
Скачиваний:
14
Добавлен:
14.03.2016
Размер:
840.19 Кб
Скачать

begin

Label1.Caption := 'Hello World!';

end;

end.

Модуль начинается с ключевого слова unit, после которого пишется имя модуля.

Текст модуля состоит из двух основных разделов: interface – открытый интерфейс модуля, и implementation – реализация модуля. Все, что помещается непосредственно в раздел interface (типы, переменные, константы, функции, процедуры), может быть использовано другими модулями программы. Все, что помещается в раздел implementation, используется только модулем. Внешние модули не могут видеть типы, переменные, константы, функции и процедуры, размещенные в этом разделе.

Вразделе interface после предложения uses, содержащего список подключаемых библиотечных модулей, размещается объявление класса формы, подготовленное средой программирования. Имя класса формы – TForm1. В класс включены размещенные на форме объекты – метка Label1

икнопка Button1. Кроме того, в класс включено объявление обработчика щелчка на кнопке – процедуры Button1Click.

Вклассе предусмотрено также два раздела: private – закрытый раздел класса, и public – открытый раздел класса. То, что объявляется в разделе public, доступно для других классов и модулей. То, что объявляется в разделе private, доступно только в пределах данного модуля.

После завершения объявления класса формы объявляется созданная форма как объект класса TForm1.

var

Form1: TForm1

51

Затем следует раздел реализации implementation, который начинается с директивы компилятора, в приведенном примере указывающей на подключение файла, используемого для сохранения информации о внешнем виде формы. Далее в разделе implementation можно видеть реализацию объявленной в классе процедуры Button1Click.

В раздел implementation могут быть включены помимо обработчиков событий любые объявления глобальных переменных, констант, типов, и описания функций и процедур. Если необходимо из данного модуля получить доступ к другому модулю (другой форме), то в раздел implementation требуется включить оператор uses, в котором указать файл модуля, к которому осуществляется доступ. Например, чтобы обеспечит доступ ко всем элементам, объявленным в интерфейсе модулей Unit2 и Unit3, используется предложение: uses Unit2, Unit3.

Инспектор Объектов состоит из двух страниц, каждую из которых можно использовать для определения внешнего вида и поведения выбранного объекта, помещенного на форму. Первая страница – это список свойств, вторая – список событий. Страница событий связана с Редактором исходного текста. Если дважды щелкнуть мышкой на правую сторону какогонибудь пункта, соответствующего определенному событию, то в редакторе исходного текста автоматически сгенерируется шаблон кода обработчика данного события.

2.3. Типы данных Delphi

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

В языке программирования Delphi используются как простые, так и

52

структурные типы данных.

К простым типам данных относятся:

целочисленные;

вещественные;

булевы;

символьные;

строковые.

Практически каждый из перечисленных пунктов содержит несколько типов данных. Это вызвано необходимостью более эффективного использования ресурсов компьютера. Например, если для какой-то переменной достаточно диапазона значений от 1 до 100, то нет необходимости выделять память, достаточную для хранения больших значений.

Однако довольно часто для решения задачи недостаточно простых типов данных. Довольно часто возникает необходимость совместить в одной переменной сразу ряд однотипных данных, или предусмотреть хранение данных разных типов, например, строк и чисел. В этом случает удобно использовать структурные типы данных, к которым относятся:

массивы;

множества;

записи.

Начнем подробное рассмотрение типов данных, используемых в языке программирования Delphi с простых.

В современных версиях Delphi для определения целых чисел предусмотрено семь фиксированных и два автоматических типа данных. Фиксированные перечислены в табл. 2.1.

К автоматическим целочисленным типам относятся Integer и Cardinal. Integer, как правило, является синонимом для LongInt, хотя может быть приведен и к типу Int64. Например, если объявить переменную типа Integer и попробовать записать в нее значение, превышающее макси-

53

мально допустимый размер для типа LongInt, то она автоматически преобразуется в Int64. Cardinal – это устаревшее определение для типа

LongWord.

 

 

 

Таблица 2.1

 

Фиксированные типы целочисленных данных

 

 

 

 

 

Тип

Диапазон

 

Объем занимаемой

 

 

 

памяти, байт

 

 

 

 

Byte

0 – 255

 

1

 

 

 

 

ShortInt

–128 – 127

 

1

 

 

 

 

Word

0 – 65535

 

2

 

 

 

 

SmallInt

–32768 – 32767

 

2

 

 

 

 

LongWord

0 – 4294967295

 

4

 

 

 

 

LongInt

–2147483648 – 21474483647

 

4

 

 

 

 

Int64

–9223372036854775808 –

 

8

 

9223372036854775807

 

 

 

 

 

 

Для определения вещественных чисел предусмотрено шесть фиксированных типов и один автоматический. Перечислим фиксированные типы в табл. 2.2.

 

 

 

Таблица 2.2

 

Фиксированные типы вещественных данных

 

 

 

 

 

Тип

Диапазон

 

Объем занимаемой

 

 

 

памяти, байт

 

 

 

 

Real48

±2.9.10^–39 – 1.7.10^38

 

6

Single

±1.5.10^–45 – 3.4.10^38

 

4

Double

±5.0.10^–324 – 1.7.10^308

 

8

Extended

±3.4.10^–4951 – 1.1.10^4932

 

10

Comp

–2^63+1 – 2^63 –1

 

8

 

 

 

 

Currency

–922337203685477.5808 –

 

8

 

922337203685477.5807

 

 

 

 

 

 

54

Автоматический тип Real введен для совместимости с программами, написанными в ранних версиях Delphi. Если задать данный тип в программе, то он будет автоматически приведен к типу Double.

Булевы, или логические типы данных представлены в Delphi типами

Boolean, ByteBool, WordBool и LongBool. Все они отличаются только раз-

мером памяти, выделяемым для хранения значения, причем значений может быть только два – false (ложь) и true (истина). Основным типом является однобайтовый Boolean (он же ByteBool), двухбайтовый WordBool и четырехбайтовый LongBool предусмотрены лишь для совместимости в целях взаимодействия с другими языками и платформами.

В Delphi 7 предусмотрено два типа символьных типов данных – ANSIChar и WideChar. Первый является однобайтовым и может хранить в себе один из 256-ти символов из множества символов ANSI. Второй тип является двухбайтовым и предназначен для хранения двухбайтовых символов Unicode. Delphi имеет синоним для символьных типов – Char, который является аналогом ANSIChar. Обычные символы (буквы и цифры) присваивают переменным символьного типа как есть, заключая их в одиночные кавычки. А специальные символы, например, возврат каретки (Enter) назначают при помощи их номера в таблице ANSI, выделяя знаком решетки: y := #13.

Строковые типы данных отличаются от символьных тем, что могут хранить не единичный символ, а множество символов. В Delphi имеется три типа строк:

ShortString;

AnsiString;

WideString.

ShortString достался в наследство от языка Pascal и 16-битной Delphi 1.0. Такие строки могут иметь не более 255-ти символов, и занимают от 2 до 256 байт памяти, в зависимости от размера.

55

AnsiString и WideString могут иметь практически неограниченную длину (AnsiString – до 2 млрд. символов, WideString – до 1 млрд.) и занимать, соответственно, от 4 байт до 2 Гигабайт памяти. При этом по аналогии с символьными типами, тип AnsiString предназначен для хранения обычных строк, а WideString – для строк в формате Unicode.

Тип String является синонимом для типа AnsiString. Рассмотрение структурных типов данных начнем с массивов.

Массив – это упорядоченная структура, состоящая из множества однотипных элементов, имеющих общее имя. Массив объявляется при помощи ключевого слова Array, необязательных квадратных скобок с указанием числа элементов массива, и типа данных для элементов массива:

Array [начальный индекс..конечный индекс] of <тип данных>. Количество диапазонов индексов определяет размерность массива. Для

одномерного массива требуется один индекс, для двумерного массива – два индекса и т.д. Объявляется массив следующим образом:

var A: array [1..100] of Integer.

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

var DynArray: array of integer;

Однако для того, чтобы приступить к использованию динамического массива, требуется выделить для него место в памяти. Делается это при помощи процедуры SetLength, указав имя динамического массива и необходимый размер памяти:

SetLength(DynArray,10);

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

Множество – это группа элементов, объединенная под одним именем, и

56

с которой можно сравнивать другие величины, чтобы определить, принадлежат ли они этому множеству. Количество элементов в одном множестве не может превышать 256. Множество описывается следующим образом: type <имя_множества> = set of диапазон_значений_множества.

В качестве диапазона может указываться любой тип, количество элементов в котором не больше 256. Например:

type TMySet = set of 0 .. 255; type TMySet = set of Byte;

Конкретные значения множества задаются в программе с помощью перечисления элементов, заключенных в квадратные скобки. Допускается использовать и диапазоны:

var MySet : TMySet; begin

MySet:=[1, 3 .. 7, 9]; end;

Чтобы проверить, является ли некое значение элементом множества, применяется оператор in в сочетании с условным оператором:

var Key : Char; Str : String; begin

if Key in MySet then Str:='Math'; end;

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

type TColors = (Green, Red, Blue, Yellow).

Затем создается множество на основе заданного перечислимого типа данных:

type TColor: set of TColors.

Записи, подобно массивам, могут хранить в себе целый набор данных,

57

но при этом они не должны принадлежать к одному типу. То есть, если массивы предназначены для хранения каких-или рядов данных, то записи – для объединения разнородной информации под общим именем.

Объявление записи начинается с ключевого слова record, за которым следует перечисление всех входящих в нее элементов, называемых полями записи, и завершается ключевым словом end:

<имя_записи> record <имя_поля_1> : <тип_поля_1>;

...

<имя_поля_N> : <тип_поля_N>; end;

Например, если необходимо хранить данные о характеристиках какогоили изделия, то можно воспользоваться следующей записью:

type TUnit = record

Color : string; Weight : extended; Length : extended; Width : extended; end;

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

var Unit1: TUnit;

...

Unit1.Weight := 1000;

Существует возможность сочетать в одном типе записи с разными полями. Называются такие записи вариантными и объявляются так же как и

58

обычные, за исключением того, что содержат дополнительную часть, начинающуюся с ключевого слова case:

<имя_записи> record <имя_поля_1> : <тип_поля_1>;

...

<имя_поля_N> : <тип_поля_N>;] case <признак> : <тип_признака> of

<вариант_1> : (<поля_для_варианта_1>);

...

<вариант_N> : (<поля_для_варианта_N>); end;

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

«Salaried» («на окладе»):

type

TEmployee = record Name: string; JobTitle: string;

case Salaried: Boolean of true: (Salary: Currency); false: (Hourly: Currency);

end;

В зависимости от того, будет ли значением поля Salaried той или иной переменной типа TEmployee ложь или истина, у нее будет или поле Salary,

или Hourly.

59

2.4. Управление проектом

Для создания нового проекта в Delphi 7 необходимо воспользоваться пунктом главного меню File – New – Application. Пункты меню File – New

– Form и File – New – Unit служат для добавления в проект дополнительных форм и модулей соответственно. Любой проект имеет, по крайней мере, шесть файлов, связанных с ним:

главный файл проекта, по умолчанию называется PROJECT1.DPR, в большинстве случаев не требует редактирования со стороны создателя программы, за это отвечает сама среда программирования;

файл первого модуля (unit) программы, по умолчанию называется

UNIT1.PAS;

файл главной формы (form), который по умолчанию называется UNIT1.DFM, используется для сохранения информации о внешнем виде главной формы;

файл PROJECT1.RES содержит иконку для проекта, создается автоматически;

файл, который по умолчанию называется PROJECT1.DOF и содержит текущие установки для опций проекта, такие как, например, настройки компилятора и компоновщика, каталоги, условные директивы и параметры командной строки;

файл PROJECT1.CFG содержит информацию о состоянии рабочего пространства среды программирования.

После компиляции программы получаются файлы со следующими расширениями:

DCU – скомпилированные модули;

EXE – исполняемый файл;

DOF – служебный файл для запуска программы в среде (данный файл имеет большой размер и его рекомендуется стирать по окончании ра-

60