ЛЕКЦИЯ №8
Среда разработчика. Основы визуального программирования. Консольные проекты. Знакомство с основными компонентами. Введение в язык delphi (основные алгоритмические конструкции). Правила оформления программ. Инструменты для отладки. Тестирование.
Основы программирования в среде DELPHI7
Программа
Программа, работающая на компьютере, нередко отождествляется с самим компьютером, т. к. человек, использующий программу, "вводит в компьютер" исходные данные, как правило, при помощи клавиатуры, а компьютер "выдает результат" на экран, на принтер или в файл. На самом деле, преобразование исходных данных в результат выполняет процессор компьютера. Процессор преобразует исходные данные в результат по определенному алгоритму, который, будучи записан на специальном языке, называется программой. Таким образом, чтобы компьютер выполнил некоторую работу, необходимо разработать последовательность команд, обеспечивающую выполнение этой работы, или, как говорят, написать программу.
Этапы разработки программы
Выражение "написать программу" отражает только один из этапов создания компьютерной программы, когда разработчик программы (программист) действительно пишет команды (инструкции) на бумаге или при помощи текстового редактора.
Программирование — это процесс создания (разработки) программы, который может быть представлен последовательностью следующих шагов:
1. Спецификация (определение, формулирование требований к программе).
2. Разработка алгоритма.
3. Кодирование (запись алгоритма на языке программирования).
4. Отладка.
5. Тестирование.
6. Создание справочной системы.
7. Создание установочного диска (CD-ROM).
Спецификация
Спецификация, определение требований к программе — один из важнейших этапов, на котором подробно описывается исходная информация, формулируются требования к результату, поведение программы в особых случаях (например, при вводе неверных данных), разрабатываются диалоговые окна, обеспечивающие взаимодействие пользователя и программы.
Разработка алгоритма
На этапе разработки алгоритма необходимо определить последовательность действий, которые надо выполнить для получения результата. Если задача может быть решена несколькими способами и, следовательно, возможны различные варианты алгоритма решения, то программист, используя некоторый критерий, например, скорость решения алгоритма, выбирает наиболее подходящее решение. Результатом этапа разработки алгоритма является подробное словесное описание алгоритма или его блок-схема.
Кодирование
После того как определены требования к программе и составлен алгоритм решения, алгоритм записывается на выбранном языке программирования. В результате получается исходная программа.
Отладка
Отладка — это процесс поиска и устранения ошибок. Ошибки в программе разделяют на две группы: синтаксические (ошибки в тексте) и алгоритмические. Синтаксические ошибки — наиболее легко устраняемые. Алгоритмические ошибки обнаружить труднее. Этап отладки можно считать законченным, если программа правильно работает на одном-двух наборах входных данных.
Тестирование
Этап тестирования особенно важен, если вы предполагаете, что вашей программой будут пользоваться другие. На этом этапе следует проверить, как ведет себя программа на как можно большем количестве входных наборов данных, в том числе и на заведомо неверных.
Создание справочной системы
Если разработчик предполагает, что программой будут пользоваться другие, то он обязательно должен создать справочную систему и обеспечить пользователю удобный доступ к справочной информации во время работы с программой. В современных программах справочная информация представляется в форме СНМ- или HLP-файлов. Помимо справочной информации, доступ к которой осуществляется из программы во время ее работы, в состав справочной системы включают инструкцию по установке (инсталляции) программы, которую оформляют в виде Readme-файла в одном из форматов: TXT, DOC или НТМ.
Создание установочного диска
Установочный диск или CD-ROM создаются для того, чтобы пользователь мог самостоятельно, без помощи разработчика, установить программу на свой компьютер. Обычно помимо самой программы на установочном диске находятся файлы справочной информации и инструкция по установке программы (Readme-файл). Следует понимать, что современные программы, в том числе разработанные в Delphi, в большинстве случаев (за исключением самых простых программ) не могут быть установлены на компьютер пользователя путем простого копирования, так как для своей работы требуют специальных библиотек и компонентов, которых может и не быть у конкретного пользователя. Поэтому установку программы на компьютер пользователя должна выполнять специальная программа, которая помещается на установочный диск. Как правило, установочная программа создает отдельную папку для устанавливаемой программы, копирует в нее необходимые файлы и, если надо, выполняет настройку операционной системы путем внесения дополнений и изменений в реестр.
Алгоритм
и программа
На первом этапе создания
программы программист должен определить последовательность действий, которые
необходимо выполнить, чтобы решить поставленную задачу, т. е. разработать алгоритм.
Алгоритм — это точное предписание,
определяющее процесс перехода от исходных данных к результату.
Алгоритм решения задачи
может быть представлен в виде словесного описания или графически — в виде блок-схемы.
При изображении алгоритма в виде блок-схемы используются специальные символы
(рис. 1.1).
Рис. 1.1. Основные
символы, используемые для представления алгоритма в виде блок-схемы
Представление алгоритма
в виде блок-схемы позволяет программисту уяснить последовательность действий,
которые должны быть выполнены для решения задачи, убедиться в правильности понимания
поставленной задачи.
При программировании
в Delphi алгоритм решения задачи представляет собой совокупность алгоритмов
процедур обработки событий.
В качестве примера
на рис. 1.2 приведена совокупность алгоритмов программы Стоимость покупки,
а на рис. 1.3 — ее диалоговое окно. После разработки диалогового окна и
алгоритмов обработки событий можно приступить к написанию программы. Ее текст
приведен в листинге 1.1.
Листинг 1.1.
Программа Стоимость покупки
unit
pokupka_1;
interface
uses
Windows,
Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1
= class(TForra)
Edit1:
TEdit;
Edit2:
TEdit;
Label1:
TLabel;
Label2:
TLabel;
Button1:
TButton;
Label3:
TLabel;
procedure
ButtonlClick(Sender: TObject);
procedure
Edit2KeyPress(Sender: TObject;
var
Key: Char);
procedure
EditlKeyPress(Sender: TObject;
var
Key: Char); private
{ Private declarations } public
{ Public declarations }
end;
var
Forml:
TForm1;
implementation
{$R
*.dfm}
//
подпрограмма
procedure Summa;
var
cena:
real; // цена
kol:
integer; // количество
s:
real; // сумма
mes:
string[255]; // сообщение
begin
cena
:= StrToFloat(Form1.Edit1.Text);
kol
:= StrToInt(Forml.Edit2.Text);
s
:= cena * kol;
if
s > 500 then
begin
s
:= s * 0.9;
mes
:= 'Предоставляется скидка 10%' + #13;
end;
mes
:= mes+ 'Стоимость покупки: '
+
FloatToStrF(s,ffFixed,4,2) +' руб.';
Forml.Label3.Caption := mes;
end;
//
щелчок на кнопке Стоимость
procedure
TForml.ButtonlClick(Sender: TObject);
begin
Summa;
// вычислить сумму покупки
end;
//
нажатие клавиши в поле Количество
procedure
TForml.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
case
Key of
'0'
.. '9',#8: ; // цифры и клавиша <Backspace>
#13: Summa; // вычислить стоимость покупки
else Key := Chr(O); // символ не отображать
end;
end;
//
нажатие клавиши в поле Цена
procedure
TForm1.EditlKeyPress(Sender: TObject; var Key: Char);
begin
case
Key of
'0'
.. '9', #8 : ; // цифры и клавиша <Backspace>
#13:
Form1.Edit2.SetFocus; // клавиша <Enter>
'.'
,'.' :
begin
if
Key = '.'
then
Key:=', if Pos(',',Edit1.Text) <> 0
then
Key:= Chr(0);
end;
else
// все остальные символы запрещены
Key
:= Chr(0);
end;
end;
end.
Рис. 1.2.
Алгоритм программы вычисления стоимости покупки — совокупность алгоритмов обработки
событий на компонентах формы
Рис. 1.3. Окно (форма) программы Стоимость покупки
Компиляция
Программа, представленная
в виде инструкций языка программирования, называется исходной программой. Она
состоит из инструкций, понятных человеку, но не понятных процессору компьютера.
Чтобы процессор смог выполнить работу в соответствии с инструкциями исходной
программы, исходная программа должна быть переведена на машинный язык — язык
команд процессора. Задачу преобразования исходной программы в машинный код выполняет
специальная программа — компилятор.
Компилятор, схема работы
которого приведена на рис. 1.4, выполняет последовательно две задачи:
1. Проверяет текст
исходной программы на отсутствие синтаксических ошибок.
2. Создает (генерирует)
исполняемую программу — машинный код.

