Смекни!
smekni.com

Разработка простого приложения Delphi

ЛАБОРАТОРНАЯ РАБОТА №1 Разработка простого приложения Delphi1. Цель работы Ознакомление со средой визуального программирования Delphi и разра- ботка в ней простейших приложений. 2. Домашнее задание Изучить разделы конспекта лекций, описывающие среду визуаль- ного программирования и палитру компонентов Standard. Ознакомиться с описанием и заданием на лабораторную работу. Разработать (на бумаге) внешний вид экранной формы. 3. Основные понятия и приемы 3.1.Работа с формами Проектирование форм – ядро визуальной разработки в среде Del-phi. Каждый помещаемый в форму компонент или любое задаваемое свой-ство сохраняется в файле, описывающем форму (DFM-файл), а также оказы-вает некоторое влияние на исходный текст, связанный с формой (PAS-файл). Можно начать новый пустой проект, создав пустую форму, илиначать с существующей формы (используя различные доступные шаблоны),или добавить в проект новые формы. Проект (приложение) может иметьлюбое число форм. При работе с формой можно обрабатывать свойства самой формы,свойства одного из ее компонентов или нескольких компонентов одновре-менно. Чтобы выбрать форму или компонент, можно просто щелкнуть понему мышью или воспользоваться Object Selector ( комбинированный спи-сок в Object Inspector), где всегда отображены имя и тип выбранного эле-мента. Для выбора нескольких компонентов можно нажать клавишу Shift ищелкать по компонентам левой кнопкой мыши. SpeedMenu формы содержит ряд полезных команд. Для измене-ния относительного расположения компонентов одного вида можно исполь-зовать команды Bring to Front и Send To Back. Командой Revert To Inheritedможно воспользоваться, чтобы в унаследованной форме установить те зна-чения свойств выбранного компонента, которые были у них в родительскойформе. При выборе сразу нескольких компонентов вы можете выровнять ихили изменить их размеры. С помощью SpeedMenu можно также открыть два диалоговых ок-на, в которых устанавливается порядок обхода визуальных управляющихэлементов и порядок создания невизуальных управляющих элементов. Ко-манда Add To Repository добавляет текущую форму в список форм, доступ- 3 ных для использования в других проектах. Для установки положения компонента, кроме применения мыши, имеются еще два способа:♦ Установка значений для свойств Top и Left.♦ Использование клавиш курсора при нажатой клавише Ctrl. Метод Ctrl+клавиша курсора особенно удобен при тонкой под- стройке положения элемента. Точно так же, нажимая клавиши курсора при нажатой клавише Shift, можно подстроить размер компонента. 3.2. Палитра компонентов Чтобы добавить в текущую форму новый компонент, нужно вы-брать его на одной из страниц палитры Components, щелкнув по нему мы-шью, а затем, чтобы разместить новый элемент, щелкнуть в форме. Причемв форме можно или буксировать мышь с нажатой левой кнопкой, чтобы ус-тановить сразу и размер, и положение компонента, или просто щелкнутьодин раз, позволяя Delphi установить размер по умолчанию. Каждая страница палитры содержит ряд компонентов, которыеобозначены пиктограммами и именами, появляющимися в виде подсказки.Эти имена являются официальными названиями компонентов. В действи-тельности это названия классов, описывающих компоненты без первой бук-вы T (например, если класс называется Tbutton, имя будет Button). Если не-обходимо поместить в форму несколько компонентов одного и того же вида,то при выборе компонента щелчком в палитре удерживайте нажатой клави-шу Shift. Затем при каждом щелчке в форме Delphi будет вставлять новыйкомпонент выбранного вида.Чтобы остановить эту операцию, просто щелк-ните по стандартному селектору (пиктограмма стрелки) слева от палитрыComponents. 3.3. Object Inspector Object Inspector используется при проектировании формы для ус-тановки свойств компонента (или самой формы). В его окне в двух колонкахизменяемого размера перечислены свойства (или события) выбранного эле-мента и их значения. Окно Object Selector в верхней части Object Inspectorуказывает текущий компонент и его тип данных, и этот селектор можно ис-пользовать для изменения текущего выбора. В Object Inspector перечислены не все свойства компонентов, атолько те, что могут быть установлены на этапе проектирования. Правая ко-лонка Object Inspector разрешает правильное редактирование в соответствиис типом данных свойства. В зависимости от свойства можно вставить строкуили число, выбрать из списка опций (на эту возможность указывает стрелка)или вызвать специальный редактор (об этом говорит овальная кнопка). Длянекоторых свойств, таких как Color, разрешен и ввод значения, и выбор эле-мента из списка, и вызов специального редактора. 4 3.4. Написание кода При проектировании формы в Delphi обычно приходится писатькое-какой код для отклика на некоторые из ее событий. Когда вы нажимаетекнопку мыши в форме или на компоненте, Windows посылает вашему при-ложению сообщение, информируя его об этом событии. Реакция Delphi со-стоит в получении сообщения о событии и вызове соответствующего методаотклика на событие. Для каждого вида компонентов Delphi определяет рядразличных событий. Вы можете узнать о событиях, доступных для формыили компонента, рассматривая страницу Events окна Object Inspector в тотмомент, когда выбран необходимый элемент. Вставим в форму компонент – кнопку – и заставим его откликать-ся на событие, связанное с нажатием левой кнопки мыши. При щелчке покнопке мышью в работающей программе возникает событие OnClick (Пощелчку). Пока это событие никак не обрабатывается программой, и поэтомунажатие кнопки не приведет ни к каким последствиям. Чтобы заставить про-грамму реагировать на нажатие кнопки, необходимо написать на языке Ob-ject Pascal фрагмент программы, который называется обработчиком собы-тия. Фрагмент оформляется в виде специальной подпрограммы – процеду-ры. Чтобы заставить Delphi самостоятельно сделать заготовку дляпроцедуры обработчика события OnClick, дважды щелкните мышью повновь вставленному компонету. В ответ Delphi активизирует окно кода и выувидите в нем такой текстовый фрагмент: procedure TForm1.Button1Click(Sender: Tobject); begin end; Слово procedure извещает компилятор о начале подпрограммы – процедуры. За ним следует имя процедуры TForm1.Button1Click. Это имя – составное: оно состоит из имени класса TForm1 и собственно имени проце- дуры Button1Click. Каждый компонент принадлежит к строго определенному классу, авсе конкретные экземпляры компонентов, вставляемые в форму, получаютимя класса с добавленным числовым индексом. По используемому в Delphiсоглашению все имена классов начинаются с буквы Т. Таким образом, имяTForm1 означает имя класса с добавленным числовым индексом. По исполь-зуемому в Delphi соглашению все имена классов начинаются с буквы Т. Та-ким образом, имя TForm1 означает имя класса, созданного по образцу стан-дартного класса Tform. Если вы посмотрите начало текста в окне кода, тоувидите следующие строки: 5 type TForm1 = class(TForm) Button1: Tbutton; procedure TForm1.Button1Click(Sender: Tobject); private {private declarations} public {public declaration} end; var Form1: TForm1; Строка TForm1 = class(TForm) определяет новый класс TForm1, ко-торый порожден от стандартного класса TForm. Стандартный класс TFormописывает пустое Windows-окно, в то время как класс TForm1 описываетокно с уже вставленным в него компонентом кнопка.. Каждый раз, когда вы работаете над событием, Delphi открывает редактор с исходным файлом, связанным с формой. Редактор позволяет ра- ботать над несколькими файлами исходного текста одновременно, исполь- зуя образ “записной книжки с ярлычками”. Каждая страница записной книжки соответствует отдельному файлу. 3.5. Компиляция проекта Компиляция проекта происходит при запуске его на выполнение.Транслируя проект, Delphi компилирует только те файлы, которые изменя-лись. Но если вы выберите в меню Project команду Build All, то будет от-компилирован каждый файл, даже если он не изменялся. Проект содержит список файлов исходного кода, которые являют-ся частями проекта, а также соответствующих им форм (при наличии тако-вых). Сначала каждый файл исходного кода превращается в откомпилиро-ванный модуль Delphi – файл с тем же именем, что и у исходного файла наязыке Паскаль, но с расширением DCU. Во время компиляции и компоновки самого проекта откомпили-рованные модули, составляющие проект, сливаются (или связываются) другс другом и с кодом библиотеки VCL, образуя исполнимый файл. 3.6. Интегрированный отладчик В Delphi имеется встроенный отладчик, обладающий огромнымколичеством возможностей. При каждом запуске из среды Delphi программауже выполняется в отладчике. Для установки точки останова или щелкнитев промежутке между левой рамкой окна редактирования и текстом, или вы-берите в SpeedMenu команду Toggle Breakpoint, или нажмите клавишу F5. 6 Когда вы разместили ряд точек останова, можете использовать командуBreakpoints меню View, чтобы открыть окно Breakpoints List. Один из пунк-тов в верхней части окна Breakpoints List предполагает добавление условия вточке останова так, чтобы программа выполнялась только при выполненииданного условия. Кнопка Step Over на линейке SpeedBar позволяет просмот-реть выполнение операторов один за другим, а кнопка Trace Into позволяеттрассировать вызываемые методы (т.е. выполнять шаг за шагом код подпро-грамм). Если программа остановлена в отладчике, вы можете проверитьзначение любого идентификатора (для переменных, объектов, компонентов,свойств и т.д.), который доступен в этой точке программы. Для этого суще-ствуют два способа: использовать диалоговую панель Evaluate/Modify илидобавить элемент в окно Watch List. Самый простой способ открыть диало-говую панель Evaluate/Modify – выделить переменную в редакторе исходно-го текста, а затем выбрать команду Evaluate/Modify из SpeedMenu редактора.Вы можете устанавливать элементы наблюдения, используя команду AddWath at Cursor в Speed Menu редактора. 3.6. Обращение к справочной системе Help Для вызова справочной системы необходимо выбрать соответст-вующую команду в выпадающем меню Help или отметить элемент интер-фейса в исходном тексте и нажать клавишу F1. При нажатии кнопки “Раз-делы” в окне Help появляется диалоговое окно справочной системы Win-dows 95, которое позволяет вам просмотреть содержание всех файлов Helpгруппы, отыскать ключевое слово по индексу или начать процесс поиска. 3.7. Меню и команды Delphi Чтобы выдать команду в среде Delphi, можно воспользоваться тремя основными способами:♦ С помощью меню.♦ С помощью полоски SpeedBar (инструментальной линейки).♦ С помощью SpeedMenu (одного из локальных меню, которое активизи- руется при нажатии правой кнопки мыши). Меню File Команды выпадающего меню File можно использовать для работы как с проектами, так и с файлами исходного кода. К командам, работающим с проектами, относятся New, New Ap- plication, Open, Reopen, Save Project As, Save All, Close All, Add to Project и Remove from Project. С файлами исходного кода работают команды New, New Form, New Data Module, Open, Reopen, Save As, Save, Close и Print. Ос- новной командой является File/New, которую можно использовать для вызо- ва экспертов, для начала работы с новым приложением, для наследования формы из уже существующей и т.д. Чтобы открыть проект или файл исход- 7 ного кода, с которыми вы работали последний раз, используйте командуFile/Reopen. Меню Edit Стандартные возможности меню Edit применимы как к тексту, таки к компонентам формы. Можно копировать и вставлять тот или иной текств редакторе, копировать и вставлять компоненты в одной форме или из од-ной формы в другую. Также можно копировать и вставлять компоненты вдругое групповое окно той же формы, например, в панель или блок группы;копировать компоненты из формы в редактор, и наоборот. Delphi помещаеткомпоненты в буфер обмена, преобразуя их в текстовое описание. Можносоответствующим образом отредактировать этот текст, а затем вставить егообратно в форму в виде нового компонента. Можно выбрать несколькокомпонентов и скопировать их как в другую форму, так и в текстовый ре-дактор. Это может пригодиться, когда вам придется работать с рядом схо-жих компонентов. Вы сможете скопировать один компонент в редактор,размножить его нужное число раз, а затем вставить назад в форму целуюгруппу. Меню Search Если вы выберете команду Incremental Search, то вместо того что-бы показать диалоговое окно, где вводится образец для поиска, Delphi пере-ходит в редактор. Когда вы введете первую букву, редактор перейдет к пер-вому слову, которое начинается с этой буквы. Продолжайте набор букв и,курсор будет последовательно переходить к словам, в начале которых будутстоять введенные символы. Эта команда очень эффективна и чрезвычайнобыстра. Команда Browse Symbol вызывает Object Browser – инструмент, ко-торый можно использовать для просмотра многих деталей при исследованииоткомпилированной программы. Меню View Большинство команд меню View применяются для отображениякакого-либо окна среды Delphi, например Project Manager, Breakpoints Listили Components List. Эти окна не связаны друг с другом. Команда ToggleForm/Unit используется для перехода от формы, над которой вы работаете кее исходному коду, и обратно. Команда New edit window создает дубликатокна редактирования и его содержимого. В Delphi это единственный способпросмотреть два файла рядом друг с другом, поскольку редактор для показанескольких загруженных файлов использует ярлычки. После дублированияокна редактирования могут содержать разные файлы. Последние две коман-ды меню View можно использовать для удаления с экрана полоски SpeedBarи палитры Components, хотя при этом среда Delphi становится менее удоб-ной для пользователя. Команда Build All заставляет Delphi откомпилироватькаждый исходный файл проекта, даже если после последней трансляции онне был изменен. Для проверки написанного кода без создания программы 8 можно использовать команду Syntax Check. Команда Information дает неко-торые подробности о последней выполненной вами трансляции. КомандаOptions применяется для установки опций проекта: опций компилятора иредактора связей, опций объекта приложения и т.д. Меню Run Меню Run можно было бы назвать Debug (отладка). Большинствокоманд в нем относится к отладке, включая саму команду Run. Программа,запускаемая внутри среды Delphi, выполняется в ее интегрированном отлад-чике (если не отключена соответствующая опция). Для быстрого запускаприложения используется клавиша F9. Остальные команды применяются впроцессе отладки для пошагового выполнения программы, установки точекпрерывания, просмотра значений переменных и объектов, и т.п. Меню Component Команды меню Component можно использовать для написаниякомпонентов, добавления их в библиотеку, а также для конфигурированиябиблиотеки или палитры компонентов. Меню Tools Меню Tools содержит список нескольких внешних программ и ин-струментальных средств. Команда Tools позволяет сконфигурировать этовыпадающее меню и добавить в него новые внешние средства. Меню Toolsтакже включает команду для настройки репозитория и команду Options, ко-торая конфигурирует всю среду разработки Delphi. 3.8. Полоска кнопок быстрого доступа SpeedBar Наиболее часто используемые команды Delphi имеются в инстру-ментальной линейке SpeedBar. Изменить размеры SpeedBar можно, букси-руя толстую линию между ней и палитрой Сcomponents. Другие разрешен-ные в SpeedBar операции добавляют, удаляют или заменяют пиктограммы спомощью команды Configure собственного локального меню SpeedBar. Этаоперация вызывает инструмент SpeedBar Editor. Чтобы добавить пикто-грамму в SpeedBar, необходимо найти ее в нужной категории и отбуксиро-вать в полоску. Подобным образом можно отбуксировать пиктограмму запределы SpeedBar или просто передвинуть ее в другое место. 3.9. Локальные меню SpeedMenu Хотя меню Delphi содержит большое количество элементов, не всекоманды доступны через выпадающие меню. Иногда для некоторых оконили областей окна приходится использовать SpeedMenu (локальное меню).Чтобы активизировать SpeedMenu, нужно нажать над необходимым элемен-том интерфейса пользователя правую кнопку мыши или клавиши Alt и F10. 3.10. Файлы, создаваемые системой Когда вы сохраняете новый проект, Delphi создает ряд файлов. 9 Здесь приводится список наиболее важных файлов.♦ Основной файл проекта типа .DPR. Это основной модуль исходного тек- ста проекта. Имеется только один DPR-файл для каждого проекта. Этот файл, кроме всего прочего, перечисляет имена других файлов, состав- ляющих проект.♦ Файлы формы типа .DFM. Это двоичные файлы ресурсов, содержащие определение визуальных форм. В проекте может быть много форм и ка- ждая имеет собственный .DFM файл.♦ Файл модуля Паскаля типа .PAS. Содержит код Object Pascal для соот- ветствующей формы или для автономного модуля кода.♦ Файл опций проекта типа .OPT. Файл, который содержит различные ус- тановки Delphi (текстовый файл).♦ Откомпилированные файлы модуля типа .DCU. Содержат объектный код существующего .PAS-файла модуля.♦ Откомпилированные программные файлы типа .EXE. Это собственно программы Windows.♦ Откомпилированные файлы динамических библиотек типа .DLL. Это откомпилированные модули Windows, которые могут использоваться одновременно многими программами Windows. 3.11. Страницы репозитория объектов В Delphi есть несколько команд меню, с помощью которых вы можете создать новую форму, новое приложение, новый модуль данных, новый компонент и т.п. Эти команды находятся в меню File, а также в дру- гих выпадающих меню. Но если вместо них выдать команду File/New, Del- phi откроет окно Object Repository. Репозиторий используется для создания новых элементов любого вида: форм, приложений, модулей данных, библиотек, компонентов и т.д. Диалоговое окно Object Repository содержит несколько страниц:♦ Страница New позволяет создавать новые элементы многих разных ти- пов.♦ Страница текущего проекта (в действительности на ярлычке данной страницы вы увидите имя проекта, например Project1) позволяет унасле- довать форму или модуль данных от аналогичного объекта, включенного в ваш текущий проект.♦ Страницы Forms, Dialogs , Data Modules позволяют создавать новые формы, диалоговые панели и модули данных, используя эксперты или существующие объекты этих типов.♦ Страница Project позволяет скопировать файлы из хранящегося в репози- тории проекта. В нижней части диалогового окна Object Repository находятся три радиокнопки, с помощью которых можно указать: хотите ли вы скопировать 10 существующий элемент, унаследовать его или применить непосредственно, не копируя. Страница New Список элементов, которые можно создать с помощью этой стра- ницы:♦ Application создает новый пустой проект.♦ Data Module создает новый пустой модуль данных.♦ DLL создает новую библиотеку DLL.♦ Form создает новую пустую форму.♦ Text открывает в редакторе новый текстовый файл.♦ Unit создает новый пустой модуль, не связанный с формой. Страница Forms Ниже приведен список необходимых для работы предопределен- ных форм:♦ About Box – простая панель “О программе”.♦ Duil List Box – форма с двумя разными списками; позволяет пользовате- лю выбрать ряд элементов в одном списке и нажатием кнопки перемес- тить их во второй. Кроме компонентов, эта форма содержит значитель- ное количество не очень простого кода на языке Паскаль. Страница Dialogs Эта страница похожа на предыдущую, но содержит другие элементы.♦ Dialog Expert – простой эксперт, который способен сгенерировать раз- личные диалоговые панели с одной или несколькими страницами.♦ Dialog with help – два варианта диалоговой панели с кнопкой вызова справочной информации.♦ Password dialog – диалоговая панель с простым окном редактирования, которая имеет необходимые для ввода пароля опции; код отсутствует. ♦ Standart Dialog Box – стандартная диалоговая панель, которая доступна в двух вариантах с различным расположением кнопок. Страница Data Modules Модуль данных это особый вид формы, который никогда не появля-ется на экране во время выполнения и может использоваться для храненияневизуальных компонентов. Чаще всего он применяется для описания досту-па к базе данных. Страница Projects Эта страница содержит схемы проектов, которые вы можете ис- пользовать в качестве стартовой площадки для создания собственного при- ложения.♦ Application Expert – простой эксперт, в котором вы можете выбрать фай- ловую структуру и некоторые другие элементы приложения.♦ MDI Application задает ключевые элементы программы с интерфейсом 11 Multiple Document Interface (MDI). В этом приложении определена ос- новная форма для окна MDI-фрейма, содержащая меню, строку состоя- ния и инструментальную линейку. Кроме того, в нем имеется вторая форма, которую на этапе выполнения можно использовать для создания дочерних окон.♦ SDI Application определяет основную форму со стандартными атрибута- ми современного интерфейса пользователя, включая инструментальную линейку и строку состояния, а также типичную панель About.♦ Win95 LogoApplication описывает простое приложение, в котором при- сутствует большинство элементов, необходимых для получения логотипа Windows 95. Данная команда в основном создает SDI-приложение с ком- понетом RichEdit и вставляет в него код, который делает приложение со- вместимым с электронной почтой. 3.12. Эксперты Delphi Delphi разрешает не только копировать или использовать сущест-вующий код, но и создавать новые формы, приложения или другие файлы скодом, применяя эксперт. Эксперт позволяет вам ввести ряд опций и с по-мощью некоторой внутренней схемы создает код, соответствующий вашемузаказу. Application Expert Его можно активизировать из страницы Project окна Object Reposi-tory. Первая страница этого эксперта позволяет добавить в программу неко-торые стандартные выпадающие меню: File, Edit, Window и Help. На второйстранице эксперта вы зададите расширения тех файлов, которые должнарассматривать программа. Вам придется ввести как описание файла, напри-мер, текстовый файл (*.txt), так и его расширение txt Эти величины будутиспользоваться в качестве значений по умолчанию диалоговыми окнами FileOpen и File Save, которые Application Expert добавит в программу (если вывыбрали поддержку файлов). Application Expert выведет на экран прекрасное визуальное сред-ство, которым вы можете воспользоваться для построения инструменталь-ной линейки. В нем вы выбираете одно из выпадающих меню, и появляетсяряд стандартных кнопок, которые соответствуют его типичным элементам(но только, если это меню было выбрано на первой странице эксперта). После завершения работы над инструментальной линейкой выможете перейти на последнюю страницу эксперта. Здесь устанавливаютсямногие дополнительные опции, например, можно доказать поддержку ин-терфейса MDI, добавить строку состояния или разрешить всплывающиеподсказки. Вы также можете задать имя нового приложения и указать ката-лог для его исходных файлов. Каталог для приложений должен уже сущест-вовать. Если вы хотите поместить файлы проекта в новый каталог, выберите кнопку Browse и введите новый путь в появившемся диалоговом окне. Dialog Box Expert Это простой эксперт, предоставленный вместе с исходным тек- стом в качестве демонстрационного примера. Вы можете воспользоваться этим экспертом как инструментом для построения диалоговых панелей двух различных видов: простых и многостраничных диалоговых панелей. Если вы выберите простую диалоговую панель, эксперт перейдет к третьей стра- нице, где вы сможете задать компоновку кнопок. Если вы выберите много- страничную панель, появится промежуточная страница, которая позволяет ввести тексты для различных ярлычков. 4. Порядок выполнения работы 1. Войдите в среду Delphi, дважды щелкнув мышью на пиктограмму Delphi или через меню “Пуск”.2. Совершите экскурс в среду визуального программирования Delphi. При этом результаты своей работы не сохраняйте на диске.3. Попытайтесь создать различные приложения с помощью Expert-ов Delphi, исследовать в окне редактирования полученный код. Приложения на диске не запоминать.4. Выберите пункт меню File/New Application, этим вы создадите новый проект приложения.5. Выберите команду File/Save Project As… ♦ В появившемся диалоге перейдите к корневому каталогу диска C, выбрав соответствующий пункт в выпадающем списке вверху окна. ♦ Откройте папку, соответствующую названию вашей группы (напри- мер, Р-123). Если такой нет, то создайте её, щелкнув правой кнопкой мыши на свободном месте, выбрав из появившегося контекстного меню пункт Создать/папку и введя нужное название (после чего не забудьте её открыть). ♦ Создайте (как описано в предыдущем пункте) папку "Ваша_фамилия Lab1". ♦ Сохраните Unit1.pas под новым именем Main.pas, а Project1.dpr под новым именем Lab1.dpr. 6. Выберите из политры Standard визуальных компонентов и поместите в форму следующие компоненты: ♦ Окно редактирования со связанной с ним меткой Operand 1. В этом окне вводится первый операнд. ♦ Окно редактирования со связанной с ним меткой Operator. В этом 13 окне вводится операция. В программе следует предусмотреть опе- рации +, -, / и * . ♦ Окно редактирования со связанной с ним меткой Operand 2. В этом окне вводится второй операнд. ♦ Окно редактирования со связанной с ним меткой Result. В этом ок- не отображается результат запрошенной вами операции. Пример простого калькулятора приведен на рис.1.1. 1. В событиях OnClick каждой кнопки опишите соответствующие дей- ствия, например, для кнопки код события должен выглядеть следующим образом: If Edit2.Text='0' Then ShowMessage('Знаменатель равен "0"!')Else Edit3.Text:=FloatToStr(StrToFloat(Edit1.Text)/StrToFloat(Edit2.Text)); Обратите внимание, что в данном действии осуществляется проверкаделения на ноль. Оператор ShowMessage выдает сообщение, представленноена рис. 1.2 в случае, когда Y равен "0". Рис. 1.1. Пример формы калькулятора 14 Рис. 1.2. Сообщение об ошибке Процедуры FloatToStr и StrToFloat выполняют преобразования из число- вой переменной в строковую и из строковой в числовую соответственно. Остальные клавиши должны быть описаны соответственно. 2. Измените программу, дополнив ее возможностями очистки содер- жимого полей (например, кнопка Clear) и вычисления значения за- данной функции, согласно варианту индивидуального задания. 3. Сохраните форму и проект. 5. Варианты индивидуальных заданий 1. Создайте кнопку для нахождения значений функции Z=Sin(2X+3Y).2. Создайте кнопку для нахождения значений функции Z=Cos(4X-2Y).3. Создайте кнопку для нахождения значений функции Z=Tan(2X+Y).4. Создайте кнопку для нахождения значений функции Z=X! При этом в поле Y копируйте значение X.5. Создайте кнопку для нахождения значений функции Z=Log(2X+Y+3).6. Создайте кнопку для возведения X в целочисленную степеньY. 6. Результаты работы В результате выполнения лабораторной работы студент должен проде- монстрировать преподавателю готовый проект калькулятора, файл фор- мы и исходный код модуля. 15 ЛАБОРАТОРНАЯ РАБОТА № 2 Обработка исключительных ситуаций в Delphi. Восприятие ввода от пользователя 1. Цель работы Ознакомление с классом исключительных ситуаций Delphi и создание приложений, генерирующих исключения и обрабатывающие различные фо- кусы ввода. 2. Домашнее задание Изучить разделы 5 и 6 конспекта лекций, ознакомиться с описанием и заданием на лабораторную работу. 3. Основные понятия и приемы 3.1. Обработка исключений На этапе выполнения Delphi порождает исключения, когда какой-либо процесс идет неправильно. Если код вашей подпрограммы написан со-ответствующим образом, он может распознать возникшую проблему и по-пытаться ее решить; в противном случае исключение передается в код, ко-торый вызвал вашу подпрограмму и т.д. В конечном счете, если никто необработал исключение, его обрабатывает Delphi, выводя на экран стан-дартное сообщение об ошибке и пытаясь продолжить выполнение програм-мы. Весь механизм строится на четырех ключевых словах: try – определяет начало защищенного блока кода; except – определяет конец защищенного блока кода и вводит операторы обработки исключений в следующем виде: on (тип исключения) do (оператор) finally – указывает необязательный блок, который используется для ос- вобождения ресурсов, распределенных в блоке try перед обработкой ис- ключения; этот блок завершается ключевым словом end. raise – оператор, используемый для порождения исключений. Большин- ство исключений, которые вы встретите при программировании на Del- phi, будут порождаться системой, но вы также можете создать их в соб- ственном коде, когда во время выполнения обнаружатся недопустимые или несогласованные данные. Кроме того, ключевое слово raise можно использовать внутри обработчика для повторного порождения исключе- 16 ния, т.е. для передачи его следующему обработчику. Если вы хотите, чтобы при правильной обработке исключений програм-ма продолжала выполняться, отключите опцию отладки Break on Exception вокне Environment Options. 3.2. Предопределенные обработчики исключительных ситуаций Ниже Вы найдете справочную информацию по предопределенным ис-ключениям, необходимую для профессионального программирования вDelphi. • Exception - базовый класс-предок всех обработчиков исключитель- ных ситуаций. • EAbort - “скрытое” исключение. Используйте его тогда, когда хоти- те прервать тот или иной процесс с условием, что пользователь про- граммы не должен видеть сообщения об ошибке. Для повышения удобства использования в модуле SysUtils предусмотрена процедура Abort, определенная как: procedure Abort; begin raise EAbort.CreateRes(SOperationAborted) at ReturnAddr; end; • EComponentError - вызывается в двух ситуациях: 1) при попытке регистрации компоненты за пределами процеду- ры Register; 2) когда имя компоненты не уникально или не допустимо. • EConvertError - происходит в случае возникновения ошибки при выполнении функций StrToInt и StrToFloat, когда конвертация стро- ки в соответствующий числовой тип невозможна. • EInOutError - происходит при ошибках ввода/вывода при включен- ной директиве {$I+}. • EIntError - предок исключений, случающихся при выполнении це- лочисленных операций. • EDivByZero - вызывается в случае деления на ноль, как результат RunTime Error 200. • EIntOverflow - вызывается при попытке выполнения операций, при- водящих к переполнению целых переменных, как результат RunTime Error 215 при включенной директиве {$Q+}. • ERangeError - вызывается при попытке обращения к элементам массива по индексу, выходящему за пределы массива, как результат RunTime Error 201 при включенной директиве {$R+}. • EInvalidCast - происходит при попытке приведения переменных од- 17 ного класса к другому классу, не совместимому с первым (например, приведение переменной типа TListBox к TMemo).• EInvalidGraphic - вызывается при попытке передачи в LoadFromFile файла, несовместимого графического формата.• EInvalidGraphicOperation - вызывается при попытке выполнения операций, неприменимых для данного графического формата (на- пример, Resize для TIcon).• EListError - вызывается при обращении к элементу наследника TList по индексу, выходящему за пределы допустимых значений (на- пример, объект TStringList содержит только 10 строк, а происходит обращение к одиннадцатому).• EMathError - предок исключений, случающихся при выполнении операций с плавающей точкой.• EOverflow - происходит как результат переполнения операций с плавающей точкой при слишком больших величинах. Соответствует RunTime Error 205.• Underflow - происходит как результат переполнения операций с пла- вающей точкой при слишком малых величинах. Соответствует RunTime Error 206.• EZeroDivide - вызывается в результате деления на ноль.• EMenuError - вызывается в случае любых ошибок при работе с пунктами меню для компонент TMenu, TMenuItem, TPopupMenu и их наследников.• EOutlineError - вызывается в случае любых ошибок при работе с TOutLine и любыми его наследниками.• EOutOfMemory - происходит в случае вызовов New(), GetMem() или конструкторов классов при невозможности распределения памяти. Соответствует RunTime Error 203.• EPrinter - вызывается в случае любых ошибок при работе с принте- ром.• EProcessorException - предок исключений, вызываемых в случае прерывания процессора- hardware breakpoint. Никогда не включается в DLL, может обрабатываться только в “цельном” приложении.• EBreakpoint - вызывается в случае останова на точке прерывания при отладке в IDE Delphi. Среда Delphi обрабатывает это исключе- ние самостоятельно.• EFault - предок исключений, вызываемых в случае невозможности обработки процессором тех или иных операций.• EInvalidOpCode - вызывается, когда процессор пытается выполнить недопустимые инструкции.• ESingleStep - аналогично EBreakpoint, это исключение происходит 18 при пошаговом выполнении приложения в IDE Delphi. • EPropertyError - вызывается в случае ошибок в редакторах свойств, встраиваемых в IDE Delphi. Имеет большое значение для написания надежных property editors. Определен в модуле DsgnIntf.pas. • EResNotFound - происходит в случае тех или иных проблем, имею- щих место при попытке загрузки ресурсов форм - файлов .DFM в режиме дизайнера. Часто причиной таких исключений бывает нару- шение соответствия между определением класса формы и ее описа- нием на уровне ресурса (например, вследствие изменения порядка следования полей-ссылок на компоненты, вставленные в форму в режиме дизайнера). • EStreamError - предок исключений, вызываемых при работе с пото- ками. • EFCreateError - происходит в случае ошибок создания потока (на- пример, при некорректном задании файла потока). • EFilerError - вызывается при попытке вторичной регистрации уже зарегистрированного класса (компоненты). Является, также, предком специализированных обработчиков исключений, возникающих при работе с классами компонент. 3.3. Восприятие ввода от пользователя Обратим особое внимание на одно качество, характерное для многих управляющих элементов – фокус. Как определить какое окно или поле име- ет фокус ввода? В каждый конкретный момент фокус имеет только одно по- ле. Вы можете перемещать фокус, используя клавишу Tab или щелкая мы- шью по другому компоненту. Каждый раз когда компонент получает или те- ряет фокус, к нему приходит соответствующее событие, которое указывает, что пользователь достиг (OnEnter) или покинул (OnExit) компонент. При использовании компонента Edit для ввода чисел пользователь вме- сто цифры может набрать букву. Функции преобразования вернут код ошибки, что поможет определить действительно ли введено число. Когда можно выполнить такую проверку? Возможно, когда изменится значение блока редактирования, когда компонент потеряет фокус или когда пользова- тель щелкнет по некоторой кнопке в диалоговой панели. Можно просматри- вать входной поток в блоке редактирования и останавливать любой нечи- словой код. 4. Порядок выполнения работы 1. В среде программирования Delphi cоздайте новый проект, выбрав пункт меню File/New Application. 19 2. Сохраните этот проект в папке"С:&bsol;Ваша_группа&bsol;Ваша_фамилия Lab2". (Unit1.pas под новым именем Main2.pas, а Project1.dpr под новым именем Lab2.dpr).3. Разработайте приложение, обрабатывающее исключительную ситуацию, согласно вашему варианту индивидуального задания.4. Открыть новое приложение.5. Создать форму с пятью полями редактирования и пятью соответствую- щими надписями, которые поясняют, какой вид проверки осуществляет соответствующий компонент Edit. Форма также содержит кнопку для проверки содержимого первого поля редактирования. Событие OnClick кнопки должно проверять целочисленность введенного в первое поле значения, например: var Number, Code : Integer ; begin if Edit1.Text <> ‘ ’ then begin val ( Edit1. Text, Number, Code) ; if Code <> 0 then begin Edit1. SetFocus ; MessageDlg (‘ Not a number in the first edit ‘ , mtError, [ mbOK ] , 0 ) ; end ; end ; end ;♦ При выходе из компонента Edit2 (событие OnExit) осуществляется ана- логичная проверка. var Number, Code : Integer ; begin if (Sender as TEdit ). Text <> ‘ ’ then begin val ((Sender as TEdit ). Text, Number, Code) ; if Code <> 0 then begin (Sender as TEdit ). SetFocus ; MessageDlg (‘ The edit field number ‘ + IntToStr ((Sender as TEdit ). Tag) + ‘ does not have a valid number’ , mtError, [ mbOK ] , 0 ) ; end ; end ; 20 end ; Текст сообщения об ошибке может варьироваться. ♦ Третий компонент Edit выполняет аналогичную проверку при каждом изменении его содержимого (используя событие OnChange}.♦ Записать код для события события OnKeyPress компонента Edit4 и про- верить, не является ли введенный символ числом или клавишей Back- space (которая имеет числовое значение 8). begin if not ( key in [ ‘0’ . . ‘9’ , # 8] } then begin Key := # 0 ; MessageBeep ($ FFFFFFFF) ; end; end; ♦ Для события OnEnter компонента Edit5 записать код, в котором необхо- димо преобразовать введенные символы в число с помощью функции StrToInt. Использовать исключение для обработки ошибки EConvertError. 5. Варианты индивидуальных заданий 1. Создать программу, позволяющую пользователю ввести два числа, которые программа разделит. Необходимо поместить на форму три объекта класса TEdit - два для операндов, один – для результата и кнопку (объект класса TButton), нажимая на которую пользователь выполняет деление. Исключить попытку деления на ноль а так же введения символов вместо цифр. Выдать сообщение о типе возник- шей ошибке. 2. Создать программу, вычисляющую корни квадратного уравнения (ax2+bx+c=0). Необходимо поместить на форму четыре объекта класса TEdit - три для коэффициентов квадратного уравнения, один – для результата и кнопку (объект класса TButton), нажимая на кото- рую пользователь выполняет нахождение корней. Исключить ввод символов вместо цифр, получение отрицательного дискриминанта и ввод а = 0. Вывести при всех типах ошибок одно и то же сообщение. 3. Создать программу с “бесконечным” циклом типа while. В цикле увеличивать переменную I до значения, заданного пользователем. При достижении этого значения выходить из цикла с помощью воз- буждения исключения EAbort. Выдать сообщение о выходе из цикла в блоке Except. Необходимо поместить на форму кнопку (объект класса TButton), которая запускает цикл; сообщение можно выдать с 21 помощью функции ShowMessage, или поместить на форму метку (объект класса TLabel), в которую помещается сообщение. 4. Создать программу, вычисляющую тангенс угла. Необходимо по- местить в форму два компонента Tedit для ввода значения и резуль- тата и кнопку Tbutton для вычисления значения тангенса. Исключить ввод символов вместо цифр и получение значения тангенса угла 90 градусов. Предусмотреть возможность ввода значений в радианах. 5. Создать программу, вычисляющую логарифм числа. Для этого необ- ходимо поместить в форму два компонента Tedit для ввода значения и результата и кнопку Tbutton для вычисления значения логарифма. Исключить ввод символов вместо цифр и получение значения лога- рифма 0. 6. Создать программу обработки исключения при обращении к несу- ществующему элементу массива. В форму поместите поля редакти- рования для ввода – вывода значений и номеров элементов массива и кнопку для обработки события. 6. Результаты работы В результате выполнения лабораторной работы студент должен проде- монстрировать преподавателю готовый проект, содержащий обработку исключительной ситуации, файл формы и исходный код модуля. ЛАБОРАТОРНАЯ РАБОТА № 3 Создание и обработка меню1. Цель работы Ознакомление с дизайнером меню Delphi и создание приложения, со- держащего меню. 2. Домашнее задание Изучить 7 раздел конспекта лекций, ознакомиться с описанием и заданием на лабораторную работу. 3. Основные понятия и приемы 3.1. Структура меню Обычно меню имеет два уровня. Строка меню, которая находится подзаголовком окна, содержит имена выпадающих меню. Каждое выпадающееменю содержит несколько элементов. Однако структура меню очень гибка.Элемент меню можно поместить непосредственно в строку меню, а выпа-дающее меню внутрь другого выпадающего меню. Выпадающее меню внут-ри другого выпадающего меню (выпадающее меню второго уровня) встре-чается довольно часто, и для этого случая Windows предоставляет специаль-ный визуальный значок – маленький треугольник справа от соответствую-щего пункта меню. Нередко вместо выпадающего меню второго уровня выможете просто сгруппировать ряд опций в первоначальном выпадающемменю и поместить два разделителя: один до группы и один после. 3.2. Различные роли элементов меню Существует три основных типа элементов меню:♦ Команды – элементы меню, которые используются для выдачи команды и выполнения действия. Визуально они никак не выделяются.♦ Установщики состояния – элементы меню, которые используются для переключения опции в положения включено – выключено и изменения состояния какого – либо элемента. Если эти команды имеют два состоя- ния, то в активном положении слева от них обычно стоит галочка. В этом случае выбор команды изменяет состояние на противоположное.♦ Элементы вызова диалога – элементы меню, которые вызывают диалого- вою панель. Реальное различие между этими и другими элементами ме- ню состоит в следующем: с помощью этих элементов пользователь дол- жен получить возможность исследовать вероятные действия соответст- вующей диалоговой панели. Такие команды должны иметь визуальный ключ в виде трех точек после текста. 23 3.3. Редактирование меню с помощью Menu Designer Система Delphi включает специальный редактор для меню Menu De-signer. Чтобы вызвать этот инструмент, поместите компонент меню в формуи дважды щелкните по нему. Не волнуйтесь о точном положении данногокомпонента в форме, поскольку на результат это не влияет: само меню все-гда помещается правильно – под заголовком формы. Menu Designer позволя-ет создавать меню путем простого написания текста команд, перемещатьэлементы или выпадающие меню с помощью буксировки и легко устанав-ливать свойства элементов. Для создания выпадающего меню второго уров-ня нужно выбрать команду Create submenu в SpeedMenu инструмента (ло-кальном меню, которое вызывается правой кнопкой мыши). 3.4. Горячие клавиши меню Общее свойство элементов меню – наличие подчеркнутой буквы. Этубукву можно использовать для выбора меню с помощью клавиатуры. Приодновременном нажатии клавиши Alt и клавиши с буквой на экране появля-ется соответствующее выпадающее меню. Чтобы определить подчеркнутуюклавишу, просто поместите перед ней символ амперсанта (&), например,&File. Элементам меню можно назначить горячие клавиши. Для этого нуж-но указать значение для свойства ShortCut, выбрав одну из стандартныхкомбинаций. 3.5. Изменение элементов меню Для модификации элемента меню чаще всего используются три свой-ства. Свойство Checked используется, чтобы добавить или удалить галочкурядом с элементом меню. С помощью свойства Enabled элемент меню мож-но пригасить, после чего пользователь не сможет его выбрать. СвойствоCaption представляет текст элемента меню. Изменяя текст элемента меню,вы указываете пользователю, что программа перешла в другое состояние. 4. Порядок выполнения работы1. Войдите в среду Delphi.2. Выберите пункт меню File/New Application, этим вы создадите новый проект приложения.3. Выберите команду File/Save Project As… ♦ В появившемся диалоге перейдите к корневому каталогу диска C, выбрав соответствующий пункт в выпадающем списке вверху окна. ♦ Откройте папку, соответствующую названию вашей группы (напри- мер, Р-123). Если такой нет, то создайте её, кликнув правой кнопкой мыши на свободном месте, выбрав из появившегося контекстного меню пункт Создать/папку и введя нужное название (после чего не 24 забудьте её открыть). ♦ Создайте (как описано в предыдущем пункте) папку "Ваша_фамилия Lab3". ♦ Сохраните Unit1.pas под новым именем Main.pas, а Project1.dpr под новым именем Lab3.dpr. ♦ Создайте проект согласно Вашему индивидуальному заданию. Под- робное описание разработки меню приведено в индивидуальном за- дании 1. 5. Варианты индивидуальных заданий Вариант 11. Выберите в палитре компонентов Delphi вкладку Standard (это самая пер- вая вкладка и обычно она уже выбрана автоматически).2. Выберите компонент MainMenu и поместите его на форму. Рис. 3.1. Дизайнер меню3. Откройте Menu Designer дважды кликнув на компоненте MainMenu в форме. Окно дизайнера меню представлено на рис. 3.1.4. Создайте меню следующей структуры: ♦ File: Exit ♦ Options: Font, Color, (разделитель), Left, Center, Right, (разделитель), Height ♦ Help: About 25 Меню должно быть похоже на представленное на рис. 3.2.Названия пунктов меню вводятся в поле Caption, для создания разделителя в поле Caption вводится символ "-" (минус, он же дефис) Рис. 3.2. Пример меню5. Для Left, Center и Hight назначьте горячие клавиши (свойство ShortCut)6. В форму поместите компонент RichEdit из палитры Win32 и две пикто- граммы диалогов: FontDialog и ColorDialog из палитры Dialogs.7. Для отклика на команды меню вы должны определить метод для события OnClick каждого элемента меню, как показано на рис. 3.3. Рис. 3.3. Выбор метода OnClick8. Код метода TForm1.Font1Click: procedure TForm1.Font1Click (Sender : TObject) ; begin FontDialog1.Font : = RichEdit1.Font ; 26 FontDialog1.Execute; RichEdit1.Font : = FontDialog1.Font ; end; 9. Код метода TForm1.Color1Click очень похож на приведённый выше. На- пишите его сами.10. Код метода TForm1.Left1Click: procedure TForm1.Left1Click (Sender : TObject) ; begin RichEdit1.Paragraph.Alignment : = taLeftJustify ; Left1.Checked : = True ; Center1.Checked : = False ; Right1.Checked : = False ; end; Чтобы поставить галочку в ряде выбираемых опций, установите свойст- во Checked элемента меню в True, как показано на рис. 3.4. Рис. 3.4. Параметры инспектора объектов 11. Коды методов для элементов Center и Right аналогичны предыдущему. 27 Вариант 2 1. На форме расположите две панели , две кнопки и компонент RichEdit. Первая панель должна содержать два поля редактирования, а вторая два чекбокса, как показано на рис. 3.5. Рис. 3.5. Начальная форма проекта2. Создайте меню: ♦ File: Open, Save As ♦ Buttons: Enable First (программно изменяемый на Disable First и об- ратно; как именно – см. ниже) ♦ Views: Edit Boxes, Check Boxes ♦ Pulldowns: Remove File Menu, Disable Buttons Menu 3. Поместите в форму пиктограммы диалогов OpenDialog, SaveDialog. Форма будет выглядеть примерно так, как показано на рис.3.6. 28 Рис. 3.6. Законченный вид формы проекта4. Код методов, которые загружают и сохраняют файлы : procedure TForm1.Open1Click (Sender : TObject) ; begin if OpenDialog1.Execute then RichEdit1.Lines.LoadFromFile (OpenDialog1.FileName) ; end; procedure TForm1.SaveAs1Click (Sender : TObject) ; begin if SaveDialog1.Execute then RichEdit1.Lines.SaveToFile (SaveDialog1.FileName) ; end; 5. Компоненты внутри панелей в действительности не используются. Одна- ко вам необходимо воспользоваться двумя кнопками, чтобы скрыть или отобразить каждую из двух панелей вместе с управляющими элемента- ми, которые в них содержатся. Те же действия можно выполнить с по- мощью двух команд меню : View/ Edit Boxes и View/ Check Boxes. Когда вы выбираете одну из этих команд меню или нажимаете одну из кнопок, происходят три разных действия. Во-первых, отображается или скрыва- ется панель. Во-вторых, текст кнопки изменяется с Hide на Show, и на- оборот. В-третьих, рядом с соответствующим элементом меню появляет- 29 ся или исчезает галочка. Ниже приведен код одного из двух методов, ко- торый связан с событиями щелчка как команды меню, так и кнопки : procedure TForm1.ViewEdit1Click (Sender : TObject) ; begin Panel1.Visible : = not Panel1.Visible ; ViewEdit1.Checked : = not ViewEdit1.Checked ; if Panel1.Visible then Button1.Caption : = ‘Hide’ ; else Button1.Caption : = ‘Show’ ; end; 6. Команды меню Buttons применяют другой подход. Для показа текущего состояния они используют не галочку, а изменение текста. Кроме того, они разрешают или запрещают соответствующую команду View и кноп- ку. procedure TForm1.ButtonsFirst1Click (Sender : TObject) ; begin if Buttons1.Enabled then begin Buttons1.Enabled : = False; ViewEdit1.Enabled : = False ; ButtonsFirst1.Caption : = ‘Enable &First’ ; end else begin Buttons1.Enabled : = True ViewEdit1.Enabled : = True ; ButtonsFirst1.Caption : = ‘Disable &First’ ; end end; 7. Команды меню Pulldowns должны скрывать выпадающее меню File и Duttons соответственно и показывать галочку для выбранного элемента. Запишите код для каждого элемента этого меню самостоятельно. Вариант 3 1. На форме расположите компонент Image, пиктограмму диалога OpenPictureDialog 30 2. Создайте меню (рис. 3.7):♦ File: Open, (разделитель), Exit, (разделитель) - невидимый, Most Re- cent - невидимый♦ Options: Center, Stretch, Transparent♦ About Рис. 3.7. Форма проекта варианта 3 3. Методы меню File: procedure TForm1.Open1Click(Sender: TObject);begin if OpenPictureDialog1.Execute then begin if Current<>'' then begin MostRecent1.Caption := Current; N2.Visible := true; MostRecent1.Visible := true; end; Current := OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName); end;end; 31 procedure TForm1.MostRecent1Click(Sender: TObject); var S : string; begin S := MostRecent1.Caption; Image1.Picture.LoadFromFile(S); MostRecent1.Caption := Current; Current := S; end; 4. Метод меню TForm1.Center1Click: procedure TForm1.Center1Click(Sender: TObject); begin Center1.Checked := not Center1.Checked; Image1.Center := Center1.Checked; end; 5. Остальные два метода меню Options аналогичны приведённому вы- ше TForm1.Center1Click 6. Измените меню File и соответствующие методы для отображения имён и повторного открытия не одной, а трёх последних картинок Вариант 4 1. На форме расположите компоненты Edit и Button 2. Поместите в форму компонент RadioGroup с тремя пунктами: Beep, About, Exit6. Создайте меню: ♦ Normal Part: Beep, About, Exit ♦ Anomal Part Пример формы представлен на рис. 3.8. 12 Рис. 3.8. Форма проекта варианта 4 4. Коды методов TForm1.Beep1Click и TForm1.Button1Click: procedure TForm1.Beep1Click(Sender: TObject); begin MessageBeep($FFFFFFFF); if (Sender as TMenuItem).Owner=AnomalPart1 then Anomal-Part1.Remove(Sender as TMenuItem); end; procedure TForm1.About1Click(Sender: TObject); begin Application.MessageBox('!!!', '...', 0); if (Sender as TMenuItem).Owner=AnomalPart1 then Anomal-Part1.Remove(Sender as TMenuItem); end; procedure TForm1.Exit1Click(Sender: TObject); begin Close; end; procedure TForm1.Button1Click(Sender: TObject); var I : TMenuItem; begin I := TMenuItem.Create(AnomalPart1); 33 I.Caption := Edit1.Text; case RadioGroup1.ItemIndex of 0: I.OnClick := Beep1Click; 1: I.OnClick := About1Click; 2: I.OnClick := Exit1Click; end; AnomalPart1.Add(I); end; 5. Коды методов TForm1.About1Click аналогичен коду метода TForm1.Beep1Click 6. Добавьте в форму компонент ImageList и добавьте в него несколько иконок или небольших картинок 7. Установите свойство меню Images указывающим на ImageList1 8. Задайте свойство ImageIndex для некоторых пунктов меню. 9. Сделайте так, чтобы любой пункт из аномальной части меню случай- ным образом менял свойства Caption, Checked или ImageIndex како- го-либо из оставшихся элементов, если таковые имеются Вариант 5 1. На форме расположите компоненты Memo и Image, пиктограммы диалогов OpenDialog, SaveDialog и OpenPictureDialog. 2. Создайте меню: ♦ Text: Load, Save, (разделитель), Enabled – с галочкой ♦ Graphics: Load, (разделитель), Center – отключен, Stretch – отключен 3. Создайте всплывающее меню с единственным пунктом Clear. Пример формы представлен на рис. 3.9. 34 Рис. 3.9. Пример формы варианта 5 4. Коды методов: procedure TForm1.Load1Click(Sender: TObject);begin if OpenDialog1.Execute then Memo1.Lines.LoadFromFile(OpenDialog1.FileName);end; procedure TForm1.Save1Click(Sender: TObject);begin if SaveDialog1.Execute then Memo1.Lines.SaveToFile(SaveDialog1.FileName);end; procedure TForm1.PopupMenu1Popup(Sender: TObject);begin Clear1.Visible := Memo1.Lines.Count<>0;end; procedure TForm1.Clear1Click(Sender: TObject);begin Memo1.Lines.Clear;end; 35 procedure TForm1.Center1Click(Sender: TObject);begin Center1.Checked := not Center1.Checked; Image1.Center := Center1.Checked;end; procedure TForm1.Load2Click(Sender: TObject);begin if OpenPictureDialog1.Execute then begin Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName); Center1.Enabled := true; Stretch1.Enabled := true; end;end; procedure TForm1.Enabled1Click(Sender: TObject);begin Enabled1.Checked := not Enabled1.Checked; Memo1.Enabled := Enabled1.Checked;end;5. Добавьте в главное меню пункт:♦ Lines: Add, (разделитель) - невидимый6. Добавьте методы: procedure TForm1.Add1Click(Sender: TObject);var I : TMenuItem;begin I := TMenuItem.Create(Lines1); I.Caption := Memo1.SelText; I.OnClick := Put; Lines1.Add(I); N3.Visible := true;end; procedure TForm1.Put(Sender: TObject);begin Memo1.Text := Memo1.Text + (Sender as TMenuItem).Caption;end; 36 7. Добавьте в меню Text пункт "Alignment: Left", циклически изме- няющий свойство Memo1.Alignment и своё свойство Caption для вы- равнивания по левому краю, по центру и по правому краю. Вариант 6 1. На форме расположите три кнопки (вторая и третья - отключены), компоненты ProgressBar и Shape, пиктограммы диалога ColorDialog 2. Создайте меню: ♦ Progress: More, Less - отключен ♦ Buttons: First – с галочкой, Second, Third ♦ Shaping: Color Пример формы – рис. 3.10 Рис. 3.10. Пример формы варианта 6 3. Коды методов: procedure TForm1.More1Click(Sender: TObject); begin ProgressBar1.Position := ProgressBar1.Position+10; Progress1.Caption := 'Progress: ' + IntToStr(ProgressBar1.Position) +'%'; More1.Enabled := ProgressBar1.Position<>100; Less1.Enabled := ProgressBar1.Position<>0; end; procedure TForm1.First1Click(Sender: TObject); begin First1.Checked := true; 37 Second1.Checked := false; Third1.Checked := false; Button1.Enabled := true; Button2.Enabled := false; Button3.Enabled := false; end; procedure TForm1.Color1Click(Sender: TObject); begin if ColorDialog1.Execute then Shape1.Brush.Color := ColorDialog1.Color; end; 4. Код метода TForm1.Less1Click аналогичен коду метода TForm1.More1Click 5. Коды методов TForm1.Second1Click и TForm1.Third1Click аналогич- ны коду метода TForm1.First1Click 6. Добавьте в меню Shaping пункт, циклически изменяющий свойство Shape1.Shape и отображающий эти изменения своим свойством Cap- tion 6. Результаты работы В результате выполнения лабораторной работы студент должен проде- монстрировать преподавателю готовый проект, содержащий меню, файл формы и исходный код модуля. 38 ЛАБОРАТОРНАЯ РАБОТА №4 Классы и модули1. Цель работы Объектно – ориентированное программирование в среде Delphi и разра- ботка приложения, создающего и обрабатывающего собственный класс. 2. Домашнее задание Изучить раздел 3 конспекта лекций, описывающий объектно- ориентированное программирование в Delphi. Ознакомиться с описанием и заданием на лабораторную работу. 3. Основные понятия и приемы 3.1. Классы и сокрытие информации Класс может содержать сколько угодно данных и любое количест- во методов. Однако для соблюдения всех правил объектно- ориентированного подхода данные должны быть скрыты, или инкапсулиро- ваны, внутри использующего их класса. Использование метода для получе- ния доступа к внутреннему представлению объекта уменьшает риск возник- новения ошибочных ситуаций и позволяет автору класса модифицировать внутреннее представление в будущих версиях. В Object Pascal имеются две различные конструкции, подразумевающие инкапсуляцию, защиту и доступ к переменным: классы и модули. С классами связаны некоторые специаль- ные ключевые слова – спецификаторы доступа:♦ private – элементы интерфейса класса видны только в пределах модуля, в котором определен класс. Вне этого модуля private-элементы не видны и недоступны. Если в одном модуле создано несколько классов, то все они видят private-разделы друг друга.♦ Раздел public не накладывает ограничений на область видимости пере- численных в нем полей, методов и свойств. Их можно вызывать в любом другом модуле программы.♦ Раздел published не ограничивает область видимости, однако в нем пере- числены свойства, которые должны быть доступны не только на этапе исполнения, но и на этапе конструирования программы. Раздел published используется при разработке компонентов. Без объявления раздел счита- ется объявленным как published. Такой умалчиваемый раздел располага- ется в самом начале объявления класса любой формы и продолжается до первого объявленного раздела. В раздел published среда помещает описа- ние вставляемых в форму компонентов. Сюда не нужно помещать собст- венные элементы или удалять элементы, вставленные средой. 39 ♦ Раздел protected доступен только методам самого класса, а также любым потомкам, независимо от того, находятся ли они в том же модуле или нет. Порядок следования разделов может быть любой, любой разделможет быть пустым. 3.2. Классы и модули Приложения Delphi интенсивно используют модули. За каждойформой скрывается соответствующий ей модуль. Однако модули не обязаныиметь соответствующие формы. Модуль содержит раздел interface, где объявлено все, что доступнодля других модулей, и раздел implementation с реальным кодом. Наконец,модуль может иметь два необязательных раздела: initialization с некоторымкодом запуска, который выполняется при загрузке в память программы, ис-пользующей данный модуль, и finalization, который выполняется при завер-шении программы. Предложение uses в начале раздела interface указывает к какимдругим модулям мы должны получить доступ из раздела interface текущегомодуля. Если же на другие модули необходимо сослаться из кода подпро-грамм и методов, вы должны добавить новое предложение uses в началераздела implementation. В интерфейсе модуля можно объявить несколько различных эле-ментов, в том числе процедуры, функции, глобальные переменные и типыданных. Также можно поместить в модуль класс. Delphi это делает автома-тически при создании каждой формы. Чтобы создать новый не относящийсяк форме модуль, выберите команду File/New и отметьте на странице Newпоявившегося окна Object Repository элемент Unit. 3.3. Модули и область видимости Область видимости идентификатора (переменной, процедуры, функ-ции или типа данных) определяет ту часть кода, в которой доступен этотидентификатор. Основное правило состоит в том, что идентификатор являет-ся значимым только внутри его области видимости. Если вы объявили идентификатор внутри блока определения про- цедуры, вы не сможете использовать данную переменную вне этой процеду- ры. Область видимости идентификатора охватывает всю процедуру, вклю- чая вложенные блоки. Если вы объявили идентификатор в области реализации модуля, вы не можете применить его вне модуля, но можете использовать в любом блоке и процедуре, определенных внутри модуля. Если вы объявили иден- тификатор в интерфейсной части модуля, его область видимости распро- страняется на любой другой модуль, где объявлен идентификатор. Любой идентификатор, объявленный в интерфейсе модуля, является глобальным; 40 все другие идентификаторы принято называть локальными. 3.4. Модули и программы Приложение Delphi создается из файлов исходного текста двухразных видов. Это один или несколько модулей и один файл программы. Модули можно считать вторичными файлами, к которым обраща-ется основная часть приложения – программа. На практике файл программыобычно является автоматически сгенерированным файлом с ограниченнойролью. Он нужен только для запуска программы, которая выполняет основ-ную форму. Код файла программы, или файла проекта Delphi (DPR), можноотредактировать вручную или с помощью Project Manager и некоторых оп-ций проекта. 3.5. Информация о типе на этапе выполнения Правило языка Object Pascal о совместимости типов для классов-потомков позволяет вам использовать класс-потомок там, где ожидаетсякласс - предок, обратное невозможно. Теперь предположим, что класс Dogсодержит функцию Eat, которая отсутствует в классе Animal. Если переменная MyAnimal ссылается на объект типа Dog, вызовэтой функции должен быть разрешен. Но если вы попытаетесь вызвать этуфункцию, а переменная ссылается на объект другого класса, возникнетошибка. Поскольку компилятор не способен определить, будет ли значениеправильным на этапе выполнения, то, делая явное приведение типов, мырискуем вызвать опасную ошибку этапа выполнения программы. Для решения данной проблемы можно воспользоваться некоторы-ми подходами, основанными на системе RTTI. Каждый объект знает свойтип и своего предка и может получить эту информацию с помощью опера-ции is. Параметрами операции is являются объект и тип: if MyAnimal is Dog then … Выражение is становится истинным, только если в настоящее вре-мя объект MyAnimal имеет тип Dog или тип потомка от Dog. Другими сло-вами, это выражение приобретает значение True, если вы можете без рискаприсвоить объект (MyAnimal) переменной заданного типа данных (Dog).Такое прямое приведение можно выполнить так: if MyAnimal is Dog then MyDog := Dog (MyAnimal) ; То же действие можно выполнить напрямую с помощью другой опера-ции RTTI – as. Мы можем написать так: MyDog := MyAnimal as Dog ; Text := MyDog. Eat ; 41 Если мы хотим вызвать функцию Eat, можно использовать и дру- гую форму записи: (MyAnimal as Dog) . Eat ; Результатом выражения будет объект с типом данных класса Dog, поэтому вы можете применить к нему любой метод этого класса. Приведение с операцией as отличается от традиционного приведе- ния тем, что в случае несовместимости типа объекта с типом, к которому вы пытаетесь его привести, порождается исключение EInvalidCast. Чтобы избежать этого исключения, используйте операцию is и в случае успеха делайте простое приведение: if MyAnimal is Dog then (Dog (MyAnimal) ) . Eat ; 4. Порядок выполнения работы 1. В среде программирования Delphi cоздайте новый проект, выбрав пункт меню File/New Application.2. Сохраните этот проект в папке "С:&bsol;Ваша_группа&bsol;Ваша_фамилия Lab4". (Unit1.pas под новым именем Main4.pas, а Project1.dpr под новым именем Lab4.dpr).3. Открыть модуль, не связанный с формой (File/New и отметьте на страни- це New появившегося окна Object Repository элемент Unit), и поместить в него три класса:♦ Класс Animal, который содержит в разделе public объявление конструк- тора Create и объявление метода-функции: Voice – звук, издаваемый жи- вотным. Тип результата возвращаемого функцией, – string. Метод Voice объявить виртуальным и абстрактным. public constructor Create; function GetKind: string; function Voice: string; virtual; abstract; В разделе private класса определить переменную Kind: string.♦ Класс Dog объявить потомком класса Animal: TDog = class (TAnimal) В разделе public этого класса объявить конструктор и методы Voice и Eat. Метод Eat типа string объявить виртуальным (пища животного). 42public constructor Create; function Voice: string; override; function Eat: string; virtual;♦ Класс Cat объявить потомком класса Animal. TCat = class (TAnimal) Раздел public класса содержит те же определения, что и соответст- вующий раздел класса Dog. public constructor Create; function Voice: string; override; function Eat: string; virtual; В реализациях конструктора каждого класса переменной Kind присваивается имя соответствующего животного, например, для класса Animal: Kind := ‘An Animal’. В реализациях методов Voice возвращается звук, издаваемый жи- вотным, например: Voice := ‘Mieow’. В реализациях методов Eat возвращается название пищи, которой питается соответствующее животное: Eat:= 'A bone, please!';4. Задать имя модуля и имя проекта, в который этот модуль будет включен.7. Добавить в проект форму, которой присвоить имя Animals, также задать имя модулю, связанному с формой.8. В форме расположить три кнопки опций (компонент RadioButton) с на- званиями Animal, Dog, Cat ; кнопкой команды (компонент Button) с на- званием Kind и две крупные надписи (компонент Label)(рис. 4.1). Нажа- тию одной из кнопок опций будет соответствовать выбор животного. При нажатии кнопки команды надписи должны отобразить звук, изда- ваемый животным, и его пищу. 43 Рис. 4.1. Форма проекта 9. Определите в классе формы private-переменную MyAnimal. private MyAnimal: TAnimal; Запишите код для обработчика события OnCreate формы, где созда- ется объект типа Dog, на который ссылается переменная MyAnimal. begin MyAnimal := TDog.Create; end;10. В обработчиках события OnClick каждой кнопки опций записать код, который удаляет текущий объект и создает новый. begin MyAnimal.Free; MyAnimal := TAnimal.Create; end;11. В обработчике события OnClick кнопки команды записать код, который будет помещать в надписи звук, издаваемый животным. begin LabelVoice.Caption := MyAnimal.Voice; end; 44 Рис. 4.2.Звук для Cat Рис. 4.3. Сообщение об ошибке 12. Если вы все сделали правильно, при запуске приложения надписи будут отображать пищу и звук для Dog и Cat (рис. 4.2) и приложение завершит работу по ошибке при выборе Animal (рис. 4.3).13. Уберите ключевое слово abstract в объявлении метода Voice. Запустите приложение снова. Посмотрите, что изменилось в работе приложения. Объясните различия.14. Попробуйте использовать метод Eat без приведения типов (без is).15. Доработайте проект согласно варианту индивидуального задания. 45 5. Варианты индивидуальных заданий Вариант 1 Разработайте два класса потомка от Animal, которые будут отображать особенности двух пород собак. Разработайте методы для этих классов, по- зволяющие получить некоторые характеристики породы (рост, длина шер- сти, длина ушей и т.д.). Дополните форму компонентами, позволяющими увидеть все характеристики разработанных классов. Примерная форма проекта представлена на рис. 4.4. После запуска программы представляется возможность выбора между значениями: Animal, Dog, Cat. Выбор осуществляется при помощи кнопки SELECT. Далее предоставляется дополнительная возможность для выбора породы собаки. При выделении знаком: интересующей породы можно получить дополнительную информацию. Вариант 2 Разработайте два класса потомка от Animal, которые будут отображатьособенности двух новых животных Wolf (волк) и Jascal (шакал). Разрабо-тайте методы для этих классов, позволяющие получить некоторые характе-ристики этих видов животных (рост по холке, длина клыков, вес и т.д.). До-полните форму компонентами, позволяющими увидеть все характеристикиразработанных классов. Вариант 3 Разработайте два класса потомка от Animal, которые будут отображатьособенности двух новых животных Fish (рыба) и Bird (птица). Разработай-те методы для этих классов, позволяющие получить некоторые характери-стики этих типов животных (среда обитания, покров тела, издаваемый звуки т.д.). Дополните форму компонентами, позволяющими увидеть все харак-теристики разработанных классов. Вариант 4 Разработайте два класса потомка от Animal, которые будут отображатьособенности двух видов насекомых Gnat (комар) и Fly (муха). Разработайтеметоды для этих классов, позволяющие получить некоторые характеристикиэтих насекомых (скорость передвижения, окраска, используемая пища ит.д.). Дополните форму компонентами, позволяющими увидеть все эти ха-рактеристики разработанных классов. Вариант 5 Разработайте два класса потомка от Animal, которые будут отображатьособенности двух видов млекопитающих Man (человек) и Monkey (обезья-на). Разработайте методы для этих классов, позволяющие получить некото-рые характеристики этих существ (способ общения, покров, рост и т.д.). До- 46 полните форму компонентами, позволяющими увидеть все эти характери-стики разработанных классов. Рис. 4.4. Форма характеристик пород собак 6. Результаты работы В результате выполнения лабораторной работы студент должен проде- монстрировать преподавателю готовый проект, файлы форм и исходный код модулей. 47 ЛАБОРАТОРНАЯ РАБОТА № 5 Получение ввода от мыши. Рисование в форме1. Цель работы Ознакомление с графическими средствами среды программирования Delphi и разработка в ней простейших графических программ. 2. Домашнее задание Изучить 9 раздел конспекта лекций, описывающий средства черче- ния и рисования в форме. Ознакомиться с описанием и заданием на лабораторную работу. 3. Основные понятия и приемы Когда пользователь нажимает одну из кнопок мыши, указатель кото-рой находится над формой (или над компонентом), Windows посылает при-ложению несколько сообщений. Для написания кода, откликающегося наэти сообщения, Delphi определяет несколько событий. Основных событийдва: OnMouseDown, которое происходит при нажатии одной из кнопок мы-ши, и OnMouseUp, которое происходит при освобождении кнопки. Еще одно важное системное сообщение связано с перемещением мы-ши – сообщение OnMouseMove. Событие OnClick также доступно и в фор-ме. Его основной смысл состоит в том, что левая кнопка мыши нажимаетсяи отпускается над одним и тем же окном или компонентом. Однако в периодмежду этими двумя действиями курсор может переместиться за пределы ок-на или компонента, причем левая кнопка мыши будет удерживаться нажа-той. Если вы в определенной позиции нажмете кнопку мыши, а затем пере-местите мышь в другое место и отпустите кнопку, то щелчок не произойдет.В этом случае окно получает только сообщение о нажатии, несколько сооб-щений о перемещении и сообщение об освобождении. 3.1. События, связанные с мышью Метод, соответствующий событию OnMouseDown, имеет несколькопараметров: procedure TForm1.FormMouseDown (Sender : TObject ; Button : TMouseButton ; Shift : TShiftState ; X,Y : Integer ) ; Кроме обычного параметра Sender, здесь присутствуют еще четыре:1) Button – показывает, какая из трех кнопок мыши была нажата. Возмож- 48 ные значения: mbRight, mbLeft, mbCenter.2) Shift – показывает, какие влияющие на мышь клавиши были нажаты при возникновении события. Такой клавишей может быть Alt, Ctrl или Shift, нажатая вместе с самой кнопкой мыши. Данный параметр имеет тип множества, т.к. несколько клавиш могут быть нажаты одновременно. Это означает, что при анализе условия вы должны применять не проверку на равенство, а оператор in.3) X и Y – показывают координаты позиции мыши относительно клиент- ской области. 3.2. Рисование в форме Canvas (холст) – это область в форме для рисунка и многих другихграфических компонентов. Чтобы получить доступ к пикселям формы, ис-пользуйте свойство формы Canvas и свойство Pixels для Canvas. СвойствоPixels – это двумерный массив, соответствующий цветам отдельных пиксе-лов в Canvas. Canvas.Pixels[10,20] соответствует цвету пикселя, который на-ходится на 10 пикселов правее и на 20 пикселов ниже точки отсчета. Обра-щайтесь с массивом пикселов как с любым другим свойством; чтобы изме-нить цвет пикселя, присвойте ему новое значение. Чтобы определить цветпикселя, – прочитайте значение. Этот класс создает «канву», на которой можно рисовать чертежнымиинструментами - пером, кистью и шрифтом. Объекты класса TСanvas авто-матически создаются для всех видимых компонентов, которые должныуметь нарисовать себя. Они инкапсулируют объекты Font, Pen, Brush, а так-же многочисленные методы, использующие эти объекты. Каждое свойство Canvas имеет воображаемое перо для рисования ли-ний и контуров. Свойство Pen (перо) определяет цвет и размер линий и гра-ниц фигур. Свойствами пера являются его цвет, размер (если это сплошнаялиния) или стиль. Работая с пером, вы можете прочитать (но не изменить)его текущую позицию (свойство PenPos). Позиция пера определяет исход-ную точку следующей линии, которую программа может нарисовать с по-мощью метода LineTo. Для изменения позиции вы можете применить методMoveTo канвы. Свойство Brush (кисть) определяет цвет очерченной поверхности.Кисть используется для закрашивания замкнутых фигур. Свойствами кистиявляются ее цвет, стиль и иногда растровое изображение. Свойство Font определяет шрифт, который используется методомхолста TextOut для написания текста в форме. Шрифт имеет имя, размер,стиль, цвет и т.п. 3.3. Черчение и рисование в системе Windows♦ Черчение – вы обращаетесь к канве и вызываете некоторые ее методы. Поскольку изображение не сохраняется, форма может частично или це- 49 ликом потерять свое содержимое (при закрытии окна формы другим ок- ном или при уменьшении размера окна формы ).♦ Рисование – это технология, которая позволит приложению перерисовы- вать всю ее поверхность при любых возможных условиях. Для вызова перерисовки можно использовать методы Invalidate, Up- Date, ReFresh и Repaint. 4. Порядок выполнения работы Задание № 1 1. После запуска DELPHI необходимо создать форму (если она не соз- дана автоматически) с помощью меню File&bsol;New Application. Далее необходимо создать свою папку, в которой нужно сохранить проект и модуль. 2. Поместить в форму меню Color (на странице Standart Палитры Ком- понентов есть объект MainMenu) c командами PenColor и BrushColor, которые будут соответственно изменять цвет пера и кисти с помо- щью стандартной диалоговой панели (рис. 5.1). Рис. 5.1. Размещение меню в форме 3. В форме реализовать согласно варианту индивидуального задания рисование окружностей, эллипсов и прямоугольников различных размеров и цветов с помощью мыши, используя свойство Canvas формы. 5. Варианты индивидуальных заданий Вариант 1 Реализовать рисование так, чтобы по нажатию мыши (щелкая левойкнопкой и удерживая ее при перемещении мыши по горизонтали и вертика-ли) рисовался эллипс нужного размера и цвета, а используя ту же техноло-гию и удерживая клавишу SHIFT, можно было рисовать прямоугольники не-обходимого размера и цвета. 50 Вариант 2 Реализовать рисование так, чтобы по нажатию мыши (щелкая левойкнопкой и, удерживая ее при перемещении мыши по горизонтали и вертика-ли) рисовалась окружность произвольного радиуса и цвета, а используя туже технологию и удерживая клавишу ALT, можно было рисовать отрезкиразличной длины и цвета. Вариант 3 Реализовать рисование так, чтобы по нажатию мыши (щелкая левойкнопкой и удерживая ее при перемещении мыши по горизонтали и вертика-ли) рисовалась окружность произвольного радиуса, а щелкая правой кноп-кой мыши и удерживая ее, можно было нарисовать эллипс любого размера ицвета. Вариант 4 Реализовать рисование так, чтобы по нажатию мыши (щелкая левойкнопкой и удерживая ее при перемещении мыши по горизонтали и вертика-ли) рисовались отрезки произвольной длины и цвета, а используя ту жетехнологию и удерживая клавишу CTRL, можно было рисовать прямоуголь-ники различного размера и цвета. Вариант 5 Реализовать рисование так, чтобы по нажатию мыши (щелкая левойкнопкой и удерживая ее при перемещении мыши по горизонтали и вертика-ли) рисовалась окружность произвольного радиуса, а щелкая правой кноп-кой мыши и удерживая ее можно было нарисовать квадрат любого размераи цвета. 5.1. Некоторые подсказки для реализации этой задачи Один из вариантов экрана, полученный после работы программы, пред-ставлен на рис. 5.2. Рис. 5.2. Результат работы программы 51 1. Запишите следующий код для события OnMouseDown: if Button = mbLeft then begin Center.X := X; Center.Y := Y; if ssShift in Shift then Circle := False else Circle := True; end; Поле формы Circle типа Boolean определяет вид фигуры. Значения коор- динат центра фигуры записываются в поля формы Center типа TPoint. Это будет выглядеть так: var Form1: TForm1; Center, Radius: TPoint; Circle: Boolean;2. Запишите следующий код для события OnMouseUp : Radius.X := abs(Center.X-X); Radius.Y := abs (center.Y-Y); if Circle then Canvas.Ellipse(Center.X-Radius.X, Center.Y-Radius.Y, Cen- ter.X+Radius.X, Center.Y+Radius.Y) else Canvas.Rectangle(Center.X-Radius.X, Center.Y-Radius.Y, Cen- ter.X+Radius.X, Center.Y+Radius.Y); 3. Запишите следующий код для события OnMouseMove: Caption: =Format ('Координаты: x=%d, y=%d ' , [X, Y]); Запустите приложение. Если все сделано правильно, то вы будете на- блюдать изменение координат в заголовке формы при продвижении мыши (рис. 5.3); сможете рисовать окружности и эллипсы нужного размера (щел- кая кнопкой и удерживая ее при перемещении мыши по горизонтали и вер- тикали); сможете рисовать прямоугольник нужного размера, используя ту же технологию и удерживая клавишу Shift. 52 Рис. 5.3. Вывод координат в заголовке Задание № 2 Начиная с оператора if, код для события OnMouseUp перенести в коддля события OnPaint. 1. В код для события OnMouseUp вставить в конце вызов метода Invali- date ( который вызывает косвенно метод FormPaint, связанный с событи- ем OnPaint). Это будет выглядеть так: begin Radius.X:=abs(Center.X -X); Radius.Y:=abs(Center.Y-Y); Invalidate; end; 2. Запустить приложение. При правильном выполнении всех инструк- ций, в форме будет рисоваться только одна фигура (рис. 5.4). Рис. 5.4 Нарисована только одна фигура 3. Выполните первое задание для компонента PaintBox. На странице System Палитры Компонентов есть объект TPaintBox, ко-торый можно использовать для построения приложений типа графическогоредактора или, например, в качестве места построения графиков. Никакихключевых свойств, кроме Canvas, TPaintBox не имеет, собственно, этот объ-ект является просто канвой для рисования. Важно, что координаты указате-ля мыши, передаваемые в обработчики соответствующих событий(OnMouseMove и др.), являются относительными, т.е. это смещение мышиотносительно левого верхнего угла объекта TPaintBox, а не относительнолевого верхнего угла формы. 4. Изучите возможности компонента Shape. На странице Additionally Палитры Компонентов есть объект TShape. 53 TShape - простейшие графические объекты на форме типа круг, квадрати т.п. Вид объекта указывается в свойстве Shape. Свойство Pen определяетцвет и вид границы объекта. Brush задает цвет и вид заполнения объекта.Эти свойства можно менять как во время дизайна, так и во время выполне-ния программы. Задание № 3 Постройте график функции, значения которой вы рассчитывали в лабо-раторной работе № 1. 6. Результаты работы В результате выполнения лабораторной работы студент должен проде- монстрировать преподавателю готовые проекты графических программ, файлы форм и исходный код модулей. 54 СПИСОК ЛИТЕРАТУРЫ 1. Фаронов В.В. Delphi 3. Учебный курс. М.: "Нолидж", 1998. 400 с.2. Культин Н. Программирование на Object Pascal Delphi 5. СПб.: BHV - Санкт-Петербург, 2000. 464 с.3. Эндрю Возневич. Delphi. Освой самостоятельно: Пер. с англ. М.: Вос- точная Книжная Компания, 1996. 736 с.4. Турбо Паскаль 7.0. Киев: Издательская группа BHV, 1998. 448 с.5. Шилдт Г. Самоучитель С++, 3-е издание: Пер. с англ. СПб.: BHV - Санкт-Петербург, 1998. 688 с.6. Сергиевский М.В., Шалашов А.В. Турбо Паскаль 7.0: Язык, среда про- граммирования. М.: Машиностроение, 1994. 254 с.7. Канту М. Delphi 2 для Windows 95/NТ. Полный курс. В 2 т. Т. 1: Пер. с англ. М.: Малип, 1997. 400 с. 55 ОГЛАВЛЕНИЕ ЛАБОРАТОРНАЯ РАБОТА №1 ................................................................ 3 РАЗРАБОТКА ПРОСТОГО ПРИЛОЖЕНИЯ DELPHI .............................................. 3 1. Цель работы ......................................................................................... 3 2. Домашнее задание ................................................................................ 3 3. Основные понятия и приемы.............................................................. 3 4. Порядок выполнения работы ............................................................ 13 5. Варианты индивидуальных заданий ................................................. 15 6. Результаты работы.......................................................................... 15 ЛАБОРАТОРНАЯ РАБОТА № 2 .............................................................. 16 ОБРАБОТКА ИСКЛЮЧИТЕЛЬНЫХ СИТУАЦИЙ В DELPHI. ВОСПРИЯТИЕ ВВОДАОТ ПОЛЬЗОВАТЕЛЯ .............................................................................................. 16 1. Цель работы ....................................................................................... 16 2. Домашнее задание .............................................................................. 16 3. Основные понятия и приемы............................................................ 16 4. Порядок выполнения работы ............................................................ 19 5. Варианты индивидуальных заданий ................................................. 21 6. Результаты работы........................................................................ 22 ЛАБОРАТОРНАЯ РАБОТА № 3 .............................................................. 23 СОЗДАНИЕ И ОБРАБОТКА МЕНЮ................................................................... 23 1. Цель работы ....................................................................................... 23 2. Домашнее задание .............................................................................. 23 3. Основные понятия и приемы............................................................. 23 4. Порядок выполнения работы ............................................................ 24 5. Варианты индивидуальных заданий ................................................. 25 6. Результаты работы.......................................................................... 38 ЛАБОРАТОРНАЯ РАБОТА №4 ............................................................... 39 КЛАССЫ И МОДУЛИ ...................................................................................... 39 1. Цель работы ....................................................................................... 39 56 2. Домашнее задание .............................................................................. 39 3. Основные понятия и приемы............................................................. 39 4. Порядок выполнения работы ............................................................ 42 5. Варианты индивидуальных заданий ................................................ 46 6. Результаты работы........................................................................ 47 ЛАБОРАТОРНАЯ РАБОТА № 5 .............................................................. 48 ПОЛУЧЕНИЕ ВВОДА ОТ МЫШИ. РИСОВАНИЕ В ФОРМЕ ................................ 48 1. Цель работы ....................................................................................... 48 2. Домашнее задание .............................................................................. 48 3. Основные понятия и приемы............................................................. 48 4. Порядок выполнения работы ............................................................ 50 5. Варианты индивидуальных заданий ................................................. 50 6. Результаты работы.......................................................................... 54 СПИСОК ЛИТЕРАТУРЫ .......................................................................... 55ОГЛАВЛЕНИЕ ............................................................................................. 56 57