Методические указания к лабораторным работам по теме технология создания и отладки программных приложений в Delphi. Введение. Delphi – это среда быстрой разработки программных приложений, в которой в качестве языка программирования используется Object Pascal. В основе системы быстрой разработки программ ( RAD – система, Rapid Application Development – среда быстрой разработки приложений) лежит технология визуального проектирования и событийного программирования , суть которого заключается в том, что среда разработки берет на себя большую часть генерации кода программы, оставляя программисту работу по конструированию диалоговых окон и функций обработки событий, написанных на языке Object Pascal, являющимися расширением языка программирования Паскаль. Для освоения технологии создания и отладки программных приложений студенты должны изучить по приведенной ниже учебной литературе следующие минимально необходимые теоретические материалы: 1. Среда Delphi: - структура окна Delphi при запуске системы, а именно: главное окно, окно формы, окно инспектора объектов, окно просмотра списка объектов, окно редактора кода, и назначение всех окон; - основные компоненты страницы Standard: Label (метка), Edit (строка ввода), MEMO (многострочный текстовый редактор), Button (командная кнопка), Panel (контейнер для размещения других компонентов). Со страницы Additional: в первую очередь изучить компонент BitBtn (командная кнопка с надписью и пиктограммой) и компонент StaticText ( метка с эффектами выделения поля метки). Перечисленные компоненты необходимо использовать при создании интерфейсного окна пользователя в окне формы для создания простейших программных приложений. 2. Язык Object Pascal. Необходимо изучить алфавит языка, простейшие конструкции языка: простые типы данных и допустимые операции над ними, а так же применимые к ним стандартные функции. Основные операторы языка: присваивание, составной, условный, выбора, цикла. 1. Структура проекта Создаваемое в Delphi приложение состоит из нескольких элементов, объединенных в проект, которые называются файлами проекта. Разработка проекта строится на тесном взаимодействии процесса создания формы (в окне формы) и процесса написания кода (т.е. текста программы на языке Object Pascal) в окне кода. Между окнами существует неразрывная связь, которую автоматически отслеживает Delphi. При этом по компонентам, размещенным на форме программистом, автоматически создаются строки кода на языке Object Pascal. Любые изменения на форме, а именно добавления, корректировка компонента, приводит к автоматическому изменению кода программы. Поэтому сначала строят форму, размещая на ней нужные компоненты, а потом переходят к написанию кода, если в этом есть необходимость. В любом случае, когда проектируется новая форма, в окне кода создается модуль, структура модуля приведена в таблице на рис. 1. Первоначально этот модуль Unit1 формы Form1. Реализация проекта в компьютере состоит из следующих этапов: компиляция, компоновка, исполнение. На каждом из этих этапов создаются файлы, имеющие определенное расширение. Литвина Е.М. www.maispace.ru\docs.php 1 При компиляции каждого проекта Delphi создает файлы со следующими расширениями: *.PAS – содержит копию текста программы из окна кода программы; *.DFM – имеет описание содержимого окна формы; *.DCU – содержит результат преобразования в машинные инструкции текста из обоих файлов: *.PAS и *.DFM. Unit <имя модуля> Interface {Содержит списки подключаемых модулей, как стандартных модулей Delphi, так и модулей, созданных пользователем.} Implementation {Содержит списки подключаемых модулей, объявления типов, констант, переменных, доступ к которым из других модулей закрыт. Здесь же помещаются тексты кодов всех объявленных в разделе Interface функций и процедур.} Initialization {Содержит операторы, выполняемые один раз при обращении к модулю.} Finalization {Содержит операторы, которые выполняются при окончании выполнения модуля.} Рис. 1. Структура модуля. Файлы *.DCU создаются компилятором и далее обрабатываются компоновщиком, который преобразует его в единый загружаемый файл с расширением *.EXE. Файл всего проекта имеет расширение *.DPR. Файл проекта является центральным файлом или главным файлом проекта. В приведенных идентификаторах файлов проекта символ “*” – это место, где записывается имя файла. В Delphi имена могут состоять из латинских букв, цифр и знака подчеркивания. Никакие другие символы и буквы национальных алфавитов в именах не допускаются. Длина имени, т.е. количество символов, из которых оно состоит, не ограничена. Главный файл проекта представляет собой программу, которая создается самой Delphi и имеет следующий вид: Program Project1; Uses Forms, Unit in ‘Unit.pas’ (Form1); {$R*.Res} Begin Application. Initialize; Application. CreateForm(TForm1, Form1); Application. Run; End. Имя проекта (имеет расширение *.DPR) и имя исполняемого файла (имеет расширение *.EXE) совпадают. По умолчанию система дает имя ”Project1”, в заголовке главного файла проекта после слова “Program” указано именно это имя. В главном файле Литвина Е.М. www.maispace.ru\docs.php 2 проекта в предложении Uses указывается имя подключаемого модуля Forms – это стандартный библиотечный модуль Deplhi, который является обязательным для всех предложений, имеющих в своем составе формы, и перечисляются подключаемые модули всех форм проекта (если их несколько). Главный файл проекта содержит всего три инструкции, выполняющие инициализацию приложения, создание формы Form1 и запуск приложения. Несмотря на то, что файл проекта формируется в Delphi автоматически на экране он не выводится, его можно посмотреть в окне, для чего надо выполнить команду из пункта меню главного окна формы Delphi, а именно Project/View Source (Проект/Просмотр источника). Не рекомендуется вносить изменения в файл проекта, особенно на начальном этапе изучения Delphi. В модуле в разделе реализации Delphi записывает директиву компилятора {$R*.DFM}. Она предназначена для связывания модуля с описанием соответствующей ему формы. Описание формы и всех размещенных на ней компонентов система Delphi хранит в файлах с расширением *.DFM. Эти файлы имеют обычный текстовый формат. Так как проект состоит из нескольких файлов, рекомендуется создавать отдельный каталог для каждого проекта, если их несколько. 2. Создание формы приложений Разработка приложений в Deplhi начинается с создания формы. Непосредственно после начала создания приложения Delphi предлагает разработчику «пустую» форму. Но пустой ее можно назвать условно, т.к. она содержит основные элементы окна Windows: заголовок Form1, кнопки минимализации, максимализации и закрытия окна и кнопку вызова системного меню, поэтому изначально для любого разрабатываемого приложения автоматически предлагается окно формы, для которой уже созданы два файла с описанием и модулем, т.е. файлы *.DFM и *.PAS(окно кода). На этапе проектирования форм программа как бы составляется из готовых компонентов, которые можно добавлять к ней с помощью всего нескольких щелчков мыши. Компоненты обладают наборами свойств, характеризующими их отличительные особенности. Свойства компонент в процессе проектирования формы устанавливаются с помощью Инспектора Объектов. Некоторые свойства компонент, имеющие частое применение: Align – задает тип выравнивания компонента внутри формы (по умолчанию равно alNone); Aligment - определяет выравнивание текста в компоненте. Оно принимает следующие значения: TaLeftJustify – выравнивание по левому краю, TaRightJustify – выравнивание по правому краю. По умолчанию выравнивание происходит по левому краю,TaCenter-выравнивание текста по центру; AutoSize – при значении свойств True будет автоматически изменяться ширина и высота метки в соответствии с размещенным в ней текстом; Caption – заголовок компонента (надпись на компоненте). Могут использоваться русские буквы; Color – цвет фона для формы или компонента. Цвет можно задавать при помощи обозначений, например, зеленый – clGreen, или шестнадцатеричных констант (зеленый $008000); Литвина Е.М. www.maispace.ru\docs.php 3 Enable – если это свойство равно True, то компонент реагирует на действия пользователя (сообщения до щелчка мыши и нажатия клавиатуры), иначе эти сообщения игнорируются; Height – вертикальный размер в пикселях; Hint – задает текст (подсказку), который будет отображаться при нахождении курсора в области компонента; Left – горизонтальная координата левого верхнего угла компонента относительно формы в пикселях. Для формы это значение указывается относительно экрана дисплея; Name – задает имя компонента (идентификатор), которое будет использоваться в программе; ParentColor – если значение этого свойства равно True, то компонент будет отображаться цветом родительского компонента, иначе используется собственное свойство Color; TabOrder – задает порядок получения компонентами на форме фокуса нажатия клавиши Tab. По умолчанию этот порядок определяется последовательностью размещения компонентов на форме. Для изменения этого порядка необходимо явно изменить значения свойства TabOrder компонентов. Следует отметить, что компонент, значение TabOrder которого равно 0, получает фокус при отображении формы. Использование свойства TabOrder зависит от значения свойства TabStop; TabStop – это свойство позволяет указать, может ли компонент получать фокус или нет; Техт – текст, находящийся в поле ввода и редактирования; Top – вертикальная координата левого верхнего угла интерфейсного элемента относительно формы; Transparent – при значении свойства True фон метки будет прозрачным по отношению к другим компонентам; Visible – определяет видимость компонента; Width – горизонтальный размер интерфейсного элемента или формы в пикселях; WordWrap – при значении True после заполнения текущей строки происходит перенос текста на новую строку. По умолчанию имеет значение False. Помимо свойств компоненты содержат методы – программный код, обрабатывающий значение свойств (например, устанавливающий переключатель в нужное положение), а также события – сообщения, которые компонент принимает от приложения, если во время работы программы выполняется определенное действие (например, щелчок мыши на компоненте). Программист может самостоятельно формировать реакции программ на любые события каждого компонента. 3. Создание обработчика событий Командные кнопки на форме предназначены для активизации программ решения определенных задач. Для того, чтобы получить в окне формы результат выполнения программы при активизации командной кнопки в результате щелчка левой клавиши мыши (ЛКМ) необходимо написать соответствующий обработчик событий и включить его в модуль, созданный в окне кода, в разделе implementation. Обработчик событий представляет собой подпрограмму, которая выполняет определенные действия, по решению конкретной задачи и активизируется при щелчке на командной кнопке, расположенной на форме. Эти программы программист пишет на языке Object Pascal, представляющий собой либо Procedure (Процедура), либо Function (Функция). Структура процедуры и функции рассмотрены в учебной литературе [1,2,3,4], Литвина Е.М. www.maispace.ru\docs.php 4 приведенной ниже. Обработчики событий, оформленные в виде процедуры и функции, вставляются в модуль программного приложения в окне кода в разделе implementation после директивы компилятора {SR*.DFM}. Для большинства компонент Delphi имеются события, обработчики которых можно подготовить, используя страницу Events Инспектора объектов. На ней указаны все события, на которые может реагировать выбранный объект. Каждому событию присвоено имя. Например, щелчок кнопки мыши – это событие OnClick, которое для командной кнопки является событием по умолчанию. Надпись на командной кнопке по умолчанию – Button, можно заменить в процессе создания формы конкретного приложения. Целесообразно заменять надписи на кнопке текстом, соответствующим назначению обработчика событий. Например, если надо вычислить сумму чисел, введенных в поля Edit и за кнопкой Button закрепить действия по сложению чисел, то подходящей надписью на кнопке будет название «Сложить». Для создания обработчика событий необходимо, чтобы система Delphi создала шаблон в окне редактора кода. Получить окно кода с шаблоном обработчика событий можно, выполнив щелчок ЛКМ на командной кнопке в окне формы, или в инспекторе объектов активизировать страницу Event , выбрать строку с именем события OnClick и в правой части строки выполнить двойной щелчок ЛКМ. Шаблон обработчика событий представлен на рис. 2. Procedure TForm1.Button1Click ( Sender: TObject) : begin end; Рис. 2. Шаблон обработчика событий. В шаблон обработчика событий программист вставляет строки кода на языке Object Pascal, реализующего алгоритм решения задачи обработки данных. В Delphi имеется несколько компонентов, позволяющих с помощью клавиатуры вводить в программу и редактировать разнообразную символьную информацию. Все они обладают такими возможностями, как выделение, копирование, удаление, вставка фрагментов, скроллинг текста, в том случае, когда он не умещается в окне. Из набора редакторов в первую очередь наибольшее использование имеет однострочный редактор ввода символов класса TEdit и многострочный редактор текста класса TMemo. Редактор кода выделает ключевые слова языка Object Pascal полужирным шрифтом, что облегчает восприятие программ. Помимо ключевых слов редактор кода выделяет, синим курсивом текст комментариев заключенных в фигурные скобки { }, или начало комментария отмечается символом //, за которым пишется текст комментария, расположенный одной в строке. Для всех объектов в обработчике событий должен быть определен тип. Тип в простейшем случае определяет вид конкретно представляемой в памяти информации, например, переменных, констант. Хорошо выбранные типы делают программу более четкой и короткой. Таким образом, каждое имя в программе имеет ассоциированный с ней тип. Этот тип определяет: - структуру программного элемента, то есть ту или иную интерпретацию памяти; - множество допустимых значений; Литвина Е.М. www.maispace.ru\docs.php 5 - совокупность допустимых операций с ним. Задание типа тому или иному элементу в программе необходимо для того, чтобы компилятор мог выделить соответствующую память и установить механизм доступа к самому программному элементу. Для простейших приложений обычно используются простые типы. Простой тип определяет множество значений программного элемента, структура которого представляет собой единственную величину. Простые типы (как и другие типы) часто используются в программе для задания переменных и констант. Переменная есть программный элемент, который может в программе принимать различные значения, в отличие от констант, которые в программе сохраняют постоянные значения. Имеются следующие группы простых типов: • целый; • логический ; • символьный; • перечислимый; • интервальный (диапазон); • вещественный; • дата-время. Среди простых типов перечень и интервальный тип определяются программистом, а остальные встроенные. Первые пять типов образуют группу так называемых порядковых типов. Порядковый тип характеризуется важной отличительной особенностью. Каждое значение порядкового типа (основное) имеет ассоциированное с ним другое значение, представляющее собой порядковый номер: для первого значения - 0, для второго - 1 и т.д. Порядковый номер целого значения равен самому значению. Для порядковых типов существуют встроенные стандартные операции выполнения некоторых действий (табл. 1). Таблица 1. Операция LOW(Т) High(Т) Ord(Х) Pred(Х) Succ(Х) Dec(Х) Inc(Х) Выполняемые действия Минимальное значение типа Т Максимальное значение типа Т Порядковый номер значения X Возвращает предыдущее значение для X Возвращает следующее значение для X Уменьшает X на единицу Увеличивает X на единицу Совместимость и преобразование типов данных. Когда в тех или иных операциях или операторах присутствуют данные различных типов, то возникают вопросы о соответствии типов друг другу. Стандартно выделяют три группы вопросов: •идентичность типов; •совместимость типов; •совместимость по присваиванию. Литвина Е.М. www.maispace.ru\docs.php 6 Идентичность типов. Если при объявлении использовать один и тот же идентификатор или несколько переменных объявляются с помощью одного описания, то такие типы идентичны. Например, Type Int = Integer; Var n : Int; k : Integer; v1, v2 : Array[1..10] of Real;. В данном случае vl и v2 идентичны, n и k идентичны, но если объявлено: Var vl : Array[1..10] of Real; v2 : Array[1..10] of Real;, то vl и v2 не идентичны. Совместимость типов. При программировании необходимо помнить, что на операции с программными элементами компилятор налагает ограничения, разрешая выполнение только заложенных для указанного типа действий. Кроме того, совместимость типов требуется в выражениях, в том числе и в операциях отношения, а также при передаче аргументов функциям или процедурам. Рассмотрим некоторые наиболее распространенные варианты, когда типы считаются совместимыми: • типы идентичны; • один тип представляет тип-диапазон другого; • для объявления используется один и тот же базовый тип; • оба типа - целые типы; • оба типа - вещественные типы; • один тип — строка типа, другой - массив символов с индексацией элементов, начинающейся от нуля. Совместимость по присваиванию. Для корректного выполнения операции присваивания, необходимо выполнение следующих условий: • идентичность типов; • совместимость типов, причем значение типа слева от знака присваивания должно находиться в границах возможных значений типа справа от знака присваивания; • слева от знака присваивания - вещественный тип, а справа – вещественный или целый тип; • слева - строка, кроме типа PChar, справа - любая строка; • слева- строка, кроме типа PChar, справа - символ. Преобразование типов. В ряде случаев требуется преобразование одного типа в другой. Для этого используются или те же идентификаторы, с помощью которых типы объявлялись, или специальные функции или процедуры. Например, поля компонент ввода вывода в интерфейсном окне пользователя такие как: Edit, Memo, Label, StaticText могут содержать только символьные данные. Если в поле ввода компонентов введены цифры, то они воспринимаются как символы и для преобразование их в число при выполнении программы используются специальные функции преобразования, а при Литвина Е.М. www.maispace.ru\docs.php 7 выводе результатов, представленных числами их надо преобразовать в символы, используя стандартные функции преобразования. В таблице 2 приведены стандартные функции преобразования одних типов данных в другие , а так же действия допустимые над ними. При разработке программных приложений программист должен обеспечить удобный пользователю и интерфейс при эксплуатации программы. Для создания удобного интерфейса пользователя необходимо: - предусмотреть в программе контроль ввода допустимых исходных данных или их отсутствия в случае ошибок, допущенных пользователем, и вывести ему окно формы соответствующее сообщение о причине ошибок; - обеспечить автоматическое позиционирование курсора в первый компонент ввода данных пользователя при активизации программного приложения; - обеспечить автоматическое позиционирование курсора при вводе данных пользователя в следующий компонент в окне формы после ввода данных в предыдущий компонент; В текст программного модуля Unit необходимо включать соответствующие обработчики событий, обеспечивающие интерфейс пользователя. Наиболее часто используются стандартные обработчики событий: OneKeyPress и OnActive, OnCreate. 4. Сохранение проекта Проект состоит из набора файлов, используя которые компилятор создает исполняемый файл-программу (Exe. - файл. Проект необходимо сохранить для дальнейшего использования. Чтобы сохранить проект нужно из меню File выбрать команду Save Project As. Если проект еще ни разу не был сохранен, то Delphi сначала предложит сохранить модуль (содержимое окна редактора кода) и на экране появится окно Save Unit As. В этом окне надо выбрать (или создать, если таковой нет на диске) папку предназначенную для файлов проекта и ввести имя модуля, нажав в окне кнопку (сохранить), появляется следующее окно Save Project As, в котором надо ввести имя файла проекта. Имя файлов модуля (pas-файл) и проекта (DPR- файл) должны быть разными. Имя генерируемое компилятором исполняемого файла, совпадает с именем проекта. Поэтому файлу проекта следует присвоить такое имя, которое должен иметь исполняемый файл программы, а файлу модуля – какое-либо другое имя, полученное путем добавления к имени файла проекта порядкового номера модуля. Литвина Е.М. www.maispace.ru\docs.php 8 Таблица 2. Типы данных и возможные действия над ними. Тип данных Допустимые значения Символьный Так как все допустимые символы CHAR пронумерованы, то к ним применимы все операции отношения: = <>>= <<= . Результат - логический тип True или False. Строковый Операция сцепления: обозначение +. STRING Операции отношения: = <> > > = < < = . Результат - логический тип True или False. Числа целые Byte (1 байт), Short (1 байт), Word (2 байт), Integer (2 байт), Longint (4 байт) Числа вещественные Real (6 байт), Double (8 байт), Extended (10 байт) 1. Арифметические операции: Ц+Ц=Ц, Ц-Ц=Ц, Ц*Ц=Ц, Ц/Ц=ВЕЩЕСТВЕННОЕ, результат SQRT (Ц) – вещественный. 2. Функции преобразования вещественных чисел дают целочисленный результат: ROUND (ВЕЩ.), TRUNG (ВЕЩ.). 3. Операции отношения = <> > > = < <= дают результат логического типа True или False 1. Все арифметические операции +- * /. 2. Операции отношения = <> > > = < <= дают результат логического типа True или False. 3. Функции преобразования вещественных чисел ROUND (ВЕЩ.), TRUNC (ВЕЩ.) в целое число. Стандартные функции UPCASE (‘h’), ORD (‘H’), CHR (71), PRED (‘H’), SUCC (‘H’) LENGTH (St :String), POS (SubSt, St : String), UpperCase (const S: string) : String, Copy (St : String ; Index, Count : Integer), AnsiUpperCase () – для русского текста TRIM (S : String) Тригонометрические и математические функции, ABS (X), CHR (X), ODD (X), Random (n), SQR (X), SQRT (X), ORD (X), PRED (X), SUCC (X), LN (X), DIV, MOD Тригонометрические и математические функции, ABS (X), Random (n), SQR (X), SQRT (X), LN (X), Frac (x) – дробная часть числа, Int (x) – целая часть числа, Pi – число π = 3,141592653… Преобразование строк в Delphi: Тип числа Целое число Действительное число Строка в число – для ввода из компонента в переменную, объявленную как число StrToInt (St : String); : Integer, StrToFloat (St : String); : Extended Литвина Е.М. www.maispace.ru\docs.php Число в строку – для вывода чисел в окно компонента IntToStr (X: Integer); : String FloatToStr (X: Extended); : String FloatToStrF (аргументы по формату); : String 9 5. Компиляция программы Созданный модуль приложения надо сначала откомпилировать. Компиляция – это процесс преобразования исходной программы в исполняемую. Процесс компиляции стоит из двух этапов. На первом этапе выполняется проверка текста программы на отсутствие ошибок, на втором – генерируется исполняемая программа. Компиляция программы выполняется командой Project - Compile Project (проект – компилировать проект) или нажатием комбинации клавиш CTRL+F9. При этом на экране появляется диалоговое окно, в котором отображаются: - название главного файла проекта в cтроке Project (проект); - имя компилируемого файла; - номер текущей строки компилируемого исходного текста – в строке Current Line (текущая строка); - общее число строк с учетом других откомпилированных модулей в строке Total Liens (всего строк); - число советов генерируемых компилятором для подсказки разработчику о некорректных местах в исходном тексте в строке Hints (подсказки). Например, когда переменная перед ее первым использованием не имеет значения; - число предупреждений в строке Warning (предупреждения), выдаваемых компилятором при обнаружении мест в программе, которые могут служить потенциальным источником ошибок; - число ошибок Errors (ошибка), возникающих, когда компилятор не может определить, что означает некоторая строка исходного текста – в строке Errors (ошибка). Если в процессе компиляции встретились подсказки и предупреждения, работоспособная программа все равно будет создана. При обнаружении в программе неточностей, которые не являются ошибками, компилятор выводит подсказки (Hints) и предупреждения (Warnings). Например, наиболее часто вводимой подсказкой является сообщение об объявленной, но не используемой переменной: Variable…is declared but never user in… При наличии ошибок выдается сообщение: Done: are the errors (готово: найдены ошибки). Если есть ошибки в тексте программы, компилятор прерывает свою работу и в окне кода появляется сообщение, а строка кода, где обнаружена ошибка, выделяется цветом. Чтобы перейти к фрагменту кода, который содержит ошибку надо установить курсор в строку сообщения об ошибке и из контекстного меню выбрать команду Edit Source. Процесс устранения ошибок носит итерационный характер. После очередного внесения изменений в текст программы выполняется повторная компиляция. Следует учитывать тот факт, что компилятор не всегда может точно локализовать ошибку. Поэтому, анализируя фрагмент программы, который, по мнению компилятора, содержит ошибку, нужно обращать внимание не только на тот фрагмент кода, на который компилятор установил курсор, но и на тот, который находится в предыдущей строке. Если в программе нет синтаксических ошибок, компилятор создает исполняемый файл программы. Delphi помещает его в тот же каталог, где находится файл проекта. Литвина Е.М. www.maispace.ru\docs.php 10 6. Запуск программы Пробный запуск программы можно выполнить непосредственно из среды Delphi не завершая работу со средой разработки. Для этого нужно из меню Run выполнить команду Run (запуск-запуск), или нажать клавишу F9, или щелкнуть на командной кнопке панели инструментов Run (запуск). 7. Ошибки времени выполнения Во время выполнения работы могут возникать ошибки, которые называются ошибками времени выполнения (run-time errors) или исключениями(exeception). В большинстве случаев причинами исключений являются неверные исходные данные. Если программа запущена из среды разработки, то при возникновении исключения программа приостанавливается и на экране появляется окно с сообщением об ошибке и ее типе. При разработке программы программист должен постараться предусмотреть все возможные варианты некорректных действий пользователя, которые могут привести к возникновению ошибок времени выполнения, и обеспечить способы защиты от них. Ошибки времени выполнения могут возникнуть по разным причинам. Может возникнуть исключительная ситуация (например, деление на 0), может быть ошибка в неточности алгоритма, ошибка в исходных данных и т.п. Эти ошибки надо проанализировать. Найти ошибки и исправить. После исправления запустить программу на выполнение. Технология создания программного приложения иллюстрируется на примере решения задачи «Вычислений по формуле». Задание: Вычислить значений х и у по следующим формулам: b x a b* ; y=(a-b)*x, где a, b, x, y – переменные целого типа. a Технология создания программного приложения 1. Создадим папку для проекта. Запустим программу Delphi. 2. Откроем новое приложение с помощью команды главного меню File\New Application. 3. На пустой форме разместим следующие компоненты (см. рис.3): Panel1, Panel2, Label1, StaticText1, StaticText2, Memo1, Memo2, Button1, Button2, BitBtn1, Edit1, Edit2. Литвина Е.М. www.maispace.ru\docs.php 11 Рис.3 Вид формы примера задачи расчета по формулам. 4. Свойству Caption метки Label1 зададим значение: «Введите исходные данные – значения А и В». Для того чтобы текст располагался в двух строках и был выровнен по центру, необходимо установить следующие значения свойств: Свойство Значение AutoSize False WordWrap True Alignment TaCenter Размеры метки и ее расположение отрегулировать вручную. Для выбора размера шрифта используем свойство Font. 5. Для компонентов StaticText1 и StaticText2 установим в свойстве BorderStyle значение sbsSunken, получим эффект вдавленности рамки компонента. Свойству Caption установим значение, равным «Значение А» и «Значение В» соответственно. 6. Очищаем поля ввода для исходных данных Edit1 и Edit2. Для правильной работы программы строка символов должна содержать только целые числа. 7. Компонент Мemo1 используется для вывода результатов вычислений. Компонент Мemo2 используется для записи строк текста, содержащих инструкцию пользователю по работе с компонентами формы. Текст инструкции в поле компонента Мemo2 приведен на рис.3. Для компонента Memo выберем свойство Lines и щелкнем на кнопке … В появившемся окне String List Editor удалим строку Memo1 и Memo2 соответственно. Затем в поле Memo2 введем строки инструкции. 8. Для компонента Panel установим значение свойства Caption: «Вычислить х=a+b*b/а; y=(a-b)*x». Для расположения компонента в верхней части формы и изменения цвета поля, размера шрифта и цвета шрифта установим значения следующих свойств: Литвина Е.М. www.maispace.ru\docs.php 12 Align alTop Color clBlue Font size=14 Color=clYellow 9. Для компонента Panel2 установим свойство Align равным alBottom для расположения панели в нижней части формы 10. Поместим три кнопки Button1, Button2 и BitBtn1 на панель Panel2. Кнопкам Button1 и Button2 установим свойство Caption равным «Вычислить» и «Очистить» соответственно. Для кнопки завершения работы приложения BitBtn1 установим свойство Kind, со стандартным названием Close и рисунком. 11. Двойным щелчком активизируем кнопку «Вычислить» и в окне кода появится шаблон обработчика события, в который запишем следующие строки кода. {Обработчик событий вычисления значений x и y, активизируется при нажатии кнопки «Вычислить» } Procedure TForm1.Button1Click (Sender: TObject); Var а, b: integer; // исходные данные x, y: integer; // результаты вычислений begin If (Edit1.Text=’’) or (Edit2.Text=’’) then begin showmessage (‘Введите данные’); Edit1.SetFocus; end else begin {Формирование числовых значений a и b} a:=StrToInt (Edit1.Text); b:= StrToInt (Edit2.Text); {Вычисление значений x и y} If (a<>0) then begin x:=a+b*b div a; // div – целочисленное деление y:=(a-b)*x; // Вывод результатов вычислений Memo1.Lines.Add(‘Результаты вычислений’); Memo1.Lines.Add(‘x=’+IntToStr(x)); Memo1.Lines.Add(‘y=’+ IntToStr(y)); end else begin Showmessage (‘деление на ноль!’); Edit1.SetFocus; Exit; end; end; end; Литвина Е.М. www.maispace.ru\docs.php 13 12. Вернемся на форму, нажав функциональную клавишу F12. Двойным щелчком активизируем кнопку «Очистить» и в обработчик событий OnClick вставим строку: Memo1.Clear; Edit1.Clear; Edit2.Clear; Edit1.SetFocus; 13. Для автоматического перевода курсора из Edit1 в Edit2 после ввода в Edit1 символов и нажатия клавиши Enter создадим обработчик события OnKeyPress для компонента Edit1: выделяем компонент Edit1, в Инспекторе Объектов на странице «События» справа от события OnKeyPress выполняем двойной щелчок ЛКМ. Получив в окне кода шаблон обработчика события OnKeyPress, вставим в него необходимые строки кода. {Обработчик события контроля ввода значения данных в Edit1} Procedure TFrom1.Edit1KeyPress (Sender: TObject; var Key: Char); begin {Проверка значения параметра Key, соответствующего нажатой клавиши} case Key of ‘0’..’9’: ; // цифра #8 : ; // клавиша Backspace #13 : Edit2.SetFocus; // клавиша Enter ‘-‘ : ; // разрешается ввод знака минус ‘,’ : ; // разрешается ввод вещественных чисел else begin Key:= Chr(0); Showmessage (‘Нужно вводить только целые числа’); end; end; end; Для контроля ввода данных в поле Edit2 и автоматического перевода курсора из Edit2 после нажатия кнопки Enter на кнопку «Вычислить» создадим обработчик события OnKeyPress. {Обработчик событий контроля ввода значения данных в Edit2 } Procedure Tform1.Edit2KeyPress(Sender: TObject; var Key: Char); begin case Key of ‘0’..‘9’: ; #8 : ; #13 : Button1.SetFocus; ‘-‘ : ; // разрешается ввод знака минус ‘,’ : ; // разрешается ввод вещественных чисел else begin Key:=Chr(0); Showmessage (‘Введены нецелые значения ’); end; end; end; Процедура заменяет недопустимый символ на символ с кодом 0, в результате чего этот символ в поле редактирования не появляется. Литвина Е.М. www.maispace.ru\docs.php 14 Для автоматического позиционирования курсора в первый компонент Edit1, предназначенный для ввода данных пользователем, создадим обработчик событий OnActivate. {Позиционирование курсора в поле компонента Edit1 при активизации формы } procedure TForm1.FormActivate (Sender: TObject) begin Edit1.SetFocus end; end. 14. Все компоненты формы, включая и название самой формы Form1, получили свои названия на этапе конструирования формы с использованием свойств компонентов, устанавливаемых в Инспекторе Объектов, т.е. сформированных статически. В Delphi можно изменять надписи на компонентах на этапе выполнения программы, т.е. динамически. Для этого необходимо создать обработчик события OnCreate, который возникает после создания Windows-окна, но до появления окна на экране. Создадим обработчик события OnCreate для вывода следующего текста в строке заголовка формы: «Задание 1. Вычисление по формуле.» Для создания обработчика события OnCreate необходимо выделить объект Form1. Далее используя страницу событий инспектора объектов, получтиь в окне кода шаблон обработчика событий OnCreate, где между begin и end записать строку кода, имеющего название формы. Procedure TFrom1.FormCreate (Sender: TObgect); begin Form1.Caption:= ‘Задание1. Вычисления по формулам’; end; 15. Сохраним проект в папке и запустим на выполнение. Для вычисления значений функции X и Y введем значения А и В в поля Edit1 и Edit2 соответственно и щелкнем на кнопке «Вычислить». Для очистки полей ввода – вывода перед повторением вычислений щелкнем на кнопке «Очистить», а для завершения работы приложения щелкнем на кнопке «Close». Запустить приложение на выполнение можно одним из следующих способов: команда Выполнить (Run) из пункта меню Выполнить (Run); пиктограмма «Выполнить» на панели инструментов; клавишей F9. Форма с исходными данными и результатами вычислений представлена на рис. 4.(а) Литвина Е.М. www.maispace.ru\docs.php 15 Рис. 4.(а). Форма с исходными данными и результатами вычислений Вывод сообщений об ошибках ввода исходных данных a и b и контролю операций деления на ноль приведён на рис. 4.(б). Рис. 4(б) . Вывод сообщений об ошибках. В рассмотренном выше примере тексты кодов на языке Object Pascal в обработчиках событий записаны в соответствии с правилами хорошего стиля оформления программ Стиль программирования Стиль программирования - набор правил, которым следует программист в процессе своей работы. Очевидно, что хороший программист должен следовать правилам хорошего стиля. Хороший стиль программирования предполагает: использование комментариев; использование несущих смысловую нагрузку имен переменных, процедур и функций; использование отступов; использование пустых строк. Оформление текста кода программы должно быть выполнено в соответствии с хорошим стилем оформления программ, обеспечивающим их читабельность и удобство эксплуатацию. Удобочитабельность программ обеспечивают: комментарии, использование пустых строк для разрядки текста программ, составление мнемонических имен объектов программы, структурные сдвиги при написании определенных конструкций языка Object Pascal. Литвина Е.М. www.maispace.ru\docs.php 16 Каждая программа должна начинаться с комментария, содержащего имя, фамилию программиста, назначение программы , дату создания. Каждая подпрограмма должна начинаться с комментария, кратко описывающей ее назначения. Комментарии должны описывать, что делает код, а не как он это делает, если назначение оператора, или группы операторов трудно понять из исходного кода, то код должен быть снабжен кратким комментарием. Однако описывать отдельные операторы, смысл которых очевиден, не следует. Комментарии в Object Pascal бывают двух типов: многострочные и однострочные. Многострочные комментарии заключатся в фигурные скобки { }. Однострочные комментарий начинается с пары символов //. Если комментарий ограничивается символами {$...}, такой комментарий считается директивой компилятора. Комментарий игнорируется компилятором и не оказывает никакого влияния на выполнение программы. Наглядность текста программы можно обеспечить с помощью следующих приемов: пропуск строк используется для вертикальной разрядки текста, что позволяет отделить одну группу логически связанных операторов от другой; пробелы обеспечивают улучшение читабельности программ за счет горизонтальной разрядки текста. Пробелы рекомендуют ставить между элементами списка данных, а также до и после операций + , - и т.д. ; имена объектов программы по возможности должны быть мнемоческими. Например, оператор x := y * z , вычисляющий стоимость партии товара (x) как произведение количества товара (y) на цену (z), целесообразнее записать в следующем виде: Stoim : = Kol * Cena; отступы, т.е. число позиций в тексте программы, на которое сдвигается запись одной конструкции языка Object Pascal относительно другой, являющейся вложенной во внешнюю конструкцию, позволяют наглядно отображать структуру программы и могут существенно облегчить ее понимание. В программе один оператор отделяется от другого точкой с запитой. Хотя в одной строке программы можно записать несколько операторов, как правило, каждый оператор программы записывается в отдельной строке. Некоторые инструкции (if, case, repeat, while и др.) принято записывать в несколько строк, используя для выделения структуры оператора отступы. В условном операторе if следует обратить вынимание на то что слова then и else должны быть записаны один под другим с одинаковым отступом и с отступом относительно слова if. В составном операторе слово end располагается под словом begin, а операторы между begin и end размещаются один под другим, но с отступом относительно begin. В операторе case слова case, else и end записываются одно под другим, операторы внутри между словами case и else, а так же между else и end записывается с одинаковыми отступами относительно слова case. В циклических операторах операторы тела цикла записываются с отступом относительно заголовка циклического оператора. По два пробела необходимо добавлять так же при каждом увеличении уровня вложенности в блоке циклов и условных операторов. Пример хорошего стиля написания строк, когда на языке Object Pascal продемонстрирован на фрагменте программы кода вычисления среднеарифметических значений элементов строк матрицы А, содержащее m строк и n столбцов, c подсчетом количества отрицательных сумм и номеров строк, где они расположены, и положительных сумм и номеров строк, где они расположены. Литвина Е.М. www.maispace.ru\docs.php 17 kolotr := 0 ; // количество отрицательных значений среднеарифметических значений kolpol := 0 ; // количество положительных значений среднеарифметических значений r := 0; k := 0 ; for i := 1 to m do begin s [i] := 0 ; // сумма значений элементов матрицы i-ой строки for j := 1 to n do s[i] := s[i] + A[i,j]; s[i] := s[i] / n ; // среднеарифметическое по i-ой строке if s[i] < 0 then begin r := r+1; kolotr := kolotr + 1; nomotr[r] := i ; {номер строки с отрицательным среднеарифметическим} end else begin k := k+1; kolpol := kolpol + 1 ; nompol[l] :=i ; {номер строки с положительным cреденеарифмтическим} end ; end; Следование правилам хорошего стиля программирования значительно уменьшает вероятность появления ошибок на этапе набора текста, делает программу легко читаемой, что в свою очередь облегчает процессы отладки и внесения изменений. Учебная литература. 1. Фаронов В.В. DELPHI. Программирование на языке высокого уровня. Учебник для ВУЗов. С.-П, 2010. 2. Афанасьева О.А., Дегтярев А.В., Зиновьева Е.А., Литвина Е.М., Шаталова Л.М. Информатика. Учебное пособие для студентов высших учебных заведений. М., Изд-во «Доброе слово», 2010. 3. Литвина Е.М., Шаталова Л.М. Введение в среду Delphi. Учебное пособие. – М.: Изд-во МАИ, 2004. 4. Литвина Е.М., Шаталова Л.М., Зиновьева Е.А. Разработка программных приложений в Delphi. Учебное пособие для лабораторных работ, под редакцией Дегтярева А.В., М.: Издво МАИ, 2006. Литвина Е.М. www.maispace.ru\docs.php 18