Рис. 1.4.
Схема работы компилятора
Следует отметить, что
генерация исполняемой программы происходит только в том случае, если в тексте
исходной программы нет синтаксических ошибок.
Генерация машинного кода компилятором свидетельствует лишь о том, что в тексте программы нет синтаксических ошибок. Убедиться, что программа работает правильно можно только в процессе ее тестирования — пробных запусках программы и анализе полученных результатов. Например, если в программе вычисления корней квадратного уравнения допущена ошибка в выражении (формуле) вычисления дискриминанта, то, даже если это выражение будет синтаксически верно, программа выдаст неверные значения корней.
Язык программирования Delphi
В среде программирования Delphi для записи программ используется язык программирования Delphi. Программа на Delphi представляет собой последовательность инструкций, которые довольно часто называют операторами. Одна инструкция от другой отделяется точкой с запятой.
Каждая инструкция состоит из идентификаторов. Идентификатор может обозначать:
Инструкцию языка (:=, if, while, for);
переменную;
константу (целое или дробное число);
арифметическую (+, -,*,/) или логическую (and, or, not) операцию;
подпрограмму (процедуру или функцию);
отмечать начало (procedure, function) или конец (end) подпрограммы ИЛИ блока (begin, end).
Тип данных
Программа может оперировать данными различных типов: целыми и дробными числами, символами, строками символов, логическими величинами.
Целый
тип
Язык Delphi поддерживает
семь целых типов данных: shortint, smailint, Longint, Int64, Byte, word и Longword,
описание которых приведено в табл. 1.1.
Таблица 1.1.
Целые типы
|
Тип |
Диапазон |
Формат |
||
|
Shortint |
-128-127 |
8 битов |
||
|
Smallint |
-32 768 - 32 767 |
16 битов |
||
|
Longint |
-2 147 483 648 - 2 147
483 647 |
32 бита |
||
|
Int64 |
-263- 263
- 1 |
64 бита |
||
|
Byte |
0-255 |
8 битов, беззнаковый |
||
|
Word |
0-65 535 |
16 битов, беззнаковый |
||
|
Longword |
0 - 4 294 967 295 |
32 бита, беззнаковый |
||
Object Pascal поддерживает и наиболее универсальный целый тип - Integer, который Эквивалентен Longint.
Вещественный
тип
Язык Delphi поддерживает
шесть вещественных типов: Reai48, single, Double, Extended, comp, Currency.
Типы различаются между собой диапазо-ном допустимых значений, количеством значащих
цифр и количеством байтов, необходимых для хранения данных в памяти компьютера
(табл. 1.2).
Таблица 1.2.
Вещественные (дробные) типы
|
Тип |
Диапазон |
Значащих цифр |
Байтов |
||
|
Real48 |
2.9x 10-39-1.7x1038 |
11-12 |
06 |
||
|
Single |
1.5 x 10-45-3.4х
1038 |
7-8 |
04 |
||
|
Double |
5.0x10-324
-1.7x10308 |
15-16 |
08 |
||
|
Extended |
3.6x10-4951
-1.1 х104932 |
19-20 |
10 |
||
|
Comp |
263+1 - 263-1 |
19-20 |
08 |
||
|
Currency |
-922 337 203 685 477.5808
--922 337 203 685 477.5807 |
19-20 |
08 |
||
Язык Delphi поддерживает и наиболее универсальный вещественный тип - Real, который э квивалентен Double.
Символьный
тип
Язык Delphi поддерживает
два символьных типа: Ansichar и Widechar:
- тип Ansichar — это символы в
кодировке ANSI, которым соответствуют числа в диапазоне от 0 до 255;
- тип widechar — это символы в
кодировке Unicode, им соответствуют числа от 0 до 65 535.
Object Pascal поддерживает и наиболее универсальный символьный тип - Char, который эквивалентен Ansichar.
Строковый
тип
Язык Delphi поддерживает
три строковых типа: shortstring, Longstring
- WideString:
- тип shortstring представляет
собой статически размещаемые в памяти компьютера строки длиной от 0 до 255
символов;
- тип Longstring представляет
собой динамически размещаемые в памяти строки, длина которых ограничена только
объемом свободной памяти;
- тип WideString представляет
собой динамически размещаемые в памяти строки, длина которых ограничена только
объемом свободной памяти. Каждый символ строки типа WideString является Unicode-символом.
В языке Delphi для
обозначения строкового типа допускается использование идентификатора string.
Тип string эквивалентен типу shortstring.
В языке Delphi для обозначения строкового типа допускается использование идентификатора string. Тип string эквивалентен типу shortstring.
Логический тип
Логическая величина может принимать одно из двух значений True (истина) или False (ложь). В языке Delphi логические величины относят к типу Boolean.
Переменная
Переменная — это область
памяти, в которой находятся данные, которыми оперирует программа. Когда программа
манипулирует с данными, она, фактически, оперирует содержимым ячеек памяти,
т. е. переменными.
Чтобы программа могла
обратиться к переменной (области памяти), например, для того, чтобы получить
исходные данные для расчета по формуле или сохранить результат, переменная должна
иметь имя. Имя переменной придумывает программист.
В качестве имени переменной
можно использовать последовательность из букв латинского алфавита, цифр и некоторых
специальных символов. Первым символом в имени переменной должна быть буква.
Пробел в имени переменной использовать нельзя.
Следует обратить внимание
на то, что компилятор языка Delphi не различает прописные и строчные буквы в
именах переменных, поэтому имена SUMMA, Summa и summa обозначают одну и ту же
переменную.
Желательно, чтобы имя
переменной было логически связано с ее назначением. Например, переменным, предназначенным
для хранения коэффициентов и корней квадратного уравнения, которое в общем виде
традиционно записывают
ах2
+ bх + с = 0
вполне логично присвоить
имена а, b, с, x1 и х2. Другой пример. Если в программе есть переменные, предназначенные
для хранения суммы покупки и величины скидки, то этим переменным можно присвоить
имена
TotalSumm
и Discount или ObSumma и Skidka.
В языке Delphi каждая
переменная перед использованием должна быть объявлена. С помощью объявления
устанавливается не только факт существования переменной, но и задается ее тип,
чем указывается и диапазон допустимых значений.
В общем виде инструкция
объявления переменной выглядит так:
Имя : тип;
где:
- имя — имя переменной;
- тип — тип данных, для хранения
которых предназначена переменная.
Пример:
а
: Real; b : Real; i : Integer;
В приведенных примерах
объявлены две переменные типа real и одна переменная типа integer.
В тексте программы
объявление каждой переменной, как правило, помещают на отдельной строке.
Если в программе имеется
несколько переменных, относящихся к одному типу, то имена этих переменных можно
перечислить в одной строке через запятую, а тип переменных указать после имени
последней переменной через двоеточие, например:
а,b,с : Real; x1,x2 : Real;
Константы
В языке Delphi существует два вида констант: обычные и именованные.
Обычная константа — это целое или дробное число, строка символов или отдельный символ, логическое значение.
Числовые
константы
В тексте программы
числовые константы записываются обычным образом, т. е. так же, как числа, например,
при решении математических задач. При записи дробных чисел для разделения целой
и дробных частей используется точка. Если константа отрицательная, то непосредственно
перед первой цифрой ставится знак "минус".
Ниже приведены примеры
числовых констант:
123
0.0
-524.03
0
Дробные константы могут
изображаться в виде числа с плавающей точкой. Представление в виде числа с плавающей
точкой основано на том, что любое число может быть записано в алгебраической
форме как произведение числа, меньшего 10, которое называется мантиссой, и степени
десятки, именуемой порядком.
В табл. 1.3 приведены
примеры чисел, записанных в обычной форме, в алгебраической форме и форме с
плавающей точкой.
Таблица 1.3.
Примеры записи дробных чисел
|
Число |
Алгебраическая форма |
Форма с плавающей точкой |
||
|
1 000 000 -123.452 0,0056712 |
1х106 -1,23452x102 5,6712х10-3 |
1 .0000000000Е+06 -1 .2345200000Е+02 5,6712000000Е-03 |
||
Строковые и символьные константы
Строковые и символьные константы заключаются в кавычки. Ниже приведены примеры строковых констант:
'Язык программирования Delphi1 'Delphi 7'
'2.4'
'Д'
Здесь следует обратить внимание на константу ' 2.4'. Это именно символьная константа, т. е. строка символов, которая изображает число "две целые четыре десятых", а не число 2,4.
Логические константы
Логическое высказывание (выражение) может быть либо истинно, либо ложно. Истине соответствует константа True, значению "ложь" - константа False.
Именованная
константа
Именованная константа
— это имя (идентификатор), которое в программе используется вместо самой константы.
Именованная константа,
как и переменная, перед использованием должна быть объявлена. В общем виде инструкция
объявления именованной константы выглядит следующим образом:
константа = значение;
где:
- константа — имя константы;
- значение — значение константы.
Именованные константы
объявляются в программе в разделе объявления констант, который начинается словом
const. Ниже приведен пример объявления именованных констант (целой, строковой
и дробной).
const
Bound
= 10;
Title
= 'Скорость бега';
pi
= 3.1415926;
После объявления именованной
константы в программе вместо самой константы можно использовать ее имя.
В отличие от переменной,
при объявлении константы тип явно не указывают. Тип константы определяется ее
видом, например:
- 125 — константа целого типа;
- 0.0 — константа вещественного
типа;
- ' выполнить ' — строковая константа;
- ' \' — символьная константа.
Математические
функции
Математические функции
(табл. 1.6) позволяют выполнять различные вычисления.
Таблица 1.6.
Математические функции
|
Функция |
Значение |
||
|
Аbs (n) |
Абсолютное значение n |
||
|
Sqrt (n) |
Квадратный корень из n |
||
|
Sqr (n) |
Квадрат n |
||
|
Sin (n) |
Синус n |
||
|
Cos (n) |
Косинус n |
||
|
Arctan (n) |
Арктангенс n |
||
|
Ехр(n) |
Экспонента n |
||
|
Ln(n) |
Натуральный логарифм n |
||
|
Rardom(n) |
Случайное целое число
в диапазоне от 0 до n- 1 |
||
Величина угла тригонометрических функций должна быть выражена в радианах. Для преобразования величины угла из градусов в радианы используется формула (а*з.141525б)/180, где: а— величина угла в градусах; 3.1415926 — число л. Вместо дробной константы 3.1415926 можно использовать стандартную именованную константу PI. В этом случае выражение пересчета угла из градусов в радианы будет выглядеть так: a*Pi/180.
Функции
преобразования
Функции преобразования
(табл. 1.7) наиболее часто используются в инструкциях, обеспечивающих ввод и
вывод информации. Например, для того чтобы вывести в поле вывода (компонент
Label) диалогового окна значение переменной типа real, необходимо преобразовать
число в строку символов, изображающую данное число. Это можно сделать при помощи
функции FloatToStr, которая возвращает строковое представление значения выражения,
указанного в качестве параметра функции.
Например, инструкция
Labeii.caption := FioatTostr(x) выводит значе-ние переменной х в поле Labeii.
Таблица 1.7.
Функции преобразования
|
Функция |
Значение функции |
||
|
Chr(n) IntToStr (k) |
Символ, код которого равен
n Строка, являющаяся изображением целого k |
||
|
Функция |
Значение функции |
||
|
FloatToStr (n) |
Строка, являющаяся изображением
вещественного n |
||
|
FloatToStrF(n, f , k,m) |
Строка, являющаяся изображением
вещественного п. При вызове функции указывают: f — формат (способ
изображения); k — точность (нужное общее количество цифр); m — количество
цифр после десятичной точки |
||
|
StrToInt (s) |
Целое, изображением которого
является строка s |
||
|
StrToFloat (s) |
Вещественное, изображением
которого является строка s |
||
|
Round (n) |
Целое, полученное путем
округления n по известным правилам |
||
|
Trunc (n) |
Целое, полученное путем
отбрасывания дробной части n |
||
|
Frac(n) |
Дробное, представляющее
собой дробную часть вещественного n |
||
|
Int (n) |
Дробное, представляющее
собой целую часть вещественного n |
||
Использование
функций
Обычно функции используют
в качестве операндов выражений. Параметром функции может быть константа, переменная
или выражение соответствующего типа. Ниже приведены примеры использования стандартных
функций и функций преобразования.
n
:= Round((x2-x1)/dx);
x1:=
(-b + Sqrt(d)) / (2*а);
m
:= Random(10);
cena
:= StrToInt(Edit1.Text);
Edit2.Text
:= IntToStr(100);
mes
:= 'x1=' + FloatToStr(xl);
Ввод
данных
Наиболее просто программа может получить исходные данные из окна ввода или из поля редактирования (компонент Edit).
Ввод
из окна ввода
Окно ввода — это стандартное
диалоговое окно, которое появляется на экране в результате вызова функции inputBox.
Значение функции inputBox — строка, которую ввел пользователь.
В общем виде инструкция
ввода данных с использованием функции inputBox выглядит так:
Переменная := InputBox(Заголовок,
Подсказка, Значение);
где:
- Переменная — переменная строкового
типа, значение которой должно быть получено от пользователя;
- Заголовок — текст заголовка окна
ввода; П подсказка — текст поясняющего сообщения;
- Значение — текст, который будет
находиться в поле ввода, когда окно ввода появится на экране.
Ниже в качестве примера
приведена инструкция, используя которую можно получить исходные данные для программы
пересчета веса из фунтов в килограммы. Окно ввода, соответствующее этой инструкции,
приведено на рис. 1.5.
s:=InputBox('Фунты-килограммы','Введите
вес в фунтах','0');
Рис. 1.5.
Пример окна ввода
Если во время работы
программы пользователь введет строку и щелкнет на кнопке ОК, то значением
функции inputBox будет введенная строка. Если будет сделан щелчок на кнопке
Cancel, то значением функции будет строка, переданная функции в качестве
параметра значение.
Следует еще раз обратить
внимание на то, что значение функции inputBox строкового (string) типа. Поэтому
если программе надо получить число, то введенная строка должна быть преобразована
в число при помощи соответствующей функции преобразования. Например, фрагмент
программы пересчета веса из фунтов в килограммы, обеспечивающий ввод исходных
данных из окна ввода, может выглядеть так:
s := InputBox('Фунты-килограммы1,'Введите вес в фунтах',''); funt := StrToFloat(s);
Ввод
из поля редактирования
Поле редактирования
— это компонент Edit. Ввод данных из поля редактирования осуществляется обращением
к свойству Text.
Рис. 1.6.
Компонент Edit1 используется для ввода данных
На рис. 1.6 приведен
вид диалогового окна программы пересчета веса из фунтов в килограммы. Компонент
Editl используется для ввода исходных данных. Инструкция ввода данных в этом
случае будет иметь вид:
Funt := StrToFloat(Editl.Text);
Вывод
результатов
Наиболее просто программа может вывести результат своей работы в окно сообщения или в поле вывода (компонент Label) диалогового окна.
Вывод
в окно сообщения
Окна сообщений используются
для привлечения внимания пользователя. При помощи окна сообщения программа может,
к примеру, проинформировать об ошибке в исходных данных или запросить подтверждение
выполнения необратимой операции, например, удаления файла.
Вывести на экран окно
с сообщением можно при помощи процедуры ShowMessage или функции MessageDlg.
Процедура ShowMessage
выводит на экран окно с текстом и командной кнопкой ОК.
В общем виде инструкция
вызова процедуры ShowMessage выглядит так:
ShowMessage(Сообщение);
где сообщение — текст,
который будет выведен в окне.
На рис. 1.7 приведен
вид окна сообщения, полученного в результате выполнения инструкции:
ShowMessage('Введите
вес в фунтах.');
Рис. 1.7.
Пример окна сообщения
Следует обратить внимание
на то, что в заголовке окна сообщения, выводимого процедурой ShowMessage, указано
название приложения, которое задается на вкладке Application окна Project
Options. Если название приложения не задано, то в заголовке будет имя исполняемого
файла.
Функция MessageDig
более универсальная. Она позволяет поместить в окно с сообщением один из стандартных
значков, например "Внимание", задать количество и тип командных кнопок
и определить, какую из кнопок нажал пользователь. На рис. 1.8 приведено окно,
выведенное в результате выполнения инструкции
r:=MessageDlg('Файл
'+ FName + ' будет удален.', mtWarning, [mbOk,mbCancel] , 0) ;
Рис. 1.8.
Пример окна сообщения
Значение функции MessageDlg
— число, проверив значение которого, можно определить, выбором какой командной
кнопки был завершен диалог.
В общем виде обращение
к функции MessageDig выглядит так:
Выбор: = MessageDlg(
Сообщение, Тип, Кнопки, КонтекстСправки)
где:
- Сообщение — текст сообщения;
- Тип — тип сообщения. Сообщение
может быть информационным, предупреждающим или сообщением о критической ошибке.
Каждому типу сообщения соответствует определенный значок. Тип сообщения задается
именованной константой (табл. 1.8);
Кнопки — список кнопок,
отображаемых в окне сообщения. Список может состоять из нескольких разделенных
запятыми именованных констант (табл. 1.9). Весь список заключается в квадратные
скобки.
Таблица 1.8.
Константы функции MessageDlg
|
Константа |
Тип сообщения |
Значок |
||
|
mtWarning |
Внимание |
|
||
|
mtError |
Ошибка |
|
||
|
mt Information |
Информация |
|
||
|
mtConfirmation |
Подтверждение |
|
||
|
mtCustom |
Обычное |
Без значка |
||
Таблица 1.9.
Константы функции MessageDlg
|
Константа |
Кнопка |
Константа |
Кнопка |
||
|
mbYes |
Yes |
mb Abort |
Abort |
||
|
mbNo |
No |
mbRetry |
Retry |
||
|
mbOK |
OK |
mblgnore |
Ignore |
||
|
mbCancel |
Cancel |
mbAll |
All |
||
|
mbHelp |
Help |
|
|
||
Например, для того
чтобы в окне сообщения появились кнопки ОК и Cancel, список Кнопки
должен быть таким:
[mbOK,mbCancel]
Кроме приведенных констант
можно использовать константы: mbokcancel, mbYesNoCancel и mbAbortRetryIgnore.
Эти константы определяют наиболее часто используемые в диалоговых окнах комбинации
командных кнопок.
контекстСправки —
параметр, определяющий раздел справочной системы, который появится на экране,
если пользователь нажмет клавишу <F1>. Если вывод справки не предусмотрен,
то значение параметра КонтекстСправки должно быть равно нулю.
Значение, возвращаемое
функцией MessageDig (табл. 1.10), позволяет определить, какая из командных кнопок
была нажата пользователем.
Таблица 1.10.
Значения функции MessageDlg
|
Значение функции MessageDig |
Диалог завершен нажатием
кнопки |
||
|
mrAbort |
Abort |
||
|
mrYes |
Yes |
||
|
mrOk |
Ok |
||
|
mrRetry |
Retry |
||
|
mrNo |
No |
||
|
mrCancel |
Cancel |
||
|
mrIgnore |
Ignore |
||
|
mrAll |
All |
||
Процедуры
и функции
При программировании
в Delphi работа программиста заключается в основном в разработке процедур (подпрограмм)
обработки событий.
При возникновении события
автоматически запускается процедура обработки события, которую и должен написать
программист. Задачу вызова процедуры обработки при возникновении соответствующего
события берет на себя Delphi.
В языке Object Pascal основной программной единицей является подпрограмма. Различают два вида подпрограмм: процедуры и функции. Как процедура, так и функция, представляют собой последовательность инструкций, предназначенных для выполнения некоторой работы. Чтобы выполнить инструкции подпрограммы, надо вызвать эту подпрограмму. Отличие функции от процедуры заключается в том, что с именем функции связано значение, поэтому имя функции можно использовать в выражениях.
Структура
процедуры
Процедура начинается
с заголовка, за которым следуют: П раздел объявления констант;
- раздел объявления типов;
- раздел объявления переменных;
- раздел инструкций.
В общем виде процедура
выглядит так:
procedure Имя (СписокПараметров);
const
//
здесь объявления констант
type
//
здесь объявления типов var
//
здесь объявления переменных
begin
//
здесь инструкции программы
end;
Заголовок процедуры
состоит из слова procedure, за которым следует имя процедуры, которое используется
для вызова процедуры, активизации ее выполнения. Если у процедуры есть параметры,
то они указываются после имени процедуры, в скобках. Завершается заголовок процедуры
символом "точка с запятой".
Если в процедуре используются
именованные константы, то они объявляются в разделе объявления констант, который
начинается словом const.
За разделом констант
следует раздел объявления типов, начинающийся словом type.
После раздела объявления
типов идет раздел объявления переменных, в котором объявляются (перечисляются)
все переменные, используемые в программе. Раздел объявления переменных начинается
словом var.
За разделом объявления
переменных расположен раздел инструкций. Раздел инструкций начинается словом
begin и заканчивается словом end, за которым следует символ "точка с запятой".
В разделе инструкций находятся исполняемые инструкции процедуры.
Ниже в качестве примера
приведен фрагмент программы вычисления стоимости покупки — процедура Summa.
procedure Summa;
var
cena:
real; // цена
kol:
integer; // количество
s:
real; // сумма
mes:
string[255]; // сообщение
begin
cena := StrToFloat(Form1.Edit1.Text);
kol := StrToInt(Form1.Edit2.Text);
s := cena * kol; if s > 500 then
begin
s
:= s * 0.9;
mes := 'Предоставляется скидка 10%'
+
#13; end; mes := mes+ 'Стоимость покупки: '
+ FloatToStrF(s,ffFixed,4,2) +' руб.';
Forml.Label3.Caption := mes; end;
Структура
функции
Функция начинается
с заголовка, за которым следуют разделы объявления констант, типов и переменных,
а также раздел инструкций.
Объявление функции
в общем виде выглядит следующим образом:
function
Имя (СписокПараметров) :
Тип;
const
// начало раздела объявления констант
type
// начало раздела объявления типов
var // начало раздела объявления переменных
begin
// начало раздела инструкций
result
:= Значение; // связать с именем функции значение
end;
Заголовок функции начинается
словом function, за которым следует имя функции. После имени функции в скобках
приводится список параметров, за которым через двоеточие указывается тип значения,
возвращаемого функцией (тип функции). Завершается заголовок функции символом
"точка с запятой".
За заголовком функции
следуют разделы объявления констант, типов и переменных.
В разделе инструкций,
помимо переменных, перечисленных в разделе описания переменных, можно использовать
переменную result. По завершении выполнения инструкций функции значение этой
переменной становится значением функции. Поэтому среди инструкций функции обязательно
должна быть инструкция, присваивающая переменной result значение. Как правило,
эта инструкция является последней исполняемой инструкцией функции.
Ниже в качестве примера
приведена функция FuntToKg, которая пересчитывает вес из фунтов в килограммы:
// Пересчет веса из фунтов в килограммы
function FuntToKg(f:real):real;
const
//
в России 1 фунт равен 409,5 гр.
К=0.4095; // коэф. Пересчета
begin
result:=f*K;
end;
Запись
инструкций программы
Одну инструкцию от
другой отделяют точкой с запятой или, другими словами, в конце каждой инструкции
ставят точку с запятой.
Хотя в одной строке
программы можно записать несколько инструкций, как правило, каждую инструкцию
программы записывают в отдельной строке.
Некоторые инструкции
(if, case, repeat, while и др.) принято записывать в несколько строк, используя
для выделения структуры инструкции отступы. Ниже приведен пример инструкции,
которая записана в несколько строк и с использованием отступов:
if
d >= 0 then begin
x1:=(-b+Sqrt(d))/(2*a);
x2:=(-b-Sqrt(d))/(2*a);
ShowMessage('x1='+FloatToStr(xl) +
'x2='+FloatToStr(x2)) ;
end
else
ShowMessage('Уравнение
не имеет корней.');
Следует обратить внимание
на то, что слова then и else записаны одно под другим (с одинаковым отступом)
и с отступом относительно слова if. Слово end располагается под словом begin,
а инструкции между begin и end размещаются одна под другой, но с отступом относительно
begin.
Приведенную выше инструкцию
можно записать и так:
if
d >= 0 then begin
x1:=(-b+Sqrt(d))/(2*a);
x2:=(-b-Sqrt(d))/(2*a);
ShowMessage('x1='+FloatToStr(x1)+'x2='+FloatToStr(x2));
end
else
ShowMessage('Уравнение не имеет корней.');
Однако первый вариант
лучше, т. к. он отражает структуру алгоритма, реализуемого инструкцией. С первого
взгляда видна группа инструкций, которая будет выполнена, если условие d >=
о выполняется (в этом случае будут вычислены значения переменных xl и х2), и
инструкция, которая будет выполнена, если условие d >=o не выполняется.
Длинные выражения тоже
могут быть записаны в несколько строк. Разорвать выражение и перенести оставшуюся
часть на следующую строку можно практически в любом месте. Нельзя разрывать
имена переменных, числовые и строковые константы, а также составные операторы,
например, оператор присваивания.
Ниже приведен пример
записи выражения в несколько строк:
st:=
'Корни уравнения'+ #13
+'x1='
+ FloatToStr(x1)+ #13 +'х2=' + FloatToStr(x2);
Еще один момент, на
который следует обратить внимание. Компилятор игнорирует "лишние"
пробелы и пустые строки. Так, он игнорирует все пробелы в начале строки. Кстати,
это и позволяет записывать инструкции с отступами. Не требуются пробелы при
записи арифметических и логических выражений (условий), списков параметров.
Однако при их использовании программа легче воспринимается. Сравните два варианта
записи инструкции присваивания:
x1:=(-b+Sqrt(d))/(2*a);
и
x1
:= (-b + Sqrt(d)) / (2 * а);
Очевидно, что второй
вариант воспринимается лучше.
Для облегчения понимания
логики работы программы в текст программы нужно включать поясняющий текст —
комментарии. В общем случае комментарии заключают в фигурные скобки. Открывающая
скобка помечает начало комментария, закрывающая — конец. Если комментарий однострочный
или находится после инструкции, то перед комментарием ставят две наклонные черты.
Ниже приведен пример
раздела объявления переменных, в котором использованы оба способа записи комментариев:
var
{ коэффициенты уравнения }
a:real; // при второй степени неизвестного
b:real; // при первой степени неизвестного
с:real;
// при нулевой степени неизвестного
{ корни уравнения } x1,x2:real;
Консольное приложение
Консоль — это монитор и клавиатура, рассматриваемые как единое устройство. Консольное приложение — программа, предназначенная для работы в операционной системе MS-DOS (или в окне DOS), для которой устройством ввода является клавиатура, а устройством вывода — монитор, работающий в режиме отображения символьной информации (буквы, цифры и специальные знаки).
Консольные приложения удобны как иллюстрации при рассмотрении общих вопросов программирования, когда надо сосредоточиться на сути проблемы, а также как небольшие утилиты "для внутреннего потребления".
Перед тем как приступить к созданию консольного приложения, рассмотрим инструкции, обеспечивающие вывод информации на экран и ввод данных с клавиатуры.
Инструкции
write и writeln
Инструкция write предназначена
для вывода на экран монитора сообщений и значений переменных. После слова write
в скобках задается список переменных, значения которых должны быть выведены.
Кроме имен переменных в список можно включить сообщение — текст, заключенный
в одиночные кавычки.
Например:
write(Summa);
write('Результат
вычислений');
write('Корни
уравнения. xl=', xl, ' х2=', х2);
После имени переменной
через двоеточие можно поместить описание (формат) поля вывода значения переменной.
Для переменной типа
Integer формат — это целое число, которое задает ширину поля вывода (количество
позиций на экране).
Например, инструкция
write(d:5);
показывает, что для
вывода значения переменной d используется 5 позиций.
Если значение переменной
такое, что его изображение занимает меньше позиций, чем указано в формате, то
перед первой цифрой числа будут выведены пробелы так, чтобы общее количество
выведенных символов было равно указанному в формате.
Например, если значение
переменной Koi типа integer равно 15, то в результате выполнения инструкции
write('Всего
изделий:', Kol:5);
на экран будет выведено:
Всего изделий: 15
Для переменных типа
Real формат представляет собой два целых числа, разделенных двоеточием. Первое
число определяет ширину поля вывода, второе — количество цифр дробной части
числа. Если задать только ширину поля, то на экране появится число, представленное
в формате с плавающей точкой.
Например, пусть переменные
x1 и х2 типа real имеют значения 13.25 и -0.3401, тогда в результате выполнения
инструкции
write('xl=',x1:5:2,'
х2=',х2:12)
на экран будет выведено:
x1=13.25
х2=-3.40100Е-01
Если ширины поля, указанной
в формате, недостаточно для вывода значения переменной, то выводится число в
формате с плавающей точкой и десятью цифрами после запятой (все поле вывода
в этом случае занимает 17 позиций).
После выполнения инструкции
write курсор остается в той позиции экрана, в которую он переместился после
вывода последнего символа, выведенного этой инструкцией. Следующая инструкция
write начинает вывод именно с этой позиции. Например, в результате выполнения
инструкций
х:=-2.73;
write('Значение
перем');
write('енной:');
write('х=');
write(x:8:5);
на экран будет выведено:
Значение
переменной: х=-2.73000
Инструкция writein
отличается от инструкции write только тем, что после вывода сообщения или значений
переменных курсор переводится в начало следующей строки. Например, если значением
переменной x1 является число -3.561, а значением переменной х2 — число 10.345,
то результатом выполнения инструкций
writein('Значения корней уравнения:');
writeln('x1=',x:7:3);
writein('х2=',х:7:3);
на экран будет выведено:
Значения корней уравнения:
xl=-3.5610
х2=
10.345
Инструкции
read и readln
Инструкция read предназначена
для ввода с клавиатуры значений переменных (исходных данных). В общем виде инструкция
выглядит следующим образом:
read
(Переменная1, Переменная2, ... ПеременнаяN)
где переменнаяы — имя
переменной, значение которой должно быть введено с клавиатуры во время выполнения
программы.
Приведем примеры записи
инструкции read:
read(a); read(Cena,Kol);
При выполнении инструкции
read происходит следующее:
1. Программа приостанавливает
свою работу и ждет, пока на клавиатуре будут набраны нужные данные и нажата
клавиша <Enter>.
2. После нажатия клавиши
<Enter> введенное значение присваивается переменной, имя которой указано
в инструкции.
Например, в результате выполнения инструкции
read(Temperat);
и ввода с клавиатуры
строки 21, значением переменной Temperat будет число 21.
Одна инструкция read
позволяет получить значения нескольких переменных. При этом вводимые числа должны
быть набраны в одной строке и разделены пробелами. Например, если тип переменных
а, ь и с — real, то в результате выполнения инструкции read(a,b,c); и ввода
с клавиатуры строки:
4.5
23 0.17
переменные будут иметь следующие значения:
а
= 4,5; b = 23,0; с = 0,17.
Если в строке набрано
больше чисел, чем задано переменных в инструкции read, то оставшаяся часть строки
будет обработана следующей инструкцией read. Например, в результате выполнения
инструкций
read(А,В);
read(С);
и ввода с клавиатуры
строки
10
25 18
переменные получат
следующие значения: А=10, B = 25. Инструкция read (С); присвоит переменной с
значение 18.
Инструкция readln отличается
от инструкции read тем, что после выделения очередного числа из введенной с
клавиатуры строки и присваивания его последней переменной из списка инструкции
readin, оставшаяся часть строки теряется, и следующая инструкция read или readin
будет требовать нового ввода.
Например, в результате
выполнения инструкции
readin(А,В);
read(С);
и вводе с клавиатуры
строки
10
25 18
переменные получат
следующие значения: А=10, B = 25. После чего программа будет ожидать ввода нового
числа, чтобы присвоить его переменной с.
Перед каждой инструкцией
read или readin следует располагать инструкцию write, для того чтобы подсказать
пользователю, какие данные ожидает от него программа. Например, фрагмент программы
вычисления стоимости покупки может иметь вид:
writeln('Введите исходные данные.');
write('Цена изделия:');
readln(Сеnа);
write('Количество в партии:');
readln(Kol);
write('Скидка:');
readln(Skidka);
Если тип данных, вводимых с клавиатуры, не соответствует или не может быть приведен к типу переменных, имена которых указаны в инструкции read (readin), то программа аварийно завершает работу (инструкции, следующие за read, не выполняются), и на экран выводится сообщение об ошибке.
Создание
консольного приложения
Создается консольное
приложение следующим образом. Сначала нужно из меню File выбрать команду
New | Other Application, затем на вкладке New появившегося диалогового
окна New Items выбрать тип создаваемого приложения — Console
Application. В результате этих действий на экране появится окно Projectl.dpr,
в котором находится шаблон главной процедуры консольного приложения. В этом
окне можно набирать инструкции программы.

Рис. 4.1. Шаблон
главной процедуры консольного приложения
Начинается консольное
приложение инструкцией program, за которой следует имя программы. Сначала оно
совпадает с именем проекта "по умолчанию". В момент сохранения проекта
оно будет автоматически заменено на имя, под которым программист сохранит проект.
Следует обратить внимание
на то, что консольное приложение создается в Windows, а выполняется как программа
DOS. В DOS используется
кодировка ASCII, а в Windows
— ANSI, буквы русского алфавита в которых имеют разные коды. Это приводит к
тому, что вместо сообщений на русском языке консольное приложение выводит "абракадабру".
Поэтому консольные приложения должны выводить сообщения на английском, что не
всегда удобно.
Проблему вывода сообщений
на русском языке консольными приложениями можно решить, разработав функцию перекодировки
ANSI-строки в строку ASCII. Если эту функцию назвать RUS, то инструкция вывода
сообщения на русском языке может выглядеть, например, так:
writeln(Rus('У
лукогморья дуб зеленый')).
В листинге 4.1 приведен
пример программы, которая запрашивает у пользователя вес в фунтах, пересчитывает
его в килограммы и выводит результат на экран. Для вывода сообщений используется
функция RUS, которая преобразует строку символов в кодировке ANSI в строку символов
в кодировке ASCII.
Листинг 4.1.
Пересчет веса из фунтов в килограммы (консольное приложение)
program
funt2kg; {$APPTYPE
CONSOLE}
//
Функция Rus преобразует ANSI-строку в ASCII-строку
function
Rus(mes: string):string;
//
В ANSI русские буквы кодируются числами от 192 до 255,
// в ASCII - от 128 до 175 (А..Яа..п) и от 224 до 239 (р..я).
var
i:
integer; // номер обрабатываемого символа
begin
for
i: =1 to length(mes) do case mes[i] of
'A'-.'n'
:
mes[i] := Chr(Ord(mes[i]) - 64); 'р'..'я' :
mes[i] .:= Chr (Ord(mes [i] ) -16);
end;
rus
:= mes; end;
//
основная программа
var
f:real;
// вес в фунтах
w:real;
// вес в граммах
k:integer;
// кол-во килограммов
g:integer;
// кол-во граммов
// w = f*0,4095 = k*1000 + g
begin
writeln(Rus('Фунты-килограммы'));
writeln(Rus('Введите
вес в фунтах и нажмите <Enter>'));
write('-> ');
readln(f);
w
:= f * 409.5; // один фунт — это 409,5 гр.
if
w > 1000 then begin
k:=Trunc(w/1000);
g:=Round(w - k*1000);
end
else
begin
k:=0;
g:=Round(w)
; end;
write(f:4:2,
Rus(' ф. -это '));
if k >= 1 then write(k, Rus(' кг. '));
writeln(g,
Rus(' rp.')};
write(Rus('Для
завершения нажмите <Enter>')); readln;
end.
Начинается текст программы
строкой {$APPTYPE CONSOLE}, которая, хотя и похожа на комментарий, таковым не
является, т. к. сразу за открывающей скобкой следует знак денежной единицы.
Эта директива предназначена для компилятора. Следуя ее указаниям, компилятор
генерирует исполняемую программу как консольное приложение.
Компиляция консольного
приложения выполняется обычным образом, т. е. выбором из меню Project команды
Compile.
После успешной компиляции
программа может быть запущена выбором из меню Run команды Run. При
запуске консольного приложения на экране появляется стандартное окно DOS-программы.
На рис. 4.2 приведен вид DOS-окна, в котором работает консольное приложение,
созданное в Delphi.
Процесс сохранения
проекта консольного приложения стандартный. В результате выбора из меню File
команды Save на экране появляется диалоговое окно Save Project,
в котором нужно ввести имя проекта.
Рис. 4.2. DOS-окно, в котором работает консольное приложение
