Методичка Фролов
.pdfbegin
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