Практикум по Delphi для решения прикладных задач
учебное пособие для студентов специальности «Прикладная информатика (в экономике)» Учебное пособие представляет собой сборник программ и задач для самостоятельного решения в среде разработки Delphi. Рассмотренные решения задач различной степени сложности демонстрируют возможности среды разработки Delphi7.
Учебное пособие будет полезно студентам вузов технических специальностей, а также школьникам старших классов, учащимся колледжей, студентам техникумов.
2
Введение
Язык формирует наш способ мышления и определяет, чем мы можем мыслить. Б.Л. Ворф
Визуальный язык программирования формирует наше воображение и определяет, что мы можем себе представить.
В традиционной процедурной модели программирования выполнение программы начинается с первой строки и следует стандартным путем с вызовом, по мере необходимости, тех или иных процедур. В объектно-ориентированных языках реализуется событийно-управляемая модель программирования, т.е. программа выполняется, не следуя строго определенным путем, а в зависимости от того, какие наступают события.
Эти события вызываются либо действиями пользователя, либо сообщениями от системы. Таким образом, последовательность выполнения запущенной программы определяется последовательностью событий. При последующем запуске программы последовательность может быть иной.
В мире существует несколько различных сред визуальной разработки: Visual Basic, Delphi, Borland С++ Builder и другие. Каждая рассчитана на свой язык программирования, от которого зависят правила записи программ. Готовая программа состоит из операторов этого языка, причем часть этих операторов записывают вручную, а часть операторов система программирования подставляют автоматически.
Системы визуального объектно-ориентированного программирования предоставляют разработчику множество средств для создания объектов и настройки их свойств и методов. Свойства объектов всегда имеют названия, процесс настройки можно выполнять с помощью специальных графических средств, не прибегая к ручному кодированию. Эта особенность визуальных систем разработки значительно повышает производительность программиста и делает создание больших программ достаточно простым.
Мы будем использовать одну из самых мощных систем визуальной разработки программ — среду Delphi. Язык программирования, который использован в ней, называется 0bj ect Pascal (Объектный Паскаль).
З
1. Идеология объектно-ориентированного программирования
Объектно-ориентированное программирование (object-oriented programming) или событийно-управляемое программирование (event-driven programming) — программирование, направленное на объекты. Объект (object) — это все то, что нас окружает, и с чем мы можем взаимодействовать. Объекты могут быть информационными и материальными.
В программировании мы имеем дело с созданием моделей информационного типа, отражающих (описывающих) свойства и поведение некоторых реальных объектов. В визуальном объектно-ориентированном программировании в качестве объектов могут выступать и объекты самого языка.
В каждый момент времени объект
характеризуется присущим именно ему набором свойств (properties) и методов
(methods) — операций, совершаемых над другими объектами или данным объектом, а
также реагирует на события (events)![]()
Если взять набор объектов, как правило, одного и того же типа, хотя и не обязательно, то мы получим семейство или коллекцию (collection), которая в свою очередь, тоже является объектом. Чтобы обращаться к элементам коллекции, каждому объекту присваивается уникальное имя или номер.
Способность реагировать на определенные события — это разновидность свойства. При возникновении события производится его обработка. Объекты, используемые в компьютерных программах, реагируют на события. При возникновении события происходит автоматический запуск специального метода — обработчика данного события. С помощью событий обеспечивается взаимодействие программы с пользователем. События, связанные с действиями пользователя, называются пользовательскими. Кроме пользовательских событий в программах происходят программные события.
Объединение в объекте его свойств и методов называют инкапсуляцией (encapsulation). Инкапсуляция означает, что объект инкапсулирует (содержит) в себе свойства и методы, но описывать мы ничего не должны. Под термином «инкапсуляция» подразумевается то, что мы работаем (взаимодействуем) с объектом, совершенно не зная об его устройстве. Синонимом инкапсуляции может служить термин «сокрытие информации» (information hiding) о конструкции объекта. Итак, объект можно определить как продукт инкапсуляции данных вместе с кодом, предназначенным для их обработки.
1.1. Элементы интерфейса программы
Delphi — интегрированная среда разработки (Integrated
Development Environment ![]()
ТЕ). Delphi дает возможность создавать программы в стиле
визуального конструирования формы, разместив на ней какие-либо визуальные
элементы. Delphi имеет сложный интерфейс![]()
В Delphi имеются 10 окон, но после
загрузки появляются четыре окна:
главное окно Delphi - <имя
проекта>• ![]()
окно с формой для проектирования
приложения Forml (окно проектировщика формы);
окно инспектора
объектов 0bj ect Inspector• ![]()
окно редактора кода Unitl .pas.
В главном окне реализуется основные
функции управления проектом создаваемой программы. Главное управляющее окно
системы Delphi обычно располагается в верхней части экрана. Оно содержит
средства управления созданием программы и выглядит наиболее загруженным из всех
окон Это окно содержит:
строку заголовка;
строку меню;
панель
инструментов•
4
палитру компонентов![]()
Строка
главлого охла
отображает гкмя открытого в данги.1П мометгт проекта
. Под СЈТОКО;Й
заголовка окна системы располагаејся строка мен ю» содержащая команды системы
0elphj.
|
|
||
|
|
|
ГЕЛЯ |
|
|
||
|
|
||
|
|
||
|
|
||
, : пуск
Рис. 1![]()
Строко мето содержит комак.ды, необходимые
для разработки тестмровакия (јрјтложений„
так как любое
меню
Wi:jd0ws. — эго очень важный элемент управления „любой программы или скстемьг.
Кроме стропт меню программы обычло содержат другке элемелти управлелия:
комакдпые :ккопкщ хлопот инсзтумењтов и
Кнопками удобно
лолн.зонатьс.я для исполнения операнмйг но не для
всякой олеращш есть
КНОГКщ а только детя тех, которые встречаются особенно ЧЕТСТО- Зато с помощь•о
строки метио мотто кайтм -лаэбуаэ коматду, па. которую система слособка![]()
Под строкой меню располагаются
мнептругчеитое с кнопками. Во многих программах
только одна такая
панель, но е системе Delphi их несколько. Панели инструментов (јредна:значены
для вылолнения некоторых команд
славным мемо. Кно панелей инструментов
обеспечивают доступ к наиболее часто встречаюг.лщмся командам. Чтобы узлатъ,
как лазывается та млн иная кнопка, кадо ладестл да нее указатель
пока
рядом с НТТМ (ЈОЯНИ'Ј“СЯ всплывающая подсказка. ! Та этой
панел•т есщ в
частностщ кнопка сохранения проекта На диске, кнопка открытия проекта, топка
запуска
ка выполнелме![]()
Одна из панелей инструментов, ИмС1ОЩ1ХСЯ в
главном окне системы Delphi, заметно отлмчается от остальных- Это на.•нтро
компонентов- Палитра компонентов устроена в влде набора
Палијра
компонентов
множество вкладок. Каждая 33
содержит
свой набор комгонентов. Общее число комгонентов достигает нескольких сотен.
Совокупность наборов составляет библиотеку визуальных комполетпов •(Visual
Сотропеп$ [ЈЬтаз•у - УСТ.). Инееј“СЯ несколько
компонентовг каждая
33, которых
расположена на своей вкладке. С ПОМОЩЬю
палитры компонентов создаются экземпляры
компоке•лтод (ооъектьђ
ла форме![]()

РТС. 2![]()
Окно
объектное Irqspt.№tex}
отображж•т свойства какого-либо компонента, актмвлзировалкого щелчком мьшлъаэ,
самой формы. Имя актмтгзировамлого комлонелта
под заголонк0*.г Окна
Именно С инспектора
настраивают объекты, используемые в
программах. Это же окно кслользуется для выбора и настроим
сся5ыткй, на
которые будут реагкровать объекты нашей программы. С его помощью создаются или
выблраются нужные процедуры обработки,
Окно проектировщико «Ровны главлое место,
где происходттт сборка программы из
содержащихся н паџгтглге компонентов.
Сама форма — это уже готовая к выполнению программа. Вначале окно формы пустое*
но, создавая программу, в указанное место формы добавляются объекты лземлляры
комлонелта выбранного ткпа. Сетка
точек в окне формы поможет разместить
объекты ровно аккуратно. При работе программы ее не тын о-
Форма —
окна
будущей просраммы. Каждая программа содержит хотя бы одно окно следовательно.
одну форму. Поэтому при работе над программой окно формы мы вгкдмм ла экране
всегда. Заготовка первого окна назьтетея FormJ. Если в про:рамме будет дна
окнаг то заготовка будет называться ГО(1јј2 'гдк далее. Возможна замена
стандартного названия более подходящим для программы.
Последнее из открытых ОКОН содержит коб
проррсимы. Часть программы скстема Delphi формирует автоматнчесхн. Дакке,
«лустая» программа для W'indows собирается из
нескольких тысяч
операторов языка Pascal. Добавлттъ нужные операторы смстема De]phi начинает еще
до того, как программист лр•стулил к созданию своей программы.
|
Ur,t2 |
|
|
|
interfaoe uses
ty№e TF 0rraZ 0Xass (TF orm) privat.e
епа; Епп-т2 : ; ЈлпрЛ_e1nent
епа . 11 57 М odified lasert |
Рис. 4![]()
Добавляются операторы именно в этом окне. Некоторые операторы система Delphi добавит сама, другие мы введем вручную. Именно поэтому окно кода никогда не бывает пустым.
Для системы Delphi каждая незавершенная программа — это проект. Проект включает в себя множество файлов. Наиболее важными являются три файла: файл формы, файл кода и файл проекта.
Проект, состоит из:
• файла проекта Projectl .dpf,
• файла параметров проекта Projectl .dof,
• файла ресурсов проекта Project.res,
• файла настроек проекта Projectl .cfg,
• файла
описания формы Unitl .dfm![]()
• файла модуля формы Unitl .pas.
Файл модуля формы доступен для редактирования, именно он отображается в Редакторе Кода. Остальные файлы создаются Delphi автоматически. В процессе компиляции программы файлы преобразуются в исполняемый ехе-файл, который, по умолчанию, создается в той же папке, в которой расположен файл проекта.
В проекте могут быть задействованы несколько форм, а также дополнительные модули и файлы ресурсов, при этом схема компиляции остается похожей.
Для сохранения проекта нужно воспользоваться пунктом главного меню Save Proj ect
Чтобы не смешивать файлы разных проектов, желательно каждый новый проект сохранять в отдельную папку. Сначала предлогается ввести имя для модуля формы, а затем имя проекта.
Когда программа сохранена, можно начать написание новой программы. Для этого выберается пункт главного меню File New Application.
В результате на экране появляется пустая заготовка формы. Если же необходимо загрузить старую программу, нужно выбрать в главном меню Ореп Project либо воспользоваться кнопкой на панели инструментов и загрузить соответствующий файл проекта.
Вместе со средой Delphi поставляется более
сотни различных компонентов, а в Интернете можно найти тысячи. Они отличаются
по своему внешнему виду, функциям
способам реализации, требованиям к
аппаратной части и т.п., но, тем не менее, все они построены на едином
фундаменте, единой объектной основе.
Несмотря на различие форм и функций компонентов, их можно разбить на группы и классифицировать. Все компоненты можно разделить на визуальные и невизуальные. Визуальные, в свою очередь, делятся на оконные элементы управления и графические элементы управления.
Визуальные компоненты являются элементами управления, которые добавляются на форму: это кнопки, поля ввода, картинки, панели и т.д. Те из них, что предназначены для ввода данных, могут принимать фокус ввода, обеспечивая управление с клавиатуры.
Невизуальные компоненты служат в основном
для обеспечения более удобного доступа к определенным функциям системы. При
добавлении их на форму на ней появляется
иконка с изображением
компонента, невидимая во время исполнения программы. В этом и
заключается
их «невизуальность». Несмотря на это, некоторые из них служат для обеспечения
визуальных по природе эффектов. Например, к таким относятся компоненты меню и
диалоги.
Визуальные компоненты составляют интерфейс
программы. Визуальные компоненты
имеют много общих свойств и событий,
связанных, прежде всего, с их визуальным
отображением на форме.
Часть свойств отвечает за положение на
форме: отступ слева, отступ сверху, высота, ширина, выравнивание.
Некоторые определяют внешний вид: цвет, шрифт, заголовок. Некоторые задают поведение компонента во время исполнения программы: доступен, виден, курсор, подсказка.
Механизм событии позволяет связать действия пользователя с необходимыми действиями программы. События определяют всю структуру программы, поскольку фактически весь код, то есть, собственно работа программиста, пишется в обработчиках событий.
В Windows действия пользователя обычно сводятся к нажатиям мыши в определенных местах экрана, нажатию клавиш клавиатуры, переключению между окнами и компонентами. В соответствии с этим существуют и события, реагирующие на нажатие мыши и клавиатуры, переключение фокуса, активацию окон.
Кроме того, для каждого компонента могут существовать характерные для него события, на которые может потребоваться реакция и обработка, например, событие изменения текста в поле ввода.
Некоторые конкретные компоненты и их предназначение.
Для вывода надписей предназначен компонент Label![]()
Для ввода текста пользователем используется компонент Edit.
Для работы с несколькими строками используют Мето. Строки
хранятся в свойстве Lines.
Кнопка реализуется компонентом Button.
Для работы с пунктами используется CheckBox.
Для выбора текста из нескольких альтернатив предназначен
компонент СотЬоВох. Альтернативы хранятся в свойстве Items, аналогичном
свойству Lines у компонента Мето.
Для множественного выбора используется RadioGroup. Чтобы добавить
в него пункты, щелкните на кнопку свойства Items и введите названия пунктов.
Номер выделенного пункта соответствует свойству ItemIndex, нумерация с нуля.
Простейшим контейнером компонентов может служить компонент Panel.
На него можно поместить другой компонент, например, кнопку. При перемещении
контейнера передвигаются все находящиеся в нем компоненты.
Для работы с картинкой используется компонент Image. Картинку
можно загрузить, щелкнув на кнопку свойства Picture и выбрав сохраненную
картинку. Если загруженная картинка не совпадает по размерам с размерами
компонента, ее можно масштабировать, установив свойство Stretch либо изменить
размеры компонента, установив свойство AutoSize. Задний фон картинки можно
убрать, используя свойство Transparent![]()
Для графического оформления используется компонент Bevel. Его вид
можно настроить с помощью свойства Shape![]()
Ввод целых чисел с помощью мыши можно обеспечить с помощью
компонента TrackBar. Его основное свойство — Position.
А для отображения процесса длительных расчетов можно использовать
компонент ProgressBar. Его свойство Position отображает процент выполненной
работы.
1.2. Инспектор объектов
Каждый элемент управления, как и сама форма, обязательно имеет название. Название по умолчанию формирует сама система. Кроме того, практически все элементы управления также характеризуются текстовой информационной строкой надписью, которая первоначально совпадает с названием элемента. Например, кнопка на форме получает название и надпись Button1, а поле-надпись - название и надпись Label 1 . Эти надписи можно изменять.
Инспектор - одно из важнейших окон при
работе в дизайнере. С его помощью настраиваются всевозможные свойства объектов,
используемых в программе, а также возможные реакции программы на различные
действия пользователя с этими элементами
управления. Многие
составляющие части программы (прежде всего элементы управления) представляют
собой объекты. Они характеризуются наборами свойств и методами, вызываемыми в
различных ситуациях. У каждого элемента управления есть обязательно свойство
Name, с помощью которого можно определить название этого объекта (на самом деле
это название будет названием переменной в тексте программы, по которому к нему
можно обращаться!). А текстовая надпись элемента задается с помощью свойства
Caption. Некоторые свойства существуют практически у всех элементов управления,
а некоторые специфичны, так как предназначаются для определения конкретных
особенностей работы определенного элемента управления.
В Инспекторе показывается список свойств, связанный с текущим элементом, выделенным на форме. Как только изменяется значение какого-нибудь свойства в окне, внесенные изменения сразу же будут отражены и в главном окне дизайнера.
2. Три основных принципа ООН: наследование, инкапсуляция, полиморфизм
В объектно-ориентированном программировании объекты объединены в классы. Класс — это проект, план строения конкретных объектов. Класс определяет, какие у данных объектов будут переменные состояния, и как они будут изменяться, какие будут методы и как они будут реализовываться. Класс нематериален, он не соответствует каким-то данным. В классе описано, какие переменные и с какими значениями могут быть у объекта. Могут быть, а не есть в данный момент. Ведь у разных объектов, относящихся к этому классу, значения этих переменных в данный момент, возможно, различны.
Объект же, наоборот, материален. Он занимает место в памяти компьютера, все его переменные имеют в каждый момент вполне определенные значения. Именно для конкретных объектов вызываются методы, хотя сами методы описаны в классе, к которому принадлежит данный объект.
Для этого служит механизм наследования один из трех основных принципов объектно-ориентированного программирования.
Наследование дает огромные преимущества и
значительно облегчает программирование. Оно позволяет не только экономить время
при создании новых классов
но и дает возможность неограниченного
расширения и совершенствования уже существующих классов. Можно придать новые
функции классу, даже не зная деталей реализации самого объекта класса.
Некоторые свойства и методы доступны внешним объектам, а некоторые целесообразно спрятать для внутреннего пользования.
Этот принцип сокрытия второй принцип объектно-ориентированного программирования, называемый инкапсуляцией.
Одни переменные и методы, определяемые в разделе Интерфейс, доступны для чтения, изменения и вызова, называются опубликованными, а другие, определяемые в разделе Реализация, служат исключительно нуждам самого объекта и недоступны извне, они называются приватными.
При наследовании все параметры и методы,
описанные в родительском классе, переходят без изменений в класс-потомок. Но не
всегда требуется такое буквальное копирование. Иногда просто необходимо
переопределить уже существующий метод или
параметр. Для того
чтобы при вызове одинакового метода различные потомки вели себя поразному,
требуется замещение метода, описанного в классе-предке.
Замещать можно и переменные. В подобном разноликом поведении и заключается третий принцип объектно-ориентированного программирования — Полиморфизм.
С помощью полиморфизма потомки классов получают возможность переопределять действия, заложенные в предках.
![]()
Например, графические компоненты
управления в Delphi все наследуют от своего предка метод Перерисовки, но каждый
из них его замещает. В результате, когда Windows решает, что пора обновить окно
и вызывает для них метод Перерисовать, каждый компонент перерисовывается
по-своему.
В Delphi все классы наследуются от одного предка — базового класса TObject. Этот класс не только дает всем своим потомкам ряд нужных всем им методов, например, методы создания и уничтожения экземпляров класса, но и обеспечивает базовую совместимость любых объектов. Все компоненты в Delphi — объекты. Можно создавать новые компоненты в Delphi.
События используются в Delphi для обеспечения определения программистом реакции на те или иные действия или запросы со стороны компонента.
Хотя описание обработчиков событий, по сути, является всего лишь полиморфным замещением методов, события в Delphi играют очень важную роль. Фактически вся программа — это описание обработчиков событий.
Программа Delphi не является сплошным
последовательным выполнением кода, как в Turbo Pascal. Здесь программа
реализует некоторый код только как реакцию на события
какие-то действия
пользователя (нажатие кнопок, движение мыши, закрытие окон и т.п.)
Когда
код, описанный в обработчике, заканчивается, программа не завершается. Для
завершения требуется, чтобы пользователь обычным в Windows способом закрыл
главное окно приложения либо, к примеру, нажал на сделанную кнопку, в
обработчике нажатия которой предусмотрен вызов процедуры Close.
3.
cnpaBRH
Button,
![]()
|
|
Visual Component Library Reference Help |
|||||
|
Dañn npaatca BatcnaAK.3 napžMETpbl Cnpaaxa |
||||||
|
cng.3EKL.i |
|
n eqaTb |
|
|
|
|
|
• VCL Reference TButton Propetties Methods Events Lisinq Tauton See Elsa |
||||||
|
Tautton is a push button control. Unit StdCtrls Description Use TBIJttan to put a standard push button on a form. TBIJtton introduces several properties to control its behavior in a dialog box setting. Users choose button controls ta initiate actions. To use a button that displays a bitmap instead of a label, use TBitatn. To use a button that can remain in a depressed position, use TSpeedautton. Note: Since the TButton caption is always centered, changing the Eli0i alignment has na effect |
||||||
PliC. 5-

|
|
e Visual Component Library Reference Help |
|||||
|
npaat;a Bar.naatca Cnpaetca |
||||||
|
cruaBKLd |
H asa.a |
neqaTb |
|
|
|
|
|
VCL Reference TButton Pra ertias Methads Events Uang--l-auttgn Sea also |
||||||
|
Hierarchy TObject TPersistent TCarnpanent TControl TVVinContral TButtonContral Tautton |
antral dard push button an a form. Tauttan introduces several properties ta control its tting. Users choose button controls to initiate actions a bitmap instead of a label, use TBitatn. To use a button that can remain in a Speedauttan. aptian is always centered, changing the BiDi alignment has no effect. |
|||||
|
|
||||||
PHC. 6.
![]()
IIP'I u.te:vtxe no
CCbUIKe «Properties» crrtçpaercs OKHO, B
K0Mnonen-ra. B Hncnewrope Oöa,eK'T0ß ceoÖ'CTt*a.
|
|
|
|
|
|
|
|
VCL Reference TButton properties ТВ|Лоп .glphabetic:allv |
Цеяеп< |
||
|
ln ТВиноп а C.arc:el а Def2Lllt ModalResult Deriued Тот TWinContol AlignDisabled .arlJE.h ClientOrigirl C..lientRect C..orltrEilCnurlt C..ontrals DuckC.lientCuunt |
|
|||
Пря щелчке по какому-нубуд» свойству получаем его опксанле. Чтобы вернуться к олисаллтаэ комгокеита, да;ккмалот на. ссылку.
|
Visual Component Library Reference Неф Файл Прввкв Звклвдкв Пврвметры Справка |
|||||
|
Вызов справки |
Цвзац |
Печать |
|
|
|
|
VCL Reference MinControl.AlignDisabled See also |
|||||
|
lndicates child control realignment disabled property AlignDisala led; Вап1еап; Description AhgnD:sahled returns True if chlld corltrol reahgnment has Ьееп ternporardy d:sahled бу а сан to DisableAlign. |
|||||
Рис. S![]()
Аналогкчно МоЖНО получкть информацттн:т о
методах и событл•ях компонента,
щелкнув по соответствующей ссылке.
Если нужно получить справку по какому-то
ключевому словуе типу, процедуре,
классу т.п., необходимо поставить
текстовый курсор посреднне интересующего слова в коде
1 .
Дл; функции дается кратное описание,
указывается модулье в котором она объявлена, даются непользоваштя,
часто можно посмотреть пример Ехаллр[е![]()
Таконец,
(ЈОМО(ИЬ в написанитт лрограммы мо>к€г оказать комбинаијтя![]()
Эта комбинация клавиш подсказывает, хаме
методы, свойства, процедуры
г п. мокло написать дальше-
Пря выборе из списка и нажатия E13tev текст автоматически вводится-
44 Структура программы
Модуль хода (№nit) делится ла две части нитерфейе (interface) реализацию
![]()
Раздел interfaee• ![]()
uses:
подключаемые модули, в которых содержатся используемые лроцедуры,
фунюлјти.
классы “(“. (Ј .
Ормттруејся ан:гоматичес.ки в зависимости
от добавленных в форму компонентов
type• олиса•лтя типов. Атоматкчески в
этом разделе описал класс вашей формы.
var: описание
глобальных переменных. Автоматически тут описана переменная типа описанного
класса формы. В этой переменной во время работы программы хранится указатель на
экземпляр формы.
const: описание констант. Этот раздел
автоматически не создается, однако может быть легко добавлен. Раздел
implementation:
Здесь также можно добавить uses.
С помощью {$R}
подключаются файлы ресурсов. Автоматически подключен файл dfm, имеющий то же
имя, что и файл модуля и потому подключаемый как *.dfm. В этом файле хранится
информация о форме — расположение и настройки компонентов, помещенных в форму,
и т.п.
Раздел содержит
описание реализаций процедур и функций. Автоматически тут создаются обработчики
событий. Здесь описывается реализация необходимых в программе процедур, функций
и методов классов.
Все то, что касается объявления доступных из других модулей переменных, констант, процедур, типов, классов и т.п., должно быть описано в разделе interface. В этой части программы, которая создается автоматически, в разделе uses перечисляются используемые модули, в разделе type описывается класс формы — потомок класса TForm, а в разделе var описывается глобальная переменная, в которой будет храниться указатель на объектэкземпляр формы. Соответственно, если надо подключить какой-то свой модуль, то необходимо добавить его в раздел uses. При описани нового типа его добавляют в раздел type до или после класса формы. Если нужно описать глобальную переменную, то ее добавляют в раздел var, а если нужна константа — создается дополнительно раздел const. В свою очередь, в разделе implementation сначала указывается ссылка на файлы ресурсов, а затем описываются реализации процедур и функций как создаваемых автоматически обработчиков событий, так и добавляемых по необходимости. Вначале эта часть пуста, но она будет заполняться во время написания программы.
При добавлении компонента в форму автоматически модифицируется код модуля — в описании класса формы появляется переменная, хранящая ссылку на добавленный компонент.
При создании обработчика события (при нажатии на компонент, помещенный в форму, создается обработчик основного события а остальные создаются с помощью
Инспектора Объектов) в коде
происходят следующие изменения ![]()
в разделе implementation создается пустой
обработчик, который вы потом заполняете ![]()
в классе вашей формы
создается описание этого метода (обработчики событий являются методами);
если
не создавать обработчик через страницу Events Инспектора Объектов (или двойным
щелчком по компоненту), а просто написать в коде процедуру-обработчик, то он не
будет должным образом связан с компонентом, и событие не сработает.
Если изменить имя компонента, то изменятся имена и обработчиков событий, которые с ним связаны.
Если необходимо изменить название
обработчика, то надо воспользоваться
Инспектором Объектов. Переименовывая здесь
имя процедуры обработчика, корректно автоматически изменяются также и ссылки на
эту процедуру .
Если необходимо удалить какой-то
обработчик, то удалите весь код внутри
процедуры. При следующем запуске программы
все пустые процедуры автоматически корректно удаляются. Компилятор
автоматически удаляет пустые процедуры при запуске. При удалении всей процедуры
описание и ссылки на нее останутся, а удаление их всех
требует времени и
аккуратности.
При удалении компонента не удаляются процедуры-обработчики его событий. Это связано с тем, что один и тот же обработчик может использоваться для разных компонентов.
13
В случае, если нужно удалить эти оставшиеся обработчики, удалите код внутри них и запустите программу.
Проблема обеспечения гарантированного выполнения некоторых действий решается наличием специального события 0nCreate. Это событие формы. Оно возникает тогда, когда форма создается, а поскольку главная форма создается в самом начале работы приложения, то и код, описанный в обработчике данного события, выполнится один раз и в самом начале. В обработчике события 0nCreate можно описать процедуры и функции инициализации, присваивать нужные значения глобальным переменным и т.п.
Раздел implementation предназначен не только для обработчиков событий. В этот раздел добавлять в него свои собственные функции и процедуры. Необходимо помнить, что они должны идти раньше процедур и обработчиков, из которых вызываются, или объявить их в разделе interface. В последнем случае эти функции и процедуры будут доступны для вызова из других модулей.
Существует также важная тонкость использования собственных функций: все обработчики событий имеют в своем названии имя формы: procedure TForm1 .FormCreate(Sender: TObject);
Это указывает на то, что работают с классом формы TForml и описывают методы для нее. Из обработчика просто обращаются к компонентам формы (класс формы «знает» о наличии компонентов на ней и имеет к ним непосредственный доступ), например:
MyGrid.RowCount := Num,
Когда описывается собственная процедура, то она «ничего не знает» о компонентах формы, и поэтому нужно обращаться к компонентам через форму, а, не минуя ее.
5. Методы отладки и борьбы с ошибками
От ошибок никто не застрахован, и они случаются даже у опытных программистов. Таким образом, все сводится к тому, чтобы их поскорее обнаружить. Допустим, сделана опечатка и неправильно написано какое-нибудь ключевое слово. В этом случае при попытке запуска программы внизу появляется окно, в котором отображены сообщения об ошибках. При этом программа не запустится. Благодаря подсказке такую ошибку легко найти и исправить.
Частой ошибкой начинающих является пропуск конструкции begin — end в цикле. При этом имеется в виду, что в цикле должны выполняться, например, обе команды, но на самомто деле в цикле, конечно, будет выполняться только первая, а вторая выполнится только один раз — потом, когда программа выйдет из цикла. При попытке запуска появляется сообщение. Но это не ошибка, а предупреждение. В нем обращается внимание на то, что параметр цикла после выполнения цикла может быть неопределенным (он присутствует во второй команде).
Однако, несмотря на предупреждение,
программа может запуститься. Если вводятся
дкакие-либо данные, то
появляется сообщение об исключительной ситуации — exception. При этом программа
приостанавливается, переходя из режима исполнения в режим отладки.
Чтобы
перейти к обычному редактированию кода, лучше остановить программу. Это можно
сделать с помощью команды Program Reset. Затем можно поправить ошибку и вновь
запустить программу .
В большие программы всегда закрадываются
ошибки. Их надо быстро и квалифицированно найти и исправить. Механизм
исключительных ситуаций (exception)
одно из больших достоинств Delphi. С их
помощью вы можете контролировать возникновение ошибок и создавать в результате
устойчивые к ошибкам программы.
По мере знакомства с языком и средой
программист проходит несколько этапов. На первом этапе он, по незнанию, путает
типы, забывает ставить знаки препинания (например, точку с запятой в конце
строки), некорректно использует операторы и т.п. В результате написанный им код
в принципе невозможно исполнить. И это хорошо
поскольку допущенные им
ошибки оказываются автоматически выявленными на этапе компиляции, более того,
часто среда программирования сама подсказывает, какая ошибка допущена, и, что
важно, указывает строку, которую нужно поправить. По мере изучения языка и
борьбы с синтаксическими ошибками программист плавно переходит к следующему
этапу. Теперь он уже не делает таких простейших ошибок, но, поскольку сложность
его программ возрастает, возрастает и вероятность совершения им ошибки, при
которой программа все равно запустится. Поскольку, с точки зрения компилятора,
явной ошибки нет, а некоторые странности кода, по-видимому, являются замыслом
программиста. Однако компилятор все-таки сообщает об этих странностях с помощью
предупреждений (Warning)
Советуем всегда обращать на них внимание,
проверять при их появлении, нет ли ошибки, и вообще стараться писать код так,
чтобы не было предупреждений. Опасность таких скрытых ошибок состоит:
1) в том, что они таятся в той части кода, которую программист написал и уверен, что она правильная (программа запустилась), а значит, и не очень внимательно будет искать ошибку;
2) в том, что проявляется эта ошибка совсем в другом месте кода — не в том, в котором допущена. А это приводит к долгим поискам ее по всей программе.
Наконец, когда программист становится уже опытным и приступает к сложным проектам, связанным с использованием объектов, указателей и т.п., на его пути стоят еще более опасные ошибки, о которых компилятор не выдает даже предупреждений. А ошибки эти весьма серьезные, поскольку они, в основном, связаны с некорректной записью в память и могут привести к непредсказуемым последствиям.
При возникновении исключительной ситуации можно проигнорировать ее и запустить исполнение программы дальше, нажав F9. В этом случае программа выдает сообщение об ошибке. Необходимо найти ошибку — понять, в какой строке и почему происходит сбой. Для этого можно воспользоваться трассировкой. Для того чтобы определить первую строчку, начиная с которой будет проводиться трассировка, нужно поставить Breakpoint— точку останова.
Когда исполняемый код доходит до точки останова, исполнение программы приостанавливается, и надо перейти в режим отладки. В режиме отладки можно исполнять последовательно программу по шагам, контролировать и изменять значения переменных и т.п. Этот режим служит для обнаружения и ликвидации ошибок. В этом случае появляется возможность просмотреть или изменить текущие значения переменных, однако изменение кода во время отладки невозможно. Измененный текст заработает только после перезапуска программы.
Чтобы выполнить текущую строку, на которой
стоит курсор отладки, нажмите F7 или F8. Строка выполнилась, и курсор
сместился. Если необходимо перейти к следующей строке, то можно нажать F8, если
нужно зайти в какую-либо функцию, то нажимают клавишу F7 и продолжают
трассировку .
Для того чтобы в ходе отладки узнать значение той или иной переменной, нужно просто подвести к ней курсор. Появится hint со значением этой переменной.
Это, однако, работает не со всеми переменными, а только с доступными в данный момент. Если нужно постоянно контролировать значение переменной, то еще проще добавить ее в список Watch. Для более основательного слежения за значениями можете воспользоваться Списком Наблюдения (Watch List, Ctrl+F5).
Таким образом, при программировании среда Delphi может находиться в различных режимах:
Режим редактирования
режим, в котором редактируется код проекта, модифицируется форма, добавляя на
нее компоненты и настраивая их свойства. Это основной режим.
Режим исполнения
программы — режим, в который среда переходит, как только нажата клавиша F9 и
был построен ехе-файл. Фактически, в этом режиме происходит
15
как раз исполнение получившегося ехе-файла проекта.
Программа исполняется так, как если бы ее вызвали не из Delphi, а просто из
Windows![]()
Режим отладки — в этот режим можно перейти из режима исполнения
программы.
При этом программа будет приостановлена (но не остановлена
совсем)![]()
Чтобы продолжить трассировку
(последовательный переход от команды к команде)
можете воспользоваться
клавишами:
F9 (Кип) — продолжить программу, не трассируя ее.
F8 (Step over) — выполняется текущая строка кода, и переходят к
следующей строке.
F7 (Тисе Into) то же, что и F8, с тем отличием, что если в
текущей строчке содержится вызов какой-либо функции или процедуры, то попадают
внутрь этой процедуры и трассируют ее до конца, затем из нее возвращаетс и
переходят к следующей строке (на которую перешли бы сразу, если бы нажали F8)![]()
F4 (Run to Cursor) переход в режим исполнения программы до тех
пор, пока не должна будет выполнена строка, на которой стоит текстовый курсор
(аналогично тому, как если бы была установлена точка останова)
Shift+F8 (Run Until Return) — процедура выполняется до конца.
Ctrl+F2 (Program Reset) — остановка трассировки и переход в режим
редактирования кода. (Иногда целесообразнее, если это не грозит ошибками,
продолжить исполнение программы (F9) и выйти из нее нормальным образом, закрыв
главную форму).
При работе в Delphi сообщение об ошибке фактически появляется дважды: сначала выводится окно об исключительной ситуации и программа приостанавливается, а потом, если нажать F9 (F8, F7 и т.п.) возникает стандартное сообщение об ошибке Windows. Итак.
1 Произошла ошибка.
2. Программа приостанавливается.
3. Выводится
сообщение об exception. Это сообщение для программиста. Среда Delphi сообщает,
что программа не в состоянии выполнить какую-то свою команду. Программист не
предусмотрел возможность исключительной ситуации. Среда Delphi приостанавливает
программу, чтобы программист разобрался, где и в чем ошибка
Отключить
приостановку (2)—(3) можно, сняв флажок Мепи Tools => Debugger
0ptions =>
Language Exceptions Stop оп Delphi Exceptions![]()
4
Нажатие клавиши F9 (F8 F7 или др.)![]()
5 Выводится сообщение об ошибке. Это сообщение для пользователя программы (ситуация запуска приложения не из Delphi, а через ехе-файл из Windows, т.е. не существовует пунктов 2, 3 4).
6. Программа продолжается (при этом она не сумела выполнить ту часть, в которой произошла ошибка, и значит, если эта часть важная, продолжение может сопровождаться дальнейшими ошибками).
Механизм обработки исключительных ситуаций заключается в том, что если произошла ошибка (1) и не надо выводить (5), предпринимаются действия, чтобы (6) исполнялось корректно. Для этого «опасная» команда (или целый блок) помещается внутрь конструкции try. .except.. end или try. .finally. .end.
Блок try..finally..end используется аналогично try..except.., но с тем отличием, что блок команд между finally и end выполняется в любом случае, вне зависимости от того, было исключение между try и finally или нет.
Практическая работа 1
«Моя первая программа»
Цель работы -, создать
программу, выполняющую следующе действкя:
После запуска
появляется
окно.
|
|
Проект 1
|
|
Моя первая программа
|
|
Pwc. 9.
2. Для выхода яз программы
необходимо щелкнуть мышью на кнопке «Закрыть». Описание плана разработки
программы Т .
НОнЫЙ проект.
2. Разместить на форме экземпляры комлонентое: метку Label
и хнолк-у Bt'tton![]()
З. Выполмтть следуощке действия:
Таблица 1![]()
|
Выделенный объект |
|
|
Действгте |
|
|
F0rnt1 |
|
Properties |
Caption надпись |
Устаиовка имели формы «Проект]» |
|
Label1 |
S1at3ilardj |
Prope11ies |
Cap1i03j |
Ввод текста надписи «Моя ле вая п амма» |
|
AutoSize Автолодбо |
Ввод значен•л свойства: Тле |
|||
|
F011t C.olor |
Выб ать дает: clPur [е |
|||
|
ButtonI |
Propenies |
Сарпол |
Установка имени кнопки «Зак |
|
|
Events |
0nClick |
C10se; |
||
4. Сохранјтје проект. запустите
(лројес:гируГтге его.
paóora 2 Cmaamte![]()
1.1e.Nb paõ0Tb1 C03ÄflTb KOHCCE1bHYIO nporpaMMY.
I*tlaTb
K0Ma11,ay rutarmoro Memo File > New Other (cbaii:l
>
Apyroe),![]()
Allanor0BOM
0KHe va
New
BblÕPaTb
Console
Application (K0Hco:1bHoe
![]()
|
New Items
|
|||||||||||||||||||||||||||||||||||||||||||||||
Pvt. 10.
2. Ilocne ![]()

P"C. 11.
3 
P"C. 12![]()
4. Byeawe TCKCT nporpdMb1b1
KOZO.

5
K0Mauay Run.
pe•3YJ1bTaT.
HaxtTb Enter
Koaa.![]()

I'HC. 14.
З
«Приветствие»
|
Проект2 Первыеуспехи
|
программу,
выполняющую
после запуска программы по щелчку мышьто
па. кнопке «Иркветствле» лоявлуется
сообщение «Первые успехи».
Ряс. 15![]()
2 для выхода яз программы необходимо щелктсуть мнимо па. хлопке «Закрыть.». Описание плана разработки программы
1. Открыть новый проект.
2. Разместить
ла форме экземпляры комлолентов: метку Label две хлолки Виноп![]()
З. Выполн•пь следующие действия![]()
![]()
|
Выделенный объект |
Выла.». ()hiett [11.qxc[or |
|
Действие |
|
Form1 |
Ргорсгйе€ |
Сароол |
Установка имени формы «П оектЪ |
|
Labe11 |
Properties |
Сарпол |
Ввод текста надписи «Пе вые спехи» |
|
Вџ11оп 1 |
Properties |
Caption |
Установка имели «П кветствлеј} |
|
Evejjls |
OnClick |
спехи“ |
|
|
Button2 |
Ргорегйе€ |
Capti011 |
Установка имени кнопки «Зах ЫТЬ>Ј |
|
Events |
0“Click |
|
4. Сохраните проект, запустите
протестируйте его![]()
Задание для самостоятельного выполнения
1. Сделать шрифт вывод•тмой реллгтхм
«Первые усге:хк!» ОТЛИЧНЫМ ог стандартного по виду, цвету и размеру
Подсказки, В 0biect щелкнуть справа от названл; свойства Font.
2. Замелить вгкд «Выход» на. более пркв:текательвый.
пООС&'ОЗКО. Для замены кнопки удалтт•тн существующую. а
другую BitB1n найти н палитре компонентов на вкладке Additional. Затем изменить
ее вяд с помощью свойства
kind«
3. Сделать таке чтобы после нажатия кногют
«Приветствие» на экране лояжлялось сообщенне «Первые l• не![]()
ПОГ}СКФП'О. Изменить. значение свойства Caption метки I.abell
реакции кнопки
B“ttonl на событие 0nClirk„
JIncTHHr nporpaMMb1
unit Unitl
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons;
type
TForral =
class(TForm) Labell: TLabel![]()
Buttonl: TButton, BitBtnl: TBitBtn, procedure ButtonlClick(Sender: TObj ect);
public
{Public declarations } end;
Forml: TFonn1,
implementation {$R *.DFM)
procedure TForml.ButtonlClick(Sender: TObj ect); begin
Label I
H He nocneAHHe!
end; end.
4
«Случайный выбор»
программу, выполняющую
после
запуска
появляется кадпись «Брось кубик».
|
Бросок кубика |
|
|
|
|
Брось кубик
|
|||
Рис. Тб.
2. По (Иелчку
на кнопке «Брс№ок
кубика» (јоянляејся сообщение. выдаюитее числаочки в днагазоне О - б-
|
Бросок кубика |
|
|
|
|
|
5
|
||||
З. Для выхода 113 программы необходимо щелкнуть мышью на закрывающей кнопке в строке заголовка.
Описание плана разработки программы
1
Открыть новый проект![]()
2
Разместить па форме экземпляры компонетпод: метку Lnbe1 кнопку
Виноп
З. Выполнить следующие действия:
![]()
|
Выделенный |
|
|
|
|
|
Form1 |
Ргорсгйе€ |
Сароол |
Установка имени формы «Ь осок б ккл» |
|
|
1.nbelI |
Properties |
Сарпол |
Ввод текста надписи «Брось к бик» |
|
|
Вџ11опЈ |
Prope11ies |
Cap1i03j |
Установка имени «Б осок бика» |
|
|
Events |
0„Click |
.Са lntToSt л |
|
|
4. Сохраннте проект, запустттге и протестируйте егоФрагмент программы
ptoc«lure
wnr п: 1nteger;
begin n .= random (6) + I![]()
Label I
Caption := IntToStr (n)
end; end.
5. C03naTb cþYHKumo, 0T06pa)Karoruyro HHCJIOBb1e 3HaqeHH¶ rpaHeñ.
Function Kubic (Sides:lnteger): Integer;
Begin
If Sides I then begin
Result random (Sides) +1
end else begin Result
end,
5
Изменение заголовки формы
программу, выполняющую
1. 1“1осле
запуска программы ввесттк текст д текстовом поле.![]()
|
ПроектЗ Введите новый заголовок
|
Рус.![]()
2. По
(Иелчку МЫ!ЈЈНЈО на кнопке «Сменщть
окна» изменяется
окна![]()
|
Новый проект |
|||||||||
|
Введите новый заголовок
|
|||||||||
19.
З. Васстл новый текст в текстовом поле.
4. Изменгтгь
тдзвалие заголовка окка по лакатијо хладишл Елтег![]()
5. Для
выхода из программы
щелкнуть на закрывающей кнопке н строке
заголовка.
Описание (1,113143
программы
1. Открыть новый проект.
2. Разместлть
на форме экземпляры компонентов: метку L*hel, кнопку Button
текстовое поле
F.di1![]()
З. Выполнмть следующие действия![]()
Таблттла 4.
|
Выделенный объект |
В кладка окна 0ifect lns cct0T |
|
Действие |
|
|
Form1 |
Ргорегйе€ |
Сароол |
Установка имени формы «П оект-3*Ј |
|
|
LnbelI •(Вх,лад.ха S1at1dard) |
Properties |
Сарпол |
Ввод текста надписи «Внелттте новый 34t“OJtOHOk'3} |
|
|
EditJ |
Properties |
Тем |
ОЧИСТЛТЬ •Text |
|
|
Button1 тВк.:кцхз S1:.nd31dJ |
|
Cap1i01j |
Установка имени кнопки «Сменить заголовок окна» |
|
|
Default |
Выбрать в раскрывающемся СIЛТТСКе значение Т |
|||
|
Eve1jTs |
0,jC1ic14 |
готјпт са |
|
|
4. Сохраните проект, запустите
протестируйте его![]()
Задание для самостоятельного выполнения
Создать программу, выполкяаэщу•о следујощтке действия![]()
1
. После запуска программы отображаются: две строки для ввода
текущих курсов для евро и доллара; строка лая ввода денежной суммы в рублях;
две строки вывода
эквивалента н евро. долларах.
|
|
Пересчет денежной суммы Введите Т2К!ЩИЙ курс доллврв Введите ТЕКУЩИЙ курс евро
Введите денежнчю сумму в рублях
Сумма з долларах Сумма в евро
|
Рис. 20![]()
2 Ввести текущий курс для евро и доллара.
З. Ввести денежную сумму в рублях![]()
4. По
щелчку на «ПОДСЧ}ЈТДТЪ эквивалент» ВЫВОДиТСЯ денежная сумма в евро и долларах.![]()
5. Ввести
новый техущмП курс для евро доллара![]()
б. новую денежную сумму рублях.
7 По шелчку МЫШЬЮ на кнопке
«Подсчлтать
выводится новая денежная
сумма д евро
и долларах.
8. Для выхода 113 программы необходлмо щелкнуть мытые на закрывающей кнопке в строке заголовка.
6
«Двигающая кнопка»
программу, выполняющую
1. 1“lo щелчку МЫШЬю ла кнопке топка лкбо останавливается, либо двигается.
|
Двигающаяся кнопка |
|
|
|
|
|
|
||||
Рис. 21![]()
2. Для выхода из программы необходимо щелкнуть мышью на закрывающей кнопке в
строке заголовка.
Описание (4,113143
программы
1. Открыть новый проект![]()
2 Разместить ка. форме экземпляры
компонетпов: кнопку Btitton, таймер Timer. Ккогка включает и выключает таймер»
а таймер двигает кнолю,•![]()
З В ылолнить следующие демств•л:
Таблица 5.
|
объект |
|
имя события |
Действие |
|
Form1 |
Propertwes |
Caption |
Установка имени формы « вигалощаяс• |
|
I'imerl |
Propertwes |
Emhled |
Установлть
значение свойства Свойство Enah[cd определяете аклаэчел или выхл•очет' таймер (ло умолчаниюг ОН ВКЛЮЧеКј |
|
Тптегеа1 |
Свойство lntcwal определяет интер- вал мкллкеекупда.х между возникнонением событий |
||
|
|
Events |
0nTimer |
Butt0111.Lefi Butt0I11-Lcft ifButtonJ.Leti•:. 10 (hen .Le!i |
|
Вц1Топ1 |
Ptoper1ies |
|
Усвановка имени кнопки «Сменить. з“головок окна» |
|
Default |
Выбрать в раскрываюшемся спкске значите “Ггие |
||
|
Events |
0nClick |
“Iimerl .Enabled = пот “Iimerl .Enabled•, |
4. Сохрамтте проект, запустттте протестируйте его
Практическая работа 7
«Альбом»
Цель работы -, создать
программу, выполняющую следующе действкя:
после запуска
программы в окне изображается рисунок.
|
Альбом |
|
|
Рис. 22![]()
2. щелчку мышьто па рисунке появляется диалоговое окноЗ. Выбрать в открывшемся диалоговом окне любой другой рисунок.
Delph• Ь - Project1 (Нипп:пц]
|
|
lrtemet |
|
Samulesl ActiveX |
||||
|
*
|
|
|
|
'Wirl |
|||
|
|
дяьбог,1 СЕ деси • |
|
|||||
|
|
|
||||||
Рис. 23![]()
4. Для выхода мз лрограммы необходимо
щелкнуть мышью на закрывающей хнолке
строке залоговка.
Описание плана разработки программы
1.
Открыть новый проект![]()
2.
Разместить на форме экзем(јлиры коммонентон: панель Рапе] рису
нок Jntagev
диалоговое окно 0penDiaIog. З. Выло-ллить
следующие дейстдтл:
Таблица 6.
|
Выделенный объект |
Вкладка окна 0Wect Ins ector |
Имя свойства] имя события |
Действие |
|
|
Form1 |
Pro erties |
Са tion |
Установка имени |
о мы «Альбом» |
|
РапеП (Вкладка Standard) |
Properties |
Са tion |
Очистите значение свойства Са tion |
|
|
В evel 0uter |
Выбрать в раскрывающемся списке значение bvLowered |
|||
|
BevelInner |
Выбрать в раскрывающемся списке значение bvNone |
|||
|
BewelWidth |
П исвоить значение 2 |
|||
|
Width |
П исвоить значение 241 |
|||
|
Hei ht |
П исвоить значение 185 |
|||
|
Image1 (Вкладка Additional) |
Properties |
Left |
П исвоить значение 2 |
|
|
то |
П исвоить значение 2 |
|||
|
Width |
П исвоить значение 237 |
|||
|
Hei ht |
П исвоить значение 181 |
|||
|
Stretch |
Включить свойство True |
|||
|
Picture |
С помощью кнопки-построителя открыть диалоговое окно Picture Editor (Редактор изображений). Щелкнуть на кнопке Load (Загрузить) — откроется диалоговое окно Load Picture (Загрузка рисунка). Открыть папку C:\Windows и выбрать файл Лес. bmp, щелкнуть на кнопке Открыть. Вернуться в окно Редактора изображений, щелкнуть на кнопке ОК. |
|||
|
Imagel .Picture.LoadFromFile О enDialo 1.FileName |
||||
|
Events |
0nClick |
О enDialo 1.Execute |
||
|
0penDialog1 (Вкладка Dialogs) |
Properties |
Title |
Ввести текст: «Выбо изоб ажения» |
|
|
FileName |
Ввести полный путь доступа к файлу: C:\Windows\J1ec.bmp |
|||
|
Filter |
Ввести текст: Растровое изображение *.bm *.bm |
|||
|
DefaultExt |
П исвоить свойств значение: .bm |
|||
|
0ptions |
Подсвойству ofFileMustExit (Файл должен с ществовать п исвоить значение Т гие Да |
|||
4. Сохраните проект, запустите и протестируйте его.
Листинг подпрограммы procedure TForml .ImagelClick (Sender: TObject); begin
0penDialog .Execute;
Image .Picture.LoadFromFile (0penDialog .FileName); end;
Практическая работа 8
Работи с мето
Цель работы -
Создать программу, выполняющую следуюиже деистеия:
после запуска
в окне изображается
строка метио (Файл, Выход).
2. При выборе пункта меню Файл появляются пункты меню (Рисункщ Выход).
З. При выборе пункта меню
появляется
вложенное Метив, состоящее из двух
пунктов (Облака» Лес).

Р„с. 24.
4. По
щелчку правой кнопки МЫШИ появляется контекстное меню.![]()
5. Выбрать. (30 пункту друзой рисунок
|
|
Form1 |
|
Файл выход
|
|
Р„с. 25.
6. для выхода из программы лесбходимо щелкнуть мышьто па закрыва•ощей хлопке д строке заголовка.
7. Еслл
выбрать любой тв пунктов Выход работа лрограммы завершаетсяОписание (4,113143
программы
1. Открыть новый проект.
2. Разместлть
ка. форме экземпляры компонетпов: панель 1'anel, рисунок Image,
диалојхунсе
окно 0penDialog
З. Выполннть следующе деиствия:![]()
Таблица 7![]()
|
Выделенный объект |
Вкладка окна 0Wect Ins ector |
Имя свойства] имя события |
Действие |
|
|
Form1 |
Properties |
Caption |
Установка имени формы «Мое меню» |
|
|
Events |
0nMouseDown |
var р: TPoint; begin р.х р := ClientToScreen (р); РорирМепи1 .Рорир (р. Х, р. У); end, |
||
|
Зап стить едакто меню дважды щелк ть на значке меню на |
о ме |
|||
|
Form1.MainMenu1 |
Properties (в окне 0bjcct Inspcctor не выбран никакой объект |
Caption |
Ввести текст пункта меню Файл, и нажать Enter. Система присвоит ему имя ТЫ 1 |
|
|
Между существующими и будущими пунктами меню можно переключаться с помощью щелчка мыши или к со ных клавиш. |
||||
|
Form1.MainMenu1 |
Properties |
Caption |
Ввести текст пункта меню Выход, и нажать Enter. Система п исвоит е имя N2. |
|
|
Events (щелкнуть на пункте Выход в ст оке меню |
N2Click |
Close |
||
|
Щелкните на пункте Файл. Редактор меню создал еще одну заготовку под этим пунктом. Это заготовка для меню, которое откроется при выборе пункта Файл в работающей программе. Используя заготовки, создайте в этом меню два пункта: Рисунки (система присвоит ему имя N3) и Выход (N4). Выберите в редакторе меню пункт Рисунки и нажмите комбинацию клавиш Ctrl + Вп аво. |
||||
|
N4: ТМепипет |
Events |
0nClick |
Выберем из раскрывающегося списка уже существующую п оцед -об аботчик N2Click |
|
|
Form1.MainMenu1 |
Properties |
Caption |
Ввести текст пункта меню Облака, и нажать Enter. Система п исвоит е имя N5. |
|
|
М: ТМепииет |
Events (выбрать в строке меню на форме пункт Облака) |
0nClick |
Imagel .Picture.LoadFromFile
|
|
|
Form1.MainMenu1 |
Properties |
Caption |
Ввести текст пункта меню — Лес и нажать Enter. Система п исвоит е имя М). |
|
|
М»: ТМепииет |
Events (выбрать в строке меню на форме пункт Лес) |
0nClick |
Imagel .Picture.LoadFromFile ('C:\Wndows\J1ec.bmp'); |
|
|
Закройте окно редактора меню и убедитесь, что теперь строка меню появилась в основной форме программы. |
||||
П одолжение таблицы 7.
|
Выделенный объект |
Вкладка окна 0bject Inspector |
Имя свойства] имя события |
Действие |
|
РорирМепи (Вкладка Standard) |
Properties |
Caption |
Ввести текст пункта меню Облака, и нажать Enter. Система п исвоит ем имя N7. |
|
Caption |
Ввести текст пункта меню — Лес и нажать Enter. Система п исвоит ем имя N8. |
||
|
|
Events |
OnClick |
Выберем из раскрывающегося списка уже существующую п оцед -об аботчик N5Click |
|
м |
Events |
OnClick |
Выберем из раскрывающегося списка уже существующую п оцед -об аботчик N6Click |
|
Image Вкладка Additional |
Properties |
Stretch |
Присвоить значение Т гие |
4. Сохраните проект, запустите и протестируйте его.
Close, end
procedure TForml .N5Click (Sender:
TObject); begin
Image 1 .Picture.LoadFromFile (' С
'
у, end
procedure TForml .N6Click (Sender:
TObject)• begin
Image 1 .Picture.LoadFromFile (' С
bmp
' у, end
procedure TForm 1 .FormMouseDown
(Sender: TObject; Button: TMouseButton; Shift: TShiftState; Х. У: Integer); var p:TPoint; begin
Р ClientToScreen (р);
РорирМепиТ .Popup (р.х, р. У); end;
9
Случайный выбор списка
программу, выполняющую следующе
действкя:
программы в окне изображается тргк поля.
|
|
|
Писатель
|
Pwc. 26-
2.
|
Писатель
|
Рис 27![]()
3. Для
выхода 33
щелкнуть мышью на закрывающей н строке
заголовка.
Описание (4,113143
программы
1. Открыть новый проект.
2. Разместлть
на форме экземпляры комлонентов: поле со списком СотЬоВох, командная Виноп![]()
З. Выполнмть следующие действия![]()
Таблица 8.
|
Выделенный объект |
|
своЈКтв,'1.•' ими событи* |
Действие |
|||
|
Form1 СотЬоВоя1
|
Рто |
|
Са ti01'( |
Ус:анонха имени |
|
мы «Сочкните;лк.» |
|
Even1s |
О:јС.геа1е |
ComboBox3.1temIndex :=О |
||||
|
f'roperties |
Sty[e |
Выберкте значение cSOropOowTList мз аск СIЛИСК-а |
||||
|
ITMj'(S |
Щелкните на Отжроется окно S1riog l..i$1 Edi10f (Редактор списка строк)- Ввести пункты списка ло одному каждую строчку * з-аверијая ввод нажатием клавиши Er1ter После того как список готов, щелкнуть на кнопке ОК |
|||||
Il OAOJDKeHHe Ta6JIHUb1 8
|
BblAeJueHHb1ï1 06beKT |
BKJfflAKa OKHa Object Inspector |
HMSI CBOï1CTBa/ C06b1TH51 |
AeücTBHe |
|
ComboBox2 (BKnaAKa Standard) |
Properties |
Style |
Bb16epHTe 3HaqeHHe cSDropDownList H3 acK blBaF011-uerocq cnucKa |
|
Items |
IlleJIKHHTe Ha KHOFIKe nocTPOHTeJ1¶. OTKPOeTC¶ OKHO String List Editor (PenaKTop cnucKa CTPOK). BBecTH nyHKTb1 cnncKa no OAHOMY B CTPOHKY, 3aBep111aq BBOA HOKaTuerv1 KJuaBHUIH Enter. ITOCJ1e Toro KaK CITHCOK FOTOB, IUeJIKH Tb Ha KH011Ke OK. |
||
|
ComboBox3 (Brçnanrca Standard) |
Properties |
Style |
Bb16epHTe 3HaqeHHe cSDropDownList acK blBarorueroc51 cruncKa |
|
Items |
IlleJIKHHTe Ha KHomce nocTPOHTeJH. OTKPOeTC¶ OKHO String List Editor (PenaKTop CllHCKa CTPOK). BBecTH HYHKTb1 cnucKa no OAHOMY B CTPOHKY, 3aBep111aq BBOA HOKaTHer•v1 KJ1aBH111H Enter. Ilocne Toro KaK cr1HCOK FOTOB, I-UeJIKH Tb Ha KHOr-1Ke OK. |
||
|
Buttonl (BKJ1aAKa Standard) |
Properties |
Caption |
YCTaHOBKa HMeHH KHOFIKH |
|
Events |
OnClick |
Comb 0B ox I. Itemlndex Random (Comb 0B ox I. Itemlndex. Count); ComboBox2.ItemIndex Random (ComboBox2.ItemIndex.Count); Comb 0B ox3. Itemlndex Random ComboBox3.1temIndex.Count |
4. CoxpaHHTe npoeKT, 3anycTHTe H np0TecTnpyÏne ero.
Ta6nnua 9![]()
Cnucozc cyugecmcumeJ1bHb1x Cnucozc Hapequù Cnucozc òeùcmcuù
|
K0111Ka |
bblCTP0 |
I]naBaeT |
|
3MCS1 |
BblCOKO |
beraeT |
|
KY3HeLIHK |
MeaneHH0 |
JleTaeT |
|
|
CHJNbHO |
INOJN3aCT |
|
|
Xopomo |
111)b1raeT |
|
JlacT0L11ça |
INJNOXO |
|
JIucT11Hr nonnporpaMMb1 procedure TForml .FormCreate (Sender: TObject); begin
Randomize;
ComboBoxl .ltemlndex :=0; ComboBox2.ItemIndex :=0; ComboBox3 .ltemlndex :=0; end; procedure TForml Hutton I Click (Sender: TObject); begin
Comb 0B ox I . Itemlndex Random(C omboB ox I . Itemlndex. Count) ; ComboBox2.ItemIndex Random(ComboB ox2. Itemlndex. Count); Comb 0B ox3. Itemlndex Random(C omboB ox3. Itemlndex. Count) ; end;
10
Простейший плеер
программу, выполняющую следующе действкя:
в окне изображается
проигрыватель.
2. По щелчку мышью на кнопке «Play» воспроизвести выбранную мелодию.
З. Для выхода мз лрограммы необходимо щелкнуть мышью на закрывающей хнолке в строке залоговка.
Описание плана разработки программы

![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
1.
Открыть повый проект.
Таблица 10.
|
Выделенный объект |
|
И.м« свойств:л,•' |
Действие |
|
|
Prope11ies |
Cap(ion |
Усј}щновка имени формы «М зыкальный ои ыватель» |
|
MediaPlayev1 •(Вх,лад.ка SvsIe:u} |
Ргоре«тез, |
АитоОрсп |
Выберкте значенле Тазе яз аск ывтощегося СЛИСКЕТ |
|
FileNaIT'.e |
Указать не полный путь к файлу, а относител Кно местоположен ия программы. Например, ”PriI11-wav", то программа будет этот файл искать д еде сама |
4. Сохраните проект, запустите протестируйте его.
5
Создать проигрыватело хартмлжу-фој[, например:

PItc. 29.
6. Сохранить картинку•фон в файле, например, Фон.Ьллр
7. Вставить
д плеер в качестве фона![]()
11 одолжелме таблица 10.
|
Выделенный объект |
Вх.хдл,ха окна
|
И.м« свойств:л,•' |
Действгте |
|
|
lmage1 |
Proper1ies |
Рјстите |
С ПОМОЩЬЮ хнолки Lpad выбериле файл Фон, Ьгтр и нажмите ОК- В результате па месте пункткрной каемки на форме появится этот рисунок 113 й.ла. |
|
|
AutoSize |
Вы |
ать значенке True |
||
8. подобрать размер формы лод размер
изображения, само изображение установите в нерхнттй левый угол» с кнопками
медиаплеера лостантт•ть чтобы
гармонировала с рксунком фона, например:

РКЦ. ЗО![]()
11
«Прыгающая кнопка»
программу•лгру, вылолняюшую следующие действия:
в
окне изображается беспорядочло прыга•ощая кнопка![]()
2. Необходимо успеть щелкнуть по ней.
3. Кнопка
перепрыгивает 413 одного места в другое ло скгналу, полученному от таймера4.
Для выхода 33
необходимо щелкнуть мышью на закрывающей
н строке заголовка.
Описание плана разработки программы
. ОТКРЫТЬ НОНЫ Й проект.
2. Разместлть
на форме экземпляры кОмпОнмтОв: командная кнопка Button, таймер
Timej•
3.
следующие
дейстнття
Таблица [![]()
|
Выде.јелогый ОмСК-3“ |
Вкладн 0Wcc1 |
сзойетзт' |
Действие |
|
FormI |
Properties |
Caption |
Усталовха имев“ формы «Прыгающая кнопка» |
|
Clie,j1WidTh (Внутренняя шн нн:1Т |
Присвоттть значение ЗОО |
||
|
ClientHeigth
|
|
||
|
|
Выбрать значение bsSing е (ломкая) |
||
|
Events |
ОпСгеа1е |
Randonjize; |
|
|
ButtonI •(Вх,лад.ка S1at1dard) |
Prope«ies |
Capti011 |
Ввести надпись «Нажшт меня» |
|
TahStop |
Прясвојггь значенме False. Это свойство разрешает выбрать данный элемент улравления клави(дгей ТаЬ Клавиа ой пользоваться запоещаегс;. |
||
|
Viswble |
Прясвојггь значенме False. Сначала кнопка невидима. |
||
|
Нет 11t |
П лсвоить значение 30 |
||
|
Width |
П лсвоить значение Sf:• |
||
|
Events |
03C[ick |
Bvtt0111.Capti011 .= 'Готово', 13vtton1.Enahled := False; .Enab1ed |
Il OAOJDKeHHe Ta6JIHUb1 1 1
|
BblaeneHHb1ìí 06beKT |
BKMAKa OKHa Object Inspector |
HMSI CBOï1CTBa/ C06b1TW1 |
AeücTBue |
|
Button2 (BKnaAKa Standard) |
Properties |
Ca tion |
BBecTH Hanr1HCb |
|
Default (no MOJIqaHHkO |
Bb16paTb 3HaqeHHe True |
||
|
Left CJueBa |
Il HCBOHTb 3HaqeHHe 110 |
||
|
To oe x |
Il HCBOHTb 3HaqeHHe 160 |
||
|
Width HHa |
IIPHCBOHTb 3HaqeHHe 80 |
||
|
Height BblCOTa |
FIPHCBOHTb 3HaqeHHe 30 |
||
|
Events |
OnClick |
Close; |
|
|
Timerl System) |
Properties |
Interval HHTe Ban |
LIPHCBOHTb 3HaqeHHe 500 (IIPOMOKYTOK B erqeHH H3Me qeTC¶ B MHJIJIHCeK Hnax |
|
Events |
Timer |
var i: Integer; begin
Button I. Visible := True; Button l . Top := 10 + 50 * ( i div 3); Button I .Left 10 + 100 * ( i mod 3); end, |
4. CoxpaHHTe npoeKT, 3anycTHTe H np0TecTnpyÏne ero. JIncTHHr nonnporpaMMb1 procedure TForml .Button2Click (Sender: TObject); begin
Close
end
procedure
TForm I. Timer I Timer (Sender: TObj ect)•
var i: Integer; begin i:=Random(9);
Button l .
Visible .= True![]()
Button l . Top := 10 + 50 * ( i div 3);
Button I Left 10 + 100 * ( i mod 3); end, procedure TForml Button I Click (Sender: TObject); begin
Buttonl
.Caption 'F0T0B0'![]()
Buttoni Enabled
False
False
end; procedure TForml .FormCreate (Sender: TObject); begin
Randomize; end;
3anarme CtùMOCTO¶Te.J1bHOVO Bb1110.JIHeHV1¶
I 1/13MeHHTe urpy TaK, LIT06b1 CKOPOCTb MO)KHO 6b1J10 HaCTPaHBaTb B npouecce HFPb1.
2. C03naö1Te ABe KHOHKVI: MeaneHHee Bbl(3Tpee. IlleJ] L10K Ha OAHOÖI "3 HVIX 6yneT
YBeJ]VI LIVIBaTb YMeHbUfflTb 3HaqeHHe CBOÖICTBa Timerl Interval Ha 100 MVIJU]VICeKYHA.
12
«Тпблицп умножения»
программу, выполняющую следующе
действкя:
в окне изображается два движка.![]()
2. Необходимо выбрать два числовых значения и найти их произведение.
З. Если выбкрается одно число, то НЕХОДИТСЯ его квадрат![]()
|
Таблица умножения |
|
|
Квадрат |
Рис. 32-
4. Для выхода 113 программы
необходимо щелкнуть мышью на закрывающей кнопке в строке заголовка. Описание
штана![]()
1. Открыть новый проект.
2. Разместить па форме экземпляры хомполентод: комакдкая кнопка Bntton, двлжок
TrackBat'* рамка
надпись
I.abcl,
З. Выполн•пь следующие действия![]()
Таблица 12.
|
Вы-гленкы'ј объехт |
|
|
Действие |
|
Form1 |
Propetties |
Caplion |
Усвановка имени формы «Таблица множено» |
|
TrackBar1 (Вкллдкл Wit1.32) |
P•wertics |
|
П лсвојггь значенле 2 |
|
Мах Макся |
П лсвоить значение 99 |
||
|
Positjon ложен:те |
Прясвојгть значенле 2 |
||
|
LineSize (Матее
|
Прлсволтть значение |
||
|
Page,Size
|
Присвонтьзначенле 7 |
||
|
Frequency Частота •ккечеь: |
Прясвојгть значенле 7 |
||
|
Events |
0nChange |
lntToStr(TrackBarl-Position *
|
П одолжение таблицы 12.
|
Выделенный объект |
Вкладка окна 0bject Inspector |
Имя свойства] имя события |
Действие |
|
TrackBar2 (Вкладка Win32) |
Properties |
Min Миним м |
П исвоить значение 2 |
|
Мах Максим м |
П исвоить значение 99 |
||
|
Position Положение |
Присвоить значение 2 |
||
|
LineSize (Малое изменение |
Присвоить значение 1 |
||
|
PageSize (Постраничное изменение |
Присвоить значение 7 |
||
|
Frequency Частота зассчск |
Присвоить значение 7 |
||
|
Events |
0nChange |
Labe12.Caption IntToStr(TrackBar2.Position); Labe13.Caption IntToStr(TrackBarl .Position * TrackBar2.Position)• if CheckBox .Checked then TrackBarl
.Position TrackBar2.Position, |
|
|
GroupBox1 (Вкладка Standard) |
Properties |
Caption |
Ввести подпись «Произведение» |
|
Labe11 (Вкладка Standard) |
Properties |
AutoSize Автоподбо |
Установить значение False |
|
Са tion |
П исвоить значение 2 |
||
|
Alignment Вы авнивание |
Установить значение taRightJustify ы авнивание по п авом к ако |
||
|
Labe12 (Вкладка Standard) |
Properties |
AutoSize |
Установить значение False |
|
Са tion |
П исвоить значение 2 |
||
|
Alignment |
Установить значение taRightJustify (Выравнивание по правому краю) |
||
|
Labe13 (Вкладка Standard) |
Properties |
AutoSize |
Установить значение False |
|
Са tion |
П исвоить значение 4 |
||
|
Alignment |
Установить значение taRightJustify Вы авнивание по п авом к аго |
||
|
CheckBox1 (Вкладка Standard) |
Properties |
Са tion |
Ввести подпись «Квад ат» |
|
Alignment |
Установить значение taLefttJustify (Выравнивание по левому краю) |
||
|
Events |
0nClick |
TrackBar2.Position
|
4. Сохраните проект, запустите и протестируйте его.
Листинг подпрограммы procedure TForml . TrackBarl Change (Sender: ТОЬј ect); begin
Label .Caption IntToStr(TrackBarl .Position);
Labe13 .Caption IntToStr(TrackBarl .Position *
TrackBar2.Position); if CheckBoxl .Checked then TrackBar2.Position := TrackBarl
.Position; end
procedure TForml .TrackBar2Change (Sender:
TObject)•
begin
Labe12.Caption := IntToStr(TrackBar2.Position);
Labe13 .Caption := IntToStr(TrackBarl
.Position * TrackBar2.Position)•
if CheckBoxl .Checked then
TrackBar2.Position := TrackBarl .Position, end, procedure TForml
.CheckBoxlClick (Sender: TObject); begin
TrackBar2.Position := TrackBarl .Position, end,
Задание для самостоятельного выполнения
Изменить программу
так, чтобы находить произведения не только двузначных, но и трехзначных чисел
от 2 до 199.
2. Изменить программу так, чтобы находить сумму двух чисел.
Практическая работа 13
Применение полос прокрутки
Цель работы -, создать программу,
выполняющую следующе действкя:
после запуска
программы в окте изображается две лолосы прокрутки. Верткка-львая
полоса
будегугравлять „движенлем по вертккалщ горизонтальна; — по горизонтали.
2.
Наводя
указатель мыиј•т на одну двух фкгур, можно выбиратц какая 413 зткх фкгур
связана с полосами прокрутки.

3. Требуются
дополнительные сбьек-гн. с 1!ОМОЩНЈО ко:орых осранттчцвае•ся областн движения
фигур в окне.![]()
4. Если полоса прокрутки актквлая, то она до.лкла реагировать на клавиши ВВЕХ, ВНИЗ,
ВЛЕВО. ВПРАВО. РАФЕ РАСЕ
DOWN![]()
5. Для выхода 113 программы необходимо щелкнуть мышью на закрывающей кнопке в строке заголовка.
Описание плана разработки программы
1. Открыть новый проект.
2. Разместить
ла форме экземпляры компонетггод: пакель Рипе] полоса прокрутки ScrollBat,
фигура Shape![]()
З. Ввести дополнительную переменную
логического тмла пит. Есл•т она принимает значение Тше (Дау •леку•глей
считаевся мерная фигура Значению (Пет)
соответствует вторая флгура. Эта
переменна; должна быть доступна во всех
лроцедурах.
следующие
дейстнття![]()
Таблица 13![]()
|
Выделенны#Ј объехг |
Вкладка окна
|
Им [1.3“ собь.гтмя |
Действгте |
|
F0rrtt1 |
Propej-ties |
Captjon |
Устаиовка имели формы «П смещение и |
|
Panel (Вхладуа Stat1dar•dj |
Propet[ies |
! Ieight |
П значение |
|
Wid1h |
П значение |
||
|
Сар(Јоп |
Останттть значение свойства |
||
|
SrrollB*r1 (Вкладка |
Ргорегйе€ |
Мгл |
П исвоить значение |
|
Мая |
П значение 145 |
||
|
PosiTi0f'1 |
П ТТСНСПТЈ“Ь. значение 76 |
||
|
SmallChange |
11рнсвоттть зпачел ме 2 |
П одолжение таблицы 13
|
Выделенный объект |
Вкладка окна 0b ect Inspector |
Имя свойства] имя события |
Действие |
|
|
|
LargeChange (Большое изменение |
Присвоить значение 20 |
|
Events |
0nChange |
if пит then Shapel .Left ScrollBar .Position else Shape2.Left ScrollBar .Position |
|
|
ScrollBar2 (Вкладка Standard) |
Properties |
kind |
Выбрать значение sbVertical Горизонтальная полоса прокрутки станет ве тикальной. |
|
Min |
П исвоить значение 5 |
||
|
Мах |
П исвоить значение 145 |
||
|
Position |
П исвоить значение 76 |
||
|
SmallChange Малое изменение |
Присвоить значение 2 |
||
|
Lar eChan е |
П исвоить значение 20 |
||
|
Events |
0nChange |
if пит then Shapel. Тор ScrollBar2.Position else Shape2.Top ScrollBar2.Position |
|
|
Shape1 (Вкладка Additional) |
Properties |
Hei ht |
П исвоить значение 1 1 |
|
Width |
П исвоить значение 1 1 |
||
|
Left |
П исвоить значение 76 |
||
|
то |
П исвоить значение 76 |
||
|
Shape (Форма) |
Выбрать значение stCircle (Круг |
||
|
Brush (Кисть) |
Выбрать для подсвойства Color (Цвет кисти) значение clAqua гол бой цвет |
||
|
Events |
0nMouseMove (При движении мыши) |
Shape .Brush. Color clAgua; Shape .Brush. Color clFuchsia• Num ттие• ScrollBarl .Position: Shape .Left; ScrollBar2.Position: Sha ет.то |
|
|
Shape2 (Вкладка Additiona1) |
Properties |
Hei ht |
П исвоить значение |
|
Width |
П исвоить значение |
||
|
Left |
Присвоить значение 76 |
||
|
то |
П исвоить значение 76 |
||
|
Shape |
Выбрать значение stSquare Квад ат |
||
|
Brush |
Выбрать для подсвойства Color (Цвет кисти) значение clFuchsia иолетовый цвет |
||
|
|
Events |
0nMouseMove |
Аналогично Sha е2 |
5. CoxpaHHTe npoeKT, 3anycTHTe H np0TecTnpyñTe ero.
JIncTHHr nonnporpaMMb1 procedure TForml. ScrollBarl
Change (Sender: TObj ect); begin if num then Shapel Left := ScrollBarl Position
else Shape2.Left := ScrollBarl Position end
procedure TForml.
ScrollBar2Change (Sender: TObj ect); begin if num then Shapel. Top :=
ScrollBar2.Position else Shape2. Top := ScrollBar2.Position end
procedure
TForm I. Shape IMouseMove
(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin
Shapel Brush. Color := clAgua;
Shapel Brush. Color clFuchsia,
Num True;
ScrollBarl Position:= Shapel Left;
ScrollBar2.Position:= Shapel. Top; end
procedure TForm l . Shape2MouseMove
(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin
Shape2.Brush.Color clFuchsia,
Shape2.Brush.Color := clAgua,
Num False![]()
ScrollBarl Position:= Shape2.Left•
ScrollBar2.Position:= Shape2.Top• end
procedure TForm l . FormCreate (Sender:
TObject)•
begin num := True
end,
Практическая работа 14
«Светофор»
Цель работы • создать программу,
выполняющую следующе действкя:
после залуска
программы в окте изображается светофор с тремя лампочками, слособнытт
реагировать на наведение указателя мыши.
|
Светофор |
|
|
Р„с. 34.
З. Для выхода из программы необходимо щелкнуть мышью на закрывающей хнолке в строке залоговха.
Описание плана разработки программы
1. Открыть повый проект.
2. на
форме экземпляры
фигура Shapc
З. Выполн•пь следующие
действия![]()
Таблица 14.
|
Выделенный Объект |
ВК.ЖД.ХК окна (3hix1 1rsxc[or |
|
Действие |
|
Form1 |
Pj•opej'tjes |
|
«Свето о » |
|
Hci ht |
П исвоить значение 300 |
||
|
Width |
ПРИСВОИТЬ значение 120 |
||
|
Bordcrlcons (Служебные КНОПКА) |
Выбрать для подсвойсгва ize (Сворачлвкнлеј l• bi№aximjzg (Разворачивание) значение False |
||
|
|
Задать СтандаОтныЙСС ый тлвет |
||
|
B0Tdej•STy1e (Стлль |
В („брать значение bsSing•e |
||
|
Evcr.ts |
0rMouse-Move |
В процедуру передаются дополлителыме
параметры: S1ji!i — указываете не была ли оря перемешенгм нажата клавиша
SHIFT, CT1tL МЛ; Х „ горизонтальна; координата указателя мыијтт; У • |
П одолжение таблицы 14
|
Выделенный объект |
Вкладка окна 0bject Inspector |
Имя свойства] имя события |
Действие |
|
|
Shape1 (Вкладка Additional) |
Properties |
Hei ht |
П исвоить значение 61 |
|
|
Width |
П исвоить значение 61 |
|||
|
Sha е Фо ма |
Выб ать значение stCircle К г |
|||
|
Реп (Контур) |
Выбрать для подсвойства Color (Цвет) значение clRed (красный цвет |
|||
|
Brush (Кисть) |
Выбрать для подсвойства Style (стиль) значение bsClear п оз ачный |
|||
|
Enabled |
Включен |
Выб ать значение False Нет |
||
|
Shape2 (Вкладка Additional) |
Properties |
Hei ht |
|
П исвоить значение 61 |
|
Width |
|
П исвоить значение 61 |
||
|
Sha е |
|
Выб ать значение stCircle К г |
||
|
Реп |
|
Выбрать для подсвойства Color (Цвет) значение clYellow желтый цвет |
||
|
Brush |
|
Выбрать для подсвойства Style значение bsClear |
||
|
Enabled |
Включен |
Выб ать значение False Нет |
||
|
Shape3 (Вкладка Additional) |
Properties |
Hei ht |
|
П исвоить значение 61 |
|
Width |
|
П исвоить значение 61 |
||
|
Sha е |
|
Выб ать значение stCircle К г |
||
|
Реп |
|
Выбрать для подсвойства Color (Цвет) значение clLime (яркозеленыи цвет |
||
|
Brush |
|
Выбрать для подсвойства Style значение bsClear |
||
|
|
|
Enabled |
Включен |
Выб ать значение False Нет |
4. Написать функцию 0nShape, которая вызывается из
процедуры FormMouseMove
5 Работа функции определяет следующие
события:
Если указатель мыши не наведен на лампочку, то ее цвет будет прозрачным.
Если указатель мыши наведен на лампочку, то ее цвет будет соответствовать цветам светофора.
sh.Width div 2; {r - радиус фигуры} сх :=
sh.Left + r• {сх, су — координаты центра фигуры} су := Ф. Тор + г; d2 := (Х —
сх) * (Х — сх) + (У — су) * (У — су); {d2 — квадрат расстояния от центра}
0nShape := bsClear; {указатель мыши не наведен на лампочку, т.е. находиться за
пределами фигуры} if d2 > then 0bShape bsSolid; [указатель мыши наведен на
лампочку, т.е. находиться внутри фигуры}
6. Выравнивание элементов:
1) Выделить все три фигуры.
2) Выбрать команду Edit —» Align (Правка —» Выровнить).
3) Откроется диалоговое окно Alignment (Выравнивание).
4) Установить слева переключатель Center in Window (Центрировать в окне).
5)
YCTaHOBHTb cnpoa
nepeKmoqaTeJ1b Space Equally (C PaBHb1MH HPOMe)KYTKarv1H)![]()
6) IlleJIKHYTb Ha KHOr1Ke OK.
7. CoxpaHHTe npoeKT, 3anycTHTe H np0TecTupyñTe ero.
JIucTHHr nonnporpaMMb1
Function OnShape (sh: T Shape: X, Y: Integer):
TBrushStyle; var r, cx, cy, d2: Integer; begin
sh.Width div 2, cx :=
sh.Left + r cy := sh.Top + r; d2 := (X — cx) * (X — cx) + (Y — cy) * (Y — cy),
OnShape := bsClear; if d2 > r *r then ObShape := bsSolid, end
procedure
TForml .FormMouseMove (Sender: TObject, Shift: TShiftState; X, Y: Integer););
begin
Shapel .Brush.Color := clRed,
Shapel .Brush.Style := OnShape (Shapel, X, Y); Shape2.Brush.Color := clYellow;
Shape2.Brush.Style := OnShape (Shape2, X, Y);
Shape3 Brush. Color clLime;
Shape.Brush.Style := OnShape
(Shape3, X, Y); end![]()
Практическая работа № 15
«Ханойские
баш![]()
Цель работы создать компьютерную версгтю мгры•голоеоломхи
«Ханойскке башни». Игровая доска содержит семь клеток, расположевтпых д ряд. На
трех левых клетках стоят белые фишки, на трех правых — черные. Центральная
клетка пуста- Задача заключается в том, чтобы, делая допустимые ходы, ломенять
фииж•• местами. Правила ходов такие.
! . Белые фИ!ДјКИ могут
вправо. а
черные — только влево![]()
2. Ходить разрешается только на свободное поле.
З. Разрешены
леремеще•лтя па соседке,е поле «прыжок» через одну фгкижу. В ролтт фишек
выступают кнопки с изображением» назлример.![]()

Рис. 35-
Описание плана разработки программы
1. Открыть
новый проект![]()
2. Разместить на форме экземпляры компонентов: панель Panel, кнопка с изображен№ем BitBtn.
3. В
следу
ющие действия![]()
Таблица 15.
|
|
0b'x1 сгот |
|
|
|
|
Forml |
Propertjes |
Captjon |
Установка имени формы «ГОЛОнОЛОМха» |
|
|
S1at3(lardj |
РтореттЈе,э |
НеЈ ht |
П гксвоит'. значевтке 65 |
|
|
Width |
П гксвоит'. значите 401 |
|||
|
Са )tjon |
Очгкстлт. [ие |
|||
|
BitBtnl A(ldi1i01E31} |
Propertjes |
Неб ht |
П ксвоить значен•те Ф) |
|
|
Width |
П ксвоить значен•те 49 |
|||
|
|
ПРИСВОИТЬ значение 8 |
|||
|
|
Присвоить значение 8 |
|||
|
|
Рторегјез |
Hei ht |
ПО ИСВОИТЬ значение ФЗ |
|
|
WidTh |
П значение |
|||
|
|
П значение 64 |
|||
|
то |
П гксвоит'. значите 8 |
|||
|
BitBtn3 |
РтореттЈе,э |
Height |
П гксвоит'. значевтке 49 |
|
|
Width |
П ксвоить значен•те Ф) |
|||
|
l„eft |
П ксвоить значен•те 120 |
|||
|
|
П ксвоить значен•те S |
|||
|
BitBtn4 |
РтореттЈез |
Hci$.lht |
Присвоить значение ФЗ |
|
|
Width |
ПО ИСВОИТЬ значение ФЗ |
|||
|
г.еп |
П значение 232 |
|||
|
|
|
П значение 8 |
||
|
|
РтореттЈе,э |
1-le:i ht |
П гксвоит'. значевтке 49 |
|
|
Width |
П гксвоит'. значевтке 49 |
|||
|
Left |
П гксвоит'. значите 288 |
|||
|
Тор |
|
|||
П одолжение таблицы 15.
|
Выделенный объект |
Вкладка окна 0bject Inspector |
Имя свойства] имя события |
Действие |
|
BitBtn6 |
Pro erties |
Hei ht |
П исвоить значение 49 |
|
|
|
Width |
П исвоить значение 49 |
|
|
|
Left |
П исвоить значение 344 |
|
|
|
то |
П исвоить значение 8 |
4 Сохраните проект.
5. Создать рисунки при помощи стандартной программы Paint. Задайте размеры рисунков 45х45 пикселов (в режиме увеличения).
6. Создать две картинки с именами Left.bmp и Right.bmp, поместить их в папку проекта. Рисунок с именем Left.bmp предназначен для левых кнопок, рисунок с именем Right.bmp — для правых кнопок.
7. Назначить рисунки кнопкам.
П одолжение таблицы 15.
|
BitBtn1, BitBtn2 BitBtn3, BitBtn4 BitBtn5, BitBtn6 |
Properties |
Caption |
Очистить значение |
|
Glyph (Значок) |
Щелкнуть на кнопке построителя. Открыть окно Picture Editor. Щелкните на кнопке Load. В диалоговом окне выберете файл с изображением кнопки и щелкните на кнопке ОТКРЫТЬ. Щелкнуть на кнопке ОК, и выбранная картинка появится на кнопке. |
8. Необходимо хранить два числа: номер клетки, в которой находится кнопка; признак «цвета» фишки», т.е. в какую сторону может ходить кнопка.
9. Номер клетки умножить на два. Если фишка черная, прибавить к числу единицу.
10. Задать свойство Tag (Тег) для всех кнопок.
Таблица 16![]()
|
Значение свойства Tag |
Комментарий |
|
2 |
Первая клетка, белая фишка |
|
4 |
Вторая клетка, белая фишка |
|
6 |
Третья клетка, белая фишка |
|
|
Четвертая клетка, черная фишка |
|
|
Пятая клетка, черная фишка |
|
15 |
Шестая клетка, черная фишка |
11. Создать дополнительную переменную для пустой клетки var п: Integer 4;
12.
Создать глобальную переменную win : Integer 24; [все фишки в
сумме должны переместиться на 24 клетки;![]()
13. Программируем выполнение хода фишки.
Таблица 17![]()
|
Выделенный объект |
Вкладка окна 0Wect Ins ector |
Вмя события |
Действие |
|
BitBtn1 |
Events |
OnClick |
В процедуру BitBtnl Click передается параметр объект Sender. Он представляет именно тот объект, который вызвал событие, и может дать доступ к его свойствам. Надо специально указать, что объект Sender в данном случае следует считать кнопкой. Чтобы обратиться к свойству Tag данного объекта, записывают Sender as TBitBtn Та |
14. Сохраните проект, запустите и протестируйте его.
Листинг подпрограммы
procedure TForml .BitBtnlClick (Sender: TObject); var i, с, К, аК: Integer; begin with Sender as TBitBtn do {объект Sender используется многократно}
|
begin |
{свойство Tag указывает, какая именно кнопка нажата} |
|
i := Tag div 2, |
{переменная i хранит номер клетки, где находится кнопка} |
|
с := Tag mod 2, |
{переменная с определяет цвет фишки} |
|
К := n—i |
{k — величина перемещения} |
|
ак := Abs (К); |
{ak — длина хода} |
|
if ак < 3 then |
{проверка допустимости хода} |
if ((с = 0) and (К > 0)) or ((с = ) and (К < 0)) {белые фишки могут ходить только вправо, черные - влево} then {делаем ход} begin
Tag![]()
Left Left + 56 * К
win win — аК; {при
каждом ходе уменьшается значение переменой win на длину хода}
{пустая клетка находиться
там, где раньше была фишка} end; end
if win 0 then {проверка завершения
решения} begin
Caption := 'Победа!![]()
Panel .Color clFuchsia•
Panel .Enabled := False; [отключаем
панель, и одновременно все расположенные на ней объекты;
end; end;
Практическая работа 16
«Электронный альбом»
Цель работы -, создать программу,
выполняющую следующе действкя:
1. 1“1осле запуска программы д окне
изображается рисунок,
лервым
переключателем из
раскрывающегося спкска.
2 Выбкраем необходкмыл*' переключатель, рясу
нок 413 соответствующего раскрывающелося списка![]()
З. Для выхода из программы необходт„то щелкнуть мытые на закрывающей кнопке в строке заголовка.
|
Инте
рактивныи электронньм альбом |
|
|
||
|
-Чвсти света • Европа Азия Африка Северная Америка Южная Америка Австралия |
|
Горшдв |
||
|
П вриж |
|
|||
|
|
||||
|
|
||||
Рис. 36![]()
штана![]()
1
. Открыть новый проект![]()
2
Разместить на форме экземпляры компонелтов: рамка GroupBox.
переключатель
раскрывающийся СПИСОК
З. В
ылолнить следующие действия:
Таблица 18.
|
|
|
|
|
|
Form1 |
Properties |
Сарпол |
Установка формы «Интерактивл электрол альбом» |
|
Even1s |
(_JnC1•eate |
|
|
|
GroupBoxl
|
f'roperties |
Сарпол |
Введите название «Части света» |
|
R.adi0Batt01jJ S1at3ilardj |
Propenies |
Са ti011 |
Введите па:звалие «Ев опа» |
|
Checked В КЛ ЮЧеН |
Задайте злачелие Тгие |
||
|
Tag |
Присвојтгъ значение О |
||
|
Events |
0nclick |
В процедуре описать локальлуаэ переменную i. Описать деЙствия переключателей, кспользуя цккл с параметром i от до 5. |
|
|
Для
создания е•це лжти переключателей можно CTRL*C протоойдет его копкровашзе в буфер обмела. Теперь лажмите комбилацијо CTRl.+V — это команда вставки объекта буфера обмена Delphi автоматически изменит имя ооьекта — новый объект получш имя RadioBatton2. |
|||
|
Выделенный объект |
Вкладка окна 0bject Inspector |
Имя свойства] имя события |
Действие |
|
RadioBatton2 |
Properties |
Caption |
Введите название «Азия» |
|
Tag |
Присвоить значение 5 |
||
|
RadioBatton3 |
Properties |
Caption |
Введите название «Африка» |
|
Tag |
Присвоить значение 10 |
||
|
RadioBatton4 |
Properties |
Caption |
Введите название «Северная Аме ика» |
|
Tag |
Присвоить значение 15 |
||
|
RadioBatton5 |
Properties |
Caption |
Введите название «Южная Аме ика» |
|
Tag |
Присвоить значение 20 |
||
|
RadioBatton6 |
Properties |
Caption |
Введите название «Австралия» |
|
Tag |
Присвоить значение 25 |
||
|
Выделите все шесть переключателей. Дайте команду Edit —> Align (Правка Выравнивание) Откроется окно Alignment (выравнивание). Установить слева переключатель Left Sides Левые к ая , а сп ава Space Equally авные п оме тки елкните на кнопке ОК. |
|||
|
GroupBox2 (Вкладка Standard) |
Properties |
Caption |
Введите название «Города» |
|
СотЬоВох1 (Вкладка Standard) |
Properties |
Style |
Выбрать значение csDropDownList Раск ывающийся список |
|
Events |
0nChange |
Imagel .Picture.LoadFromFile (ListBox2.Items [СотВох1 .Tag + СотЬоВох 1. ItemIndex |
|
|
Image1 (Вкладка Additional) |
|
|
Поместить объект на рамку |
|
ListBox1 (Вкладка Standard) |
Properties |
Visible |
Задайте значение False |
|
Items (Пункты) |
Щелкнуть на кнопке построителя. Введите в список тридцать названий городов - по пять для каждой части света. |
||
|
ListBox2 (Вкладка S[andard) |
Properties |
Visible |
Задайте значение False |
|
Items |
Щелкнуть на кнопке построителя. Введите в список тридцать имен айлов, соде жащих иллюс ации. |
||
4. Сохраните проект, запустите и протестируйте его.
Листинг подпрограммы
procedure TForml. RadioButtonlClick (Sender: TObject); var i: Integer; begin
СотЬоВ ох 1 . Clear•
Comb0Boxl .Tag (Sender as TRadi0Button). тау for i := 0 to 5 do
СотЬоВох I .Items.Add (ListBox I .Items [СотЬоВох I . Tag + i]);
СотЬоВох1 .ltemlndex := 0;
Image 1 Picture.LoadFromFile
(ListBox2.1tems [ComboBox 1.
end![]()
procedure TForml .FormCreate(Sender: TObject); begin
Radi oButton I Cli ck(Radi oButton
I ) ; end![]()
procedure TForml .ComboBoxlChange (Sender: TObject); begin
Imagel Picture.LoadFromFile (ListBox2.Items
[ComboBox I. Tag + ComboBox I .ltemlndex]); end![]()
17
«Вычисление процентов»
- создать программу, выполняющую следующе действкя:
1. 1“1осле запуска программы в окте изображается три текстовых поля.
|
Вычисление
процентов |
|
Считаем проценты!
|
Рис. 37![]()
|
Выделенный объект |
сжн:} ()hiett [11.qxc[or |
|
Дећ;твне |
|
Form1 |
Propertwes |
Caption |
Установка имени формы «Вычисление п оиентов±} |
|
Labe11 |
Propertwes |
Caption |
Введттге |
|
EditI |
Propet1ies |
“I“ext |
Очкстатгьзначение свойства |
|
Edit2 |
Propertwes |
Text |
Очистить значение свойства |
|
Edit3 |
Properties |
Text |
Очистить значенле |
|
Button1 |
Propertwes |
Caption |
Введттге |
|
Events |
ОпСЛсК |
Описать локальные Number, Ргосеп( Ргп |
2. В
первое поле вводятся число- Во второе поле — проценты. нажатии кнопки
«Рассчгттать»
д третье поле вьиюдятся вычисленные проценты от числа.
|
|
Вычисление
процентов |
|||
|
|
Считаем процеты!
|
Рис. 38.
3. При нажатии КНОпКИ «Очистить» очищаются значения полей. Далее ННОДЯ'ГС.Я новые значения в ПОЛЯ.
4. для выхода из программы необходимо щелклутъ мьишыо на закрывающей хлопке в строке заголовка .
Описание плана разработки программы
НОнЫЙ проект.
2. Разместят» на форме экземпляры комгонентов: командно кнопка Button„ надпись Lahe1, текстовое лоле Edit.
3.
следующие
дейстнття![]()
Таблица 19.
FIPOAOJDKeHHe Ta6JIHUb1 19.
|
BblAeJueHHb1ìí 06beKT |
BKnaAKa OKHa Ob•ect Ins ector |
HMSI CBOï1CTBa/ C06b1TW1 |
AeücTBue |
|
Button2 |
Properties |
Caption |
BBeAHTe HUBaHHe |
|
Events |
OnClick |
Editi. Text. Edit2.Text. Edit3. Text. |
4. CoxpaHHTe npoeKT, 3anycTHTe H np0TecTupyñTe ero.
nporpaMMb1
Number, Procent, Prn: Real
procedure
TForm I Hutton I Click(Sender: TObj ect); begin
Number:=StrToFloat(Editl. Text);
Procent:= StrToFloat(Edit2.Text);
PrN:=0.01 *Procent*Number
procedure TForml .Button2Click(Sender: TObject); begin
Editi. Text.![]()
Edit2.Text.
Edit3. Text.
end;
18
«Головоломка № 1»
• создать компьютерную версию одной головоломок Самузля Ллойда: 113 задатптого лабора чисел надо выбрать те, сумма которых составит 50. Чкс.ла, которые избрал Ллойд ,щт;:• своей головоломку: 25, 27, З, 12, 6, 15. 9е 30$ 2 1, 19.
|
|
|
|
|
|||
Сумма: ЕВ |
||||||
Рис. 39![]()
В ылолнить следующие демств•л:
I После запуска программы д окле изображается список чисел Ллойда.
2- Выбираем с помощью флажков ззкс„ла
и помещаем в правое окно
Сумма выбранных чисел лредставлена в виде
надписк-
4 Для выхода тв программы необходимо щелкнуть на закрывающей кнопке в строке заголовка.
Описание плана разработки программы
новый проект.
2- Разместить на форме
экземпляры компонентов: список флажков CheckListBox„
надпись 1.21;је1,
список ListBox.
3 ВЫ (ГОЛНЈТТЬ следуя•ощјте действия:
Таблица 20.
|
Выделенный объект |
Вклад.“ окна 1rsxcIor |
Имя события |
Действие |
|
Form1 |
РтореттЈез |
Caption |
Установка имени формы «Головоломка» |
|
BorderS le |
Задайте значение dsSin le |
||
|
CheckListBox1 Addjtiona1 ) |
Properties |
ltems |
Задаем состав сл•тска. Щелкнуть на кнопке
лострогттеля. Откроется окно S1ring l..(st editor (Редактор списка строк).
Введите в список запанные числа че €3, Enter Пакмгтј“е КНО txV ОК |
|
Height |
11одобрата. злачелие так, что все числа поместялмсь в список (без полос п о ток |
||
|
Events |
0nClickCheck |
лисать очистку слисха. Проверять, устаковлеј[ флажок или пег после обновленуя списка необхощтмо подсчитать сумму выбранных чисел. Элементы списка выглядят числа. но являются текстовыми строками (досполызоваться фулкцгкей StfTo•nt} |
П одолжение таблицы 20
|
Выделенный объект |
Вкладка окна 0bject Inspector |
Имя свойства] имя события |
Действие |
|
ListBox1 (Вкладка Standard) |
Properties |
Height |
Подобрать значение так, что все числа поместились в список (без полос прокруток). Первоначально список пуст. Заполняться он будет при работе п о аммы. |
|
Labe11 (Вкладка Standard) |
Properties |
Са tion |
Введите текст: «С мма: 0» |
|
Autosize |
Задайте значение False |
||
|
Ali nment |
Задайте значение taCenter |
4. Сохраните проект, запустите и протестируйте его.
Листинг подпрограммы procedure TForml .ChcckListBoxlClickChcck (Sender: ТОЬј ect); var i, s: Integer; begin
ListBoxl.Clear• for i: = 0 to CheckListBoxl .Items.Count-l (10 if CheckListBox .Checked[i] then
ListBox 1 .Items.Add (CheckListBox .Items[i]);
for i := 0 to ListBoxl .Items.Count -1 do
s +
StrToInt(ListBoxl .Items[i]); Label l.Caption := ' Сумма: ' + IntToStr(s); if s
= 50 then begin
Label .Caption .= ' Сумма: ' + IntToStr (s);
CheckListBoxl .Enabled False![]()
ListBoxl .Enabled False
end
end![]()
19
«Головоломка 2»
• создать компьютерную вермо головоломки:
из изображенных лятм
сброшенлых флажков усталовлть все- Но при
выборе одного флажка меняется состоявке двух следующих.
|
Все ПЯТЬ |
|
|
|
|
|
|
|
|
|
Г1г-бЕддд! Т7 П.:бвдд! Г1г-бЕддд! Т7 Пг-бвдд! Г1йбЕддд! |
||||||
Рис. 40.
Создать программу, выполляощуто следующие действия:
1. После запуска
в окне изображаются
(тять сброшенных флажков.
2 Щелкать разрешено только на сброшенных флажках- Щелчок на установленном флажке пе действует.
З. При установке какого-то флажка
меняется состояние двух следующих флажжов. Пря
этом сброшенные флажки
устанавливаются, а устаноштенные • сбрасываются.
4.
Для выхода из программы
щелкнуть на закрывающей
кнопке н
строке заголовка.
Описание плана разработки программы
. ОТКРЫ'З“Н НОНЫ Й проект.
2. Разместить на форме экземпляры компонентов: слисок флажков C.heckBox, ладпись Label.
3.
следующие
действия![]()
Таблица 21![]()
|
Выделенный объект |
|
Ими БЕ7Лства'( им:т события |
|
|
Form1 |
р C1•tie.s |
Са ion |
Установка имени 4bo мы «Все пять» |
|
|
Even(s |
ОпСтеате |
Создать глобальную логическую переменную s. В то время, когда идет обработка события, лереме•мая кмеет значенле Тазе да |
|
С."есКВох1
|
р Crtie.s |
Са ion |
Задать значение « 1 $3. |
|
Even(s |
|
Т Теобходцмо работать с флажками. как с массивом. Форма является контеинером лля флажков. У объектов„котгтейверов имеется свойство Controls (Элементы управления) — массив элементов управления. находящихся данном контейне е: Controls • а; TChec\Box. |
|
|
дт» спесквох2 |
-ктжкое; МОЖНО Рто erties |
Са tion |
ко бе, с обмена. Задать злачешзе «Ъ. |
|
спесквохз |
Рто erties |
Са tion |
Задать злачешзе «З». |
|
СлесКВоя4 |
Рто erties |
Са tion |
Задать злачешзе «4». |
|
СъесКВоя5 |
Properties |
Caption |
Задать значение «5». |
П одолжение таблицы 21
|
Выделенный объект |
Вкладка окна 0b ect Inspector |
Имя свойства] имя события |
Действие |
|
Labe11 (Вкладка Standard) |
Properties |
Са tion |
Введите текст: «С мма: 0» |
|
Autosize |
Задайте значение False |
||
|
Ali nment |
Задайте значение taCenter |
4. Сохраните проект, запустите и протестируйте его.
Листинг подпрограммы procedure TForml .FormCreate
(Sender: TObject)•
begin s := False
end
procedure
TForml .ChcckBoxlClick (Sender: TObject); var Index, i, пит : Integer; е:
Воо1еап
begin if s then Exit; {Если программа
снова вызовет процедуру обработки, будет выполнен оператор Exit — немедленный
выход из процедуры} s := True; for Index: = 0 to 4 (10 {Оператор break
прерывает выполнение цикла} if Sender = Controls[i] then break; «определяется,
какой флажок был переключен}
{Когда выполнение цикла завершается, значение переменной Index соответствует переключенному флажку}
{Если значение свойства Checked (Установлен) равно False (Нет), флажок сброшен, а если
Т гие (Да) — установлен. Номер флажка в массиве определяется переменной Index} if not (Controls[Index] as TCheckBox).Checked then (Controls[Index] as TCheckBox).Checked := True {Условие выполнено, если флажок сейчас сброшен, т.е. до щелчка он был установлен} else {Программирование изменения состояния «дополнительных флажков». Текущий флажок уже переключен} begin пит := Index + 1; {Переключение двух следующих флажков} if Index = 4 then пит := (У {Изменение состояния нулевого флажка} {Состояние флажка надо поменять на противоположное}
(Controls[num] as TCheckBox).Checked .= not (Controls[num] as CheckBox).Checked,
{Выполнение проверки на выход за пределы массива} пит := пит + 1; if Index 3 then пит := 0;
(Controls[num] as TCheckBox).Checked := not (Controls[num] as CheckBox).Checked; end; е := True; {Головоломка решена, если установлены все пять флажков} for i := 0 to 4 do е е and (Controls[i] as TCheckBox).Checked;
{После цикла значение останется
равным Т гие, если все флажки установлены} if е then [Головоломка решена;
for i
:= 0 to 4 (10 begin
(Controls[i]
as TCheckBox).Caption 'По6еда!![]()
(Controls[i] as TCheckBox).Enabled False;
[Отключение флажков;
end;
![]()
end;
20
«Обычный калькулятор»
-, создать программу, выполняющую
деиствия обычного калькулятора. Описание (4,113143
программы
1. Открыть новый проект.
2. Разместлть на форме экземпляры компонентов: 1.„ahel Edit, Button.
|
Калькулятор Введите числа и нажмите кнопку выбранного действия Первое число Второе ЧИСЛО Результат
|
Рис. 41.
З. Сохраните проект, запустите протестируйте его![]()
„Листинг подпрограммы
procedure ТЕогп11.Foa11CrcatcfSender TObjcct); 1;yegin
![]()
Edit3 Text -
procedure
hegin

end,
procedure TForm1.Butt0116Click(Sender TOhject); begi'j' end,
procedure ТРогп11.Butt0I11C.lick(Scndcr: TOhject}•, 1;yegin
![]()
Ь .= StrToFloat (Edjt2.Text}•,
![]()
end, procedure ТЕогп11.Butt0I12C.lick(Scnder: TOhject};
59
heg:in а :=
(Editl-Text);
Ь S1TToFloa( (Edi(2.Tex1};
= FtoatTo„Str end,
![]()
heg:in

end,
ТОЪјес1У* heg:in а :=
(Editl-Text);
Ь S1TToFloa(
(Edi(2.Tex1}; ifb = 0 then Edit3.Text := 'division бу иго“ begin
![]()
end„ end,
Задание для самостоятельного выполнения
1. Создать
программу, выполкяаэщуо действия простого илекенервого калькулятора![]()
|
Калькулятор ВВЕДИТЕ числа и НВЖМИТЕ кнопку выбранного действия Первое число Второе число Результат
|
Рис. 42.![]()
Фрагмент
(для вычисления функјлјпт ![]()
ifEdit1. Тем
” then
[tegin а := StrToF[oat (Editl.Text); с := cos![]()
if
Edit:2.Tcxt
then![]()
hegin
Ь := StfToFloat (Edit2.Text); с : cos
end![]()
= FtoatTo„Str
Добавить на форму кнопки вычисления функций Tg(x), Log Ф.
2. Создать программу, выполняющую леревод чисел гв десяткчноГ' системы счкс.ления в двоичную систему обратно.
|
|
|
|
|
|||||||||||||||||
|
Десятичная сис. счисления ДВоИчНо гис. счисления
Двоичная сиз. счисления Десятичная сис. счисления
|
||||||||||||||||||||
43
21
«Строковый
калькулятор» ![]()
работы -, создать программу, выполняющую
деиствия строкового калькулятора.

штана![]()
1.
2. Разместить ла форме экземпляры комлолентов: Edit, 1.иЬе1, Bntton.
Фрагмент программы
ТОЪјес1У* begin

procedure
TForm1.Button3Click(Sender TOhject); begin

procedure “I“Forml .Button4Click(Sender:
hegin
s:=Edit1 .Text;
![]()
Copy(s,p,l), s I .=copy(s,p,l);
![]()
procedure TForml .Button5Click(Sender: TObject); begin
![]()
r: =Edit9. Text, a:=Pos(r,s);
edit 13.
end,
procedure TForml .Button6Click(Sender: TObject); begin s:=editl. Text;
![]()
№ 22
Нахождение индекса в массиве случайных чисел
работы - создать программу, которая находит индекс числа в массиве случайных чисел.
Описание плана разработки программы
1. Открыть новый проект.
2. Разместить
на форме экземпляры компонентов: Button, Edit, Label![]()
3. Выполнить следующие действия:
Таблица 22.
|
Выделенный объект |
Вкладка окна 0Wect Ins ector |
Имя свойства/ имя события |
Действие |
|
Form1 |
Properties |
Caption |
Установка имени формы «Новый п оект» |
|
Events |
0nCreate |
Очистить значения свойств Тем текстовых полей |
|
|
Button1 |
Рто erties |
Са tion |
Введите название «Очистить» |
|
Events |
0nclick |
Очистить значения свойств Text текстовых полей |
|
|
Button2 |
Properties |
Caption |
Введите название «Закрыть» |
|
Events |
0nclick |
Обработка события закрытия о мы |
|
|
Button3 |
Properties |
Caption |
Введите название «Найти первый индекс» |
|
Events |
0nclick |
Обработка события нахождения индекса введенного числа |
|
|
Button4 |
Properties |
Caption |
Введите название «Ввести сл чайным об азом» |
|
Events |
0nclick |
Ввод массива случайным образом |
|
|
Edit1 |
Properties |
Caption |
Очистить значение свойства Text |
|
Edit2 |
Properties |
Caption |
Очистить значение свойства Text |
|
Edit3 |
Properties |
Caption |
Очистить значение свойства Text |
4. Введите
переменные ik К, i : integer; s : string; а : array [1. 15] of integer![]()
5. Сохраните проект, запустите и протестируйте его.
Листинг программы procedure Tform 1 .FormCreate(Sender: ТоЬј ect); begin
Editl. ТеМ
Edit2.Text
Edit3.
end;
procedure Tform .Button Click(Sender: ТоЬј ect); begin
. Text
Edit2.Text
Edit3.
end;
procedure Tform 1.Button2Click(Sender: ТоЬј ect); begin close•
end,
иге “1“form 1. Button3Click(Sender:
Tobject); hegin
К .= StTT0111t (Edit2.Text); For То 15 do
ifk = a[i] Теп ik := i; ifik О then Edit3.Text — питЬег uhsent'
end,
иге “1Тогт 1. Button4Click(Sender:
Tobject); hegin
randomize•,
to 15 do begin
j•ajjd01jj
(26); s := concat IntToStr (a[il), #32); епа![]()
Editl TexT
end, end![]()
Вид проекта по действиям:![]()
|
|
|
1)
|
Form1
|
||||||
Массив
Оспо Вывести номер числа или спобщение аб его ошибке
ПЧИСТИТЬ закрыть |
|
Form1
|
|
|
Массив Ввести случайным образом 1
1 в 1 10 17 15 12 17 22 1 24 Число Вывести номер числв или спобщение Пб его ошибке
ОЧИСТИТЬ закрыть |
З)4)
Ряс- 45.![]()
№ 23
Находение минимального и максимального числа в массиве
работы - создать программу, которая находит минимальное и максимальное числа в введенном массиве.
Описание плана разработки программы
1. Открыть новый проект.
2. Разместить
на форме экземпляры компонентов: Button, Edit, Label![]()
3. Выполнить следующие действия:
Таблица 23.
|
Выделенный объект |
Вкладка окна 0Wcct Ins cctor |
Имя свойства/ имя события |
Действие |
|
|
Form1 |
Рто erties |
Са tion |
Установка имени |
о мы «Поиск» |
|
Events |
0nCreate |
Очистить значения свойств Тем текстовых полей |
||
|
Button1 |
Рто erties |
Са tion |
Введите название «Очистить» |
|
|
Events |
0nclick |
Очистить значения свойств Text текстовых полей |
||
|
Button2 |
Properties |
Caption |
Введите название «Закрыть» |
|
|
Events |
0nclick |
Обработка события закрытия о мы |
||
|
Button3 |
Properties |
Caption |
Введите название «Поиск» |
|
|
Events |
0nclick |
Обработка события нахождения минимального и максимального чисел во введенном массиве |
||
|
Edit1 |
Properties |
Caption |
Очистить значение свойства Text |
|
|
Edit2 |
Properties |
Caption |
Очистить значение свойства Text |
|
|
Edit3 |
Properties |
Caption |
Очистить значение свойства Text |
|
4. Введите переменные s, ss: string ; а: array [1..15] of integer; 1, .ј, К, тах, min, р, code : integer.
5. Сохраните проект, запустите и протестируйте его.
Листинг подпрограмм procedure Tform 1 .FormCreate(Sender: Tobject); begin
Editl. ТеМ
Edit2.Text
Edit3.
end;
procedure Tform .Button Click(Sender: ТоЬј ect); begin
Editl. ТеМ
Edit2.Text
Edit3.
end;
procedure Tform 1.Button2Click(Sender: ТоЬј ect); begin close•
end,
ТоЬјест): heg:in
.Text; s := concat![]()
*yl'tilc Lcng1h(s) О Ио begin
•end мах := Forj
лт1л := а[1]•
Forj 1
if [11in aLil then [11in![]()
Edit3-Text := lntToStr (птах);
ГМ(т2 Техт
end,
|
|
|
|||||||||||||||||
рис. 46![]()
24
«Текущее время текущая дата»
работы -, создать программу, которая
выводит текущее время текущую дату
Описание (1,113143
программы
1. Открыть новый прОСкт.
2 Разместить на форме экземпляры комлонентое: Button Edit, 1-.*hel.
3. Вы (дол
действия![]()
Таблица 24.
|
|
|
|
|
|||||||||||||
|
Forml |
|
erties |
|
|
Установка имени |
мы «Тайме » |
||||||||||
|
ButtonI |
Р |
erties |
Са • ол |
Введите название «Тех щее в емя» |
||||||||||||
|
Events |
0nclick |
|
||||||||||||||
|
Button2 |
Propenies |
Captjon |
Введите |
|||||||||||||
|
Ever.ts |
(.)wclick |
|
||||||||||||||
|
EditI |
Propenies |
Caption |
Очистить злачелие свойства Text |
|||||||||||||
|
Edit2 |
Properties |
Captjon |
Очистятъ значение свойства Тем |
|||||||||||||
|
Таймер
|
|
||||||||||||||
|
Таймер |
|
||||||||||||||
|
1 Б: 24:34
|
|
||||||||||||||
Рис. 47![]()
Листинг подпрограмм
DateTimc : TdateTimc;
ТоЬјест); heg:in
![]()
end,
proced иге Тогп1 Т. Buttor12C.lick(Sender 'Tobject);
1;yegin
![]()
1.1e.Nb paó0Tbå nporpaMMY fOneKTp•0HHbte qaCEA», B
0K}ie: woropoii oroópa3Kae•rcq meKyuaee apex"Ç At:ra gem,
ueae-ll".
|
|
Bperaq
|
P„c. 48.
01"'caH1'e onatta pmpaõ0TK'/4 nporpaMMb1
3.
3.4. [Ipoueaypa FormTime oópz6aTbtazeT C06b1Tl•e
Paint![]()
3.5. lÄpoueaypa 'TimerlTimer oópaöaTbtaae•T c'trnaJ1 Tantepa.
3.6. [Ipoucuypa FormCreate oõpa5aTb1BaeT C03b1T"C OnCreate.
![]()
uses
Windows, Mess-ages, SysL't11s, Variants, Classes, Graphics, Controls, Forms,
Dialogs
StdCtrls, ExtCtrls; type
![]()
Label]: TLabel; // apeMA
Labe12 //
procedure TimerlTimerCSender: TObject);
procedure FormCreate(Sender: TObject); procedure FormPaint(SeJ1der: TObject);
procedure ShowTime;
{ Private declarations
public
{ Public declarations
end;
Farml•
TForml;
implementation
, 'BTOPHHK'![]()
' cpena' ,
'qeTBepr' , '1MTHHua', 'cy 660Ta')![]()

{$R *.dfm} procedure TForml. ShowTime; var Time : TDateTime; // TeKY1uee Bper:vlfl begin
Time := Now(); //
CHCTeMHoe Bperqq
Label I Caption :=
FormatDateTime('hh:mm:ss',Time)•
end![]()
procedure TForml. Timer I Timer(Sender: TObj ect)•
begin
ShowTime; // OT06Pa3HTb
end![]()
procedure TForml .FormCreate(Sender: TObject); var
Present: TDateTime; // TeKY1uaq naTa H BpeM¶
Year, Month, Day : Word; // non, MeC¶U H HHCJIO, KaK // OTAeJ1bHb1e qucna begin
Present:= Now; // 110JIYHHTb TeKY1-uyk0 nay
DecodeDate(Present, Year, Month, Day);
Labe12.Caption := 'CeroAH¶
'+1ntToStr(Day)+
stMonth[Month] + ' '+ ![]()
rona,
'+ stDay[DayOfWeek(Present)];
// HaCTPOHTb 3anyCTHTb Tañrqep
Timer I Interval := 1000; // nepH0A CHFHaJIOB Tañrqepa I c Timerl Enabled True; // nycK Tañrqepa end;
procedure TForml .FormPaint(Sender: TObject); begin
ShowTime; // OT06Pa3HTb qacbl end;
end.
Практическая работа 26
Графика
Для рисования статлчных рисунков
используется компонент PajntBo.x (панель System). Этот хомпонект размещается ва
форме д виде прозрачного пунктткртлзго квадрата,
в его пределах можно
рисовать. Рясовануе выполняется обращенлем к свойству CTvas (графлчесхая канва)
этого комлонента: PaintBox1.Canvas. У него в свою очередь есть СВОЙСТВО Pixels
(Pain1I30*l
ко:орое представляет СОБОЙ матрицу.
двумерный
масскв заданного размера - поточечный
образ канвы, каждый элемент - отдельная тонка. В
PixetsIj отсчет точек
(глкселов экрана) начикается с 0.
Координаты х» у
о'г верхнего угла.
есть он считается ТОЧКОЙ
с коордкнатой (0, ОХ увеличенле по осл х
яде-г слева направо, а по осм у • сверху выв. Для
холкрет•гой точки
указывается цвет Фуккцмя RGB() формнрует деет комбилацией интенсивностя
красного, зеленого и синего (интенсивность задается числом от О до 255).
Например, черный • красный •
син•тй •
белый •
![]()
Цель работы - создать программуе
выполняющую следуюи.ще действкя:
Роместгт•гь ка форме компоне•п PaintBox.
2. Затолнттть доступную канву ЗОО
красными точками н случайных
нажатиям
на некоторую кнолк-у-
З Для выхода из программы лесб.ходимо щелкнуть МЫШЬЮ па закрывающей хлопке д строке заголовка.
4. Записать ход в обработчике НЕЖЕТТМЯ.
|
|
Рисование
|
|
|
|
РТС. 49![]()
![]()
var i,xey: lntcger; begin randomite; for i := 1 to ЗОО do
begin
х := ra11dom(lOO)•,
.CajjvasPixels1*vyI
end end;
![]()
|
|
||
|
|
|
|
|
|
||
углов
proced иге
ТРогп11.Butt0I11 C.lick(Scndcr: TOhj ect}•, vnr lnteger;
bcgin
PaintBox1 .Canvas-Brvsh-Co[or :=
Pai11tBo.x
I
00, 100)); foti := I to 300 do
heg:in
![]()
У = ra11dom(lOO)•,
PaintBoxl .Cajwas.Pi.xelsIx,yl :=
спо end;
7. Залолтмтъ хапву случайлммл
разноцветными лтмиями раздой
Ливня рисуется с помощью методов (сначала
задается начальная точка, готом конечная)•
?AintBax1 , Canvas , LineTa ;
Цвет линни и толщина задактјс.я СВОЙсТВОМ канвы Реп (карандаш). Реј'(.Со1от - лне:• карандаша), Реп. Width • толщина лкнм•т в пиксела.х (го умолчанию • 1).

Puc. 52. fori I to 300 do begin
PaintBoxl .Canvas .Pen.Color :=
PaintBoxl .Canvas.Pen.Width
X LLL
y := randamC100)•, PaintBox I .Canvas.MoveToCx.O; x := randomC100)•, y :=
randomC100)•,
![]()
end
8 oöpa30M
OKpynu oxpy*lloe-r'l -
c.nyqaii
a 3a.'T'U3ae•rc7 BHYTP'J UBCTOM Brush
|
|
PhcoBawe |
|
|
|
Pitt. 53.
fori 1
begin
// ager 1.ü'W"lla. óyayuaero annunca
PainiBox1 Canvas Pen color
PaintBoxl-Canvas-Pen-Width
:=
//
m tympellltoc•rot
// координаты углов прямоугольника, в который вписывается эллипс х := random(150)• У random(150); х2 := random(150)• у2 := random(150);
/ / вписываем эллипс
PaintBox1 . Canvas . E11ipse (х, у, х 2, у 2) ; end ;
9.
Сделать канву на весь экран. Заполнить разноцветными
прямоугольниками в случайных позициях и случайных размеров с помощью FillRect()![]()
10.
Создать графический образ так называемого множества Жюлиа.
procedure TForm .Button Click(Sender: ТОЬј ect); var
: REAL ![]()
: INTEGER,
// вывод точки заданного цвета procedure PUTPIXEL(x,y,c:Integer); var сс: TColor• begin case с mod 8 of
О:сс.=clBlack; 1 :сс.=clRed,
2:cc:=clLime,
Yellow;
5:cc.=clFuchsia, б:сс.=clAqua;
![]()
end;
PaintBoxl.Canvas.Pixels[x,y] сс; end; procedure QWA
begin

end, procedure I<UB; begin

end
Begin
КЕРЕАТ
КО;
Т RE*RE > 50 then break;
if > 50
then break![]()
UNTIL V
if ( ABS(RE) > 10 ) or ( ABS(M) >
1000) then begin
![]()

UNTIL X>320
paóora 27
«OJ111MnniicR"ii![]()
paõ0Tb' - c:03aaTb nporpaMMY, xo-ropas 110BepxHocT'1
•:þOPMb] pHcye•r
rbnar![]()
|
|
Onn.lnhaaa |
|
|
|
P"C. 54.
nporpaMMb1t unit Unit],
uses
Windows, Mess-ages, SysLtils, Variants, Classes, Graphics, Controls, Forms,
![]()
Dialogs
L classCTFonn) procedure
FormPaint(SeJ1der: TObject); private
{ Private declarations ![]()
public
{ Public declarations ![]()
Forml• LTForm l ;
procedure TForm1 .FormPaintCSender:
TObjectJ; begin with Canvas do begin
// aOJtOTHltme
Canvas.Pen.Width := 1![]()
Canvas.Pen .Color := c] Black;
Canvas.Brush.Color := clCream;
![]()
Pen.Width 2![]()
Brush. Style bsClear• // 06naCTb BHYTPH Kpyra
// He 3aKpa111HBaTb
Pen.Color := clBlue
Pen. Color := clBlack;
1 10,80);
Pen. Color := clRed,
Pen. Color := clYellow;
![]()
Pen. Color := clGreen![]()
125, 105); end
end![]()
Практическая работа 28
«Узоры»
Цель работы -, создать программу,
выполнявшую следуюите действия без участия пользователя •
1. После
запуска программы в окне изображаются рисункк, созданные самой лрограммой ло
заранее заданным правилам.![]()
2. Картинка
ОбНОНЛј;ејС.Я «сама собой». Интервал таймера может быть любым. Он ![]()
зависит от
компьютера. на котором работаег программа.
З. Для выхода из программы необходимо
щелкнуть МЫШЬТО да №крывајощей ктогке в строке![]()

Рис. 55.
Описание плана разработки программы
Открыть повый проект![]()
2.
на форме экземпляры
компонентов сбластн рисования
таймер Timer![]()
З Область рксоватштя представить в
гл.де клеток (точек или пикселов). Каждая клетка тго;рацддена н свой лне:•. В
ходе
грета мен;нтгс.я.
4 Описать предварительно константы в окне кода пред ключевым словом:
Соты size 40; csize 12;
Colors: array [1..16] =
(clRed, clCiray. c(Fuchsia.
с1Теа1г c]Navy, с[Магоопе c[Limc, c]Pwple, c]Silyer, c]Aqua,![]()
![]()
Кокставта size задает число клеточек ло
каждому лалрадлетмто, кокставта csize — число используемых цнегон. Массив
C010TS
определяет цвета![]()
![]()
В разделе оплсанкй
лосле ключевого слова var описыв.ается массив клеток
Points: array[l.-size,
I -sizel of1nte t•er, 5 Выполнкть следующие действия:
Таблица 25![]()
|
|
|
|
|
|
|
Form1 |
р C1•tie.s |
Са ion |
Установка имени |
о мы «Узо |
|
EveI1ts |
0IICTeate |
В процедуре обеспечить неповторимость случайных чисел с помощью лродедуры Randomize. Пронести инициализацию массива пикселов. |
||
|
Pai“tBox1 Svs1e111} |
Eoperties |
Hei |
Задать значение 320 |
|
|
Width |
Задать значен№е 320 |
|||
П одолжение таблицы 25
|
Выделенный объект |
Вкладка окна 0b ect Inspector |
Имя свойства] имя события |
Действие |
|
|
|
Canvas |
Свойства и методы этого свойства обеспечивают рисование. Метод Rectangle рисует прямоугольник с заданными вершинами. Цвет контура задается свойством Pen.Color, а цвет зак аски — свойством Brush.Color. |
|
Timer1 (Вкладка System) |
Properties |
Interval |
Задать значение 100 (одна десятая сек нды |
|
Events |
0nTimer |
В созданной процедуре-заготовке Timer1Timer описать переменные с (color), ир (ИР), d (down), (left), (right). Новые значения цветов записываются в отдельном массиве NewPoints. Написать п авила, по кото ым б д т меняться цвета. |
6. Сохраните проект, запустите и протестируйте его.
Листинг подпрограммы procedure TForml .FormCreate
(Sender: TObject)•
var i, j : Integer; begin
Randomize; for i 1 to size do {инициализация массива пикселов} for i 1 to size do
Points[i, .j] 1 + Random (csize);
{Минимально возможное значение элемента массива равно l } end
procedure
TForml .Timerl Timer (Sender: TObject)•
var i, j : Integer• с,
1, г, и d . Integer
newPoints: array [l..size, l..size] of
Integer• begin
{Вычислить, какого цвета будет клетка на следующем шаге}
for i to size do
to size do begin с := Points[i, .ј] + 1;
{Вычисляется «следующий цвет» и запоминается в переменной с} if с > csize
then с Г, Мосле последнего цвета идет первый}
{Вычисляются индексы для клеток, примыкающих к данной сверху, снизу, слева и справа. Края узора как бы «склеены» друг с другом}
![]()
ifu 0 then и size;
![]()
ifd > size then d :=![]()
![]()
ifl 0 then 1 swe•,
![]()
if r > size then .1![]()
newPoints [i, ј] := Points [i, ј]; {Если среди «соседей» цвет отсутствует, то клетка остается без изменении
{Если хотя бы один из «соседей»
имеет такой цвет, клетка перекрашивается} if (Points [и, ј] = с) or (Points Щ,
ј] = с) or (Points [i, 1] = с) or (Points [i, r] = с) then newPoints [i, ј] с;
end
с — 320 div size; {Выбирается размер
клетки так, чтобы узор занимал, по возможности, всю область рисования}
{Обновляется узор на экране} for i to size do forj to size do begin
Points [i, ј] := newPoints [i, ј]![]()
{Настроить цвет контура прямоугольника и цвет закраски}
PaintBox1 .Canvas.Pen.Color := Colors[Points[i, ј]]![]()
PaintBox1 .Canvas.Brush.Color := Colors[Points[i,
{Выполнить
рисование}
PaintBoxl.Canvas.Rectangle (c*(i - 1), с*(ј - 1), c*i![]()
{Параметры метода Rectangle подобраны так, чтобы между клетками оставался небольшой зазор. Чтобы клетки располагались вплотную друг к другу, заменить
(c*(i - 1), с*(ј - 1), c*i
1) на (c*(i - 1),
с*(ј - 1), c*i , с*ј } end
end![]()
Практическая работа 29
Перемещение рисунка
Цель работы • создать программу, в которой
на поверхности окна перемещается
случайным образом изображение веселой
рожицы. Пользователь сделать щелчок кнопкой мысли по язображхюпо. Программа
должна заверижть работу после тогое как пользователь сделает 10 щелчков кнопкой
мыши.![]()
Начало ИГРЫ
по нажатию на кнопку ОК.
Свойство !VordWrGp компонента Lubel —
гчятзнак того. что слова, которые не помеща•отея в текущей строке,
автоматически лерелосятся ла следуощујо строку (значевтке свойства ДОЛЖНО бьг•ъ![]()
|
|
|
|||||||
|
Поймай смешинку |
|
||||||
|
|
|
||||||
Рис. 56.
Листинг программы:
unit
interface
uses
Windows,
SysVti1s,
Vafiants, Classes, Ciraphics, Contf01s, Forms,
S1dC1tls.![]()
(УРС
•TFoa111 = class{TFofT11) Timer: TTimer;
ТГаЪе1; Buttor11: TButt011; procedure
TimerTimer(Sender:
ТОЬјес(ј; procedwe TObject; Button: T,MouseButton;
Shiti: “I“ShiftState; Х, У: lnteger); proccdure Винол TObject)l pivate
P1iva(e } puhlic
{ Public declarations }
{ 06bflBJ1eHHe npouenyp 110Me1-ueH0 crona,
HT06b1 npouenypbl HMeJIH AOCTyn K Ha KOTOPOñ OHM pucyroT}
procedure PaintFace (x,y:
integer); {pucyeT po)KHLIY} procedure EraseFace(x,y: integer); {cTHpaeT
po)KHuy} end![]()
Forml: TForm1
fx,fy: integer; { KOOPAHHaTb1 PDKHUb1} n:
integer;
p: integer; { KOJIMqeCTBO
nonanaHHñ}
{ pucyeT po)KHuy} procedure TForml .PaintFace(x,y: integer); begin
Canvas.Pen.Color := clBlack; { UBeT JIHHHM} Canvas.Brush.Color := clRed; { UBeT 3aKpacKH} { pucyeM PO)KHuy}
Canvas.Ellipse(x,y,x+30,Y+30)• { JIHuo}
Canvas.Ellipse(x+9,y+10,x+l l,y+13); { .neBb1Ï1 rna3}
Canvas.Ellipse(x+19,y+10,x+21,y+13); { npaBb1Ï1 rna3}
Canvas.Arc(x+4,y+4,x+26,y+26,x,y+20,x+30,y+20);
{YJ1b16Ka} end![]()
{ cTHpaeT PO)KHuy} procedure TForml .EraseFace(x,y: integer) begin
{ 3anaAHM
1-1BeT rpaHHL1b1 H 1-1BeT 3aKpacKH, comuanarouwñ C UBeTOM![]()
{ Flo YMOnqaHHkO UBeT (þopMb1 - clBtnFace } Canvas.Pen.Color := clBtnFace; { UBeT 0Kpy)KHocTH}
Canvas.Brush.Color .= clBtnFace; { UBeT 3cmcpacKH}
Canvas.Ellipse(x,y,x+30,y+30); end;
{$R *.dfm}
procedure TForml. TimerTimer(Sender: TObject); begin
EraseFace(fx,fy);
{ HOBOe INOJIO)1œHHe PO)KHUb1}
fx:=
Random(ClientWidth-30); { 30 - 3T0 nuaMeTp PO)KHUb1} fy
Random(ClientHeight-30);
PaintFace(fx,fy); end; procedure TForml
.FormCreate(Sender: TObject); begin
{ ucx0AHoe
ITOJIO)KeHHe PO)KHUb1} fx:=100![]()
Randomize; {
HHH1-U1aJIH3aUH¶ reHepampa CJ1yqañHb1X qucen} end![]()
procedure TForml .FormMouseDown(Sender: TObject; Button: TMouseButton,
Shift: TShiftState; X, Y: Integer); begin inc(n); { KOJI-BO 11ÅeJIHKOB}
if (x > fx) and (x < fx+30) and (y > fy) and (y < fy+30) then begin
{ 11ÅeJILIOK no pmKHue} inc(p); end
if n
= 10 then begin
{ urpa 3aKOHqeHa}
Timer.Enabled := False; { OCTaHOBHTb TañMep}
ShowMessage('II-leJIHK0B: 10. IlonanaHHñ: ' + IntToStr(p)+'.');
EraseFace(fx,fy);
Label 1 Visible True,
Button I. Visible := True,
{ Tenepb
KHOFIKa H c00611ÅeHHe CHOBa BHAHb1} end
end![]()
procedure TForm I Button I Click(Sender: TObj ect); begin
Label I. Visible False; { CKPb1Tb c0061-ueHHe}
Button I. Visible False; { CKPb1Tb KHOHKY}
Timer.Enabled True; { TañMepa} end
end.
83
Практическая работа 30
Рисунок
Цель работы - создать программу, выводящую
на форму пр•тведенный ниже рисунок. По палатка» на клавишу «Лучи» происходит
смела валравлелия лучей. Измеглтгь программу
так, чтобы лучи
изменяли награытения без нажатия клавш.ии.![]()
|
Рисунок |
|
|
||||
|
|
||||||
|
Лучи |
|
|||||
Рис. 57.
Добавьте в форму
1mage Втоп-
2. Создайте обработчик события нажатия. Важнейшгттм сВОЙСТНОМ Image является свойство Cawvas:TCawvas (холст). Это свойство само объектом. У Canvas есть методы и свойства. Это свойства и методы рисовавкя ид холсте.
Реи: Треп (перо» рттсон,ание ЛИ НТТЙг фигур и
мером.
Важнейим•е свойства пера — Color- Тсо]ог (цвет), Width: lnteger (ижркна),
Style: TpenStyle (стиль).
Bf“fi.Sh: 'J'brvjs1j (КиСТЬ); закраска фигур. заднејх• фона
надписей тн.![]()
Важнейиже свойства кисти — Со]ог: Тсо]ог
(цвет), Style: T'hwshSty[e (СТИЛЬ).
Кот: 'l“font (шрифт): падлисл па. холсте дылолляјотея с учетом
значений его свойства F01't( При этом задний фон за
закраигивае•ся
текущим значением КИСТИ Для ![]()
того чтобы закраст не быле* нужно
установњть прозрачный СТИЛЬ кисти: Bmsh-Sty[e
Ь$С[еат, во затем пе
забудьте сделать кисть непрозрачной: Brush.Style bsSotid, иначе фигуры, которые
вы будете в дальнейшем рисовать, тОже окажутся незакраијеннымл. Важнейим•е
свойства шрифта — Миле: string (имя), Size: 111teger (размер), C.olor: Тсо[ог
(цвет) Вы также ислользова.“ји два метода![]()
Reetangie(Xl, У 1, Х2е II1teger) (прямоугольнлк): рисует
прямоугольник,
закраижвая его кистью и обводя пером (в
нашем случае, того чтобы рамки не бЬIЛО
НЈТДНО* мы сделали
кисти и пера
В качестве параметров задаются ![]()
координаты
верхнего левого .Xl* и нижнего правого Х2е углов относительно верхнего левого у
гла холста.
У: ln1ege(. CO(jS1
ТРУТ: S11'i1jg) (вывести текст): рисует текст согласно заданному шрифту и
закрашивая задний фон согласно заданной кисти (в нашем случае эта закраска
незаметпа, поскольку текст рисуется на том же фоне, что и текущее значенке
КИСГЈТ) В качестве параметров задаются координаты верхнело угла текста Х. У
ОТНОСиТ"ЛЬНО верхнего левого угла холста и текст НЕДПКСГ] Тем.
3
Нарисуйте градиентно закрашенное синее небо отдельными линиями,
каждую следующую линию рисуя более светлой. Таким образом, рисование
выполняется в цикле. Необходимо определить локальную переменную. В цикле
меняются значения цветов
устанавливается перо в точку и чертится
линия из этой точки в другую.
• MoveTo(X, У: Integer) (передвинуть перо): передвигает позицию пера в точку холста в координаты Х, У. При этом на холсте ничего не рисуется;
• LineTo(X, У: Integer) (чертить линию): чертит линию из точки, в которой находилось перо, в точку Х, У, используя текущее перо. При этом перо тоже перемещается в эту точку .
Местоположение пера хранится в свойстве холста PenPos: Tpoint. Запись в эту переменную полностью эквивалентна вызову метода MoveTo. Цвет можно задавать, используя константы цвета clBlack, clNavy, clGreen и т.д. полный список констант находится в выпадающем списке свойства Color в Инспекторе Объектов. Цвет также можно задать, используя функцию RGB (Red, Green, Шие: byte), в параметрах Red, Green и Blue указываются значения интенсивности красной, зеленой и синей компоненты цвета (от 0 до 255 каждая).
4
Добавить на небо солнце. Нарисовать эллипс с линиями-лучами. Лучи
нарисовать случайным образом, для этого необходимо использовать генератор
случайных чисел. • Круги и эллипсы рисуются с помощью метода холста Ellipse(Xl,
У 1 Х2, У2: Integer)
Как и прямоугольник, эллипс закрашивается
текущей кистью и обводится текущим пером. В качестве параметров Х 1, У 1 Х2 У2
необходимо указать левый верхний и нижний правый углы прямоугольника, в который
«вписан» эллипс. Если У2 — У 1 = Х2 — Х 1 (то есть прямоугольник является
квадратом), эллипс рисуется как круг.
Датчик случайных чисел — функция random
выдает число типа double в диапазоне от 0 до ![]()
5. Нарисовать облака. Можно воспользоваться картинкой из
файла. Нарисовать в стандартном редакторе Paint облако: а) установить атрибуты
картинки — ширина 100
высота 50; б) закрасить картинку черным
цветом этот цвет в программе будет прозрачным; в) нарисовать облако, используя
инструмент Распылитель и различные оттенки серого; г) проследите, чтобы левая
нижняя точка картинки осталась черной (именно по этой точке автоматически
определяется прозрачный цвет)
6 Сохранить картинку в файл.
7
Добавить в форму еще один Image, щелкнуть по нему мышкой и
загрузить в него картинку. Сделать его прозрачным можно, установив свойство
Transparent. Поскольку он вспомогательный, лучше, чтобы он не был виден во
время работы программы, поэтому отключите ему свойство Visible![]()
8 Добавить компонент Timer. Установите его интервал 100.
9. На вкладке событий Инспектора Объектов напротив события 0nTimer в выпадающем списке выберите имя обработчика события ButtonlClick. Таким образом устанавливается уже существующий обработчик для еще одного события.
10. В программе каждые сто миллисекунд будет вызываться событие и происходить перерисовка картинки, как если бы мы нажимали каждый раз кнопку. Замедлить интервал между перерисовкой картинки можно, увеличив интервал таймера.
11. При рисовании часто требуется использовать более сложные объекты, чем просто комбинации линий прямоугольников и эллипсов. Может возникнуть необходимость использования готового растрового изображения. Кроме того, может понадобиться копирование изображения из одного lmage на другой. Для этого используется метод холста Draw(X, У: Integer; Graphic: Tgraphic). Этот метод практически копирует графический объект на холст в область с координатами верхнего левого угла Х У. Графическим объектом Graphic могут быть битовые картинки, иконки и метафайлы. Для нас важным является его применение к копированию картинок из одного Image в другой. Это делается следующим образом:
85
ImageA. Canvas.Draw(X, Y, ImageB.Picture.Bitmap)
I-IPH 3TOM Bce, I-ITO HapHCOBaH0 Ha ImageB,
6yneT CKOflHPOBaHO Ha ImageA. ECJIH ImageB. Transparent = true, TO KaPTHHKa
KonnpyeTcq c np03paHHb1M![]()
BMecT0 ImageA
H ImageB COOTBeTCTBeHHO HOACTaBbTe HY)KHb1e Bap„l HMeHa KOM110HeHTOB,
B Bameñ nporpaMMe:
Image l. Canvas.Draw(130 + random(2), 20 + random(2), Image2.PicÍure.BiÍmap);
Image l. Canvas. Draw (100 + random(2), 50 + random(2), Image2.Picture.Bitmap); Image l. Canvas.Draw(170 + random(2), 80 + random(2), Image2.Picture.Bitmap);
TaKHM 06pa30M, PHCOBaHH¶ MO)KHO HCflOJ1b30BaTb JIF06b1e KaPTHHKH (þañna — 06naKa, AOMHKH, nepc0Ha)Keñ, noroTur1b1 H T.n.
JIucT11Hr nporpaMMb1
procedure Tform I Button I Click(Sender: Tobj ect); var i:integer; begin
Imagel Canvas.Pen.Color := clGreen![]()
Imagel Canvas.Brush.Color := clGreen![]()
Imagel. Canvas. Rectangle((), 200, 300, 300);
Imagel. Canvas Font. Color clWhite,
Image I. Canvas.Font. Size 30![]()
Imagel. Canvas.Font.Name ' Ari al
Image I.
Canvas. TextOut( 10, 250, 'Delphi
for i := 0 to 200 do begin
Imagel. Canvas Pen. Color RGB(I, 1, 255);
Imagel Canvas.MoveTo(0, 1)![]()
Imagel Canvas.LineTo(300, i) end![]()
Imagel Canvas.Pen.Color := clRed•
Imagel Canvas.Brush.Color := clYellow![]()
Imagel.Canvas.Ellipse(20, 20, 60, 60) Imagel Canvas.Pen.Color
:= clYellow
for i 1 to 20 do begin
Imagel Canvas.MoveTo(40, 40);
Imagel Canvas.LineTo(5 + random(70), 5 + random(70)); end; end; end.
Практическая работа 31
графики
Цель работы создать программу лостроения
графкка, в которой устанавливается масштаб, в дккле осуществляется построе•лте
графика функции, рисуются оси координат
печатаются на НИХ
числовые шкалы.

Описание плана разработки программы
1. Открыть повый проект.
2. Разместить
на форме экземпляры компонентов: кнопка Butt0't область рисования
PaintBox-
3.
следующие
действия![]()
Таблица 26.
|
Выделенный объект |
|
|
Действие |
|
|
|
Pj•pej'Ties |
Сар(Јоп |
Установка имени форм ы «Граф кк
|
|
|
Button1 |
р Cl"tie.s |
Са ion |
Введите название «Г |
|
|
Ever.ts |
0nclick |
Написать процедуру, рисующую кк по точкам |
||
|
PaintBoxl |
Properties |
Canvas |
Соединенке ЛИНКЯММ получаемых точек |
|
|
Button2 |
Propenies |
Captjon |
Вдедттте назвалие «Выход» |
|
|
Even1s |
|
|
||
4 Сохраните ('јроек•г,
и протестируйте ело.
Листинг программы
иге “1“Forml .Buttonl
Click(Sender: Tobjecti
function
var c:integer•, hegin
![]()
end,
![]()
heg:in
PaintBoxl![]()
1. Canvas.LineT0(410, 150) x:=0
for
x:=0 to 350 do begin
PaintBox I. Canvas.LineTo(x, f(x)+150) end
end![]()
procedure Tform I .Button2Click(Sender: Tobj ect); begin
Close, end
end![]()
Практическая работа 32
«Градусник»
Цель работы - создать программу, которая
лереводкт
температуры по Цельсию в значения
температуры по Фарелгейту. Введите графический обккт кзображевия значен
температуры .
1. Поместите на форму два поля ввода Edit 1• четыре кнопки.
|
|
Градусник |
||||
П чистить Звкрьть |
Рис 59.
2. Ввести
чкс.ло в левое поле. По накатно на кнопку «по Фаренгейту» в правом лоле
преобразованное
число. По нажатию
очищаются (золя ввода.
З Огратмчьте вводимые температуры
диапазоном от ТС до (если дведело значевке,
2 Т 2 • то (ЗРИ
кнопки
в (голях неода должно отобразиться ТОО и 212 соответственно).
4. Отобразить
столбик термометра графкческк. Добавьте комлоленты![]()
5. Сделать
видимой ТОЛЬКО гу кнопку.
ореобразонания.
Листинг программы
unitU1jitl; interface
Windows± Messagese SysUtils. Vaiants, Classcs Graphics, Cor.trols, Еогп15,
Dialogs, StdCtrls, ExtCtrls![]()
TForm1 = class(TForm) Editi: TEdit![]()
Edit2: TEdit![]()
Button I : TButton, Button2: TButton,
Button3: TButton,
Button4: TButton, Imagel: TImage;
Image2: TImage;
Label 1: TLabel
Labe12: TLabel
procedure
FormCreate(Sender: TObj ect); procedure Button2Click(Sender: TObject);
procedure Button I Click(Sender: TObject); procedure Button3Click(Sender:
TObject); procedure Button4Click(Sender: TObject);
{ Private declarations } public
{ Public declarations } end
var
{$R * dfm}
procedure TForml .FormCreate(Sender: T Object)
begin
Edit2. Text![]()
Imagel .Canvas.Pen.Color .= clRed•
Imagel .Canvas.Brush.Color := clWhite• Image I . Canvas.Rectangle( 10, I , 23 60); Image2.Canvas.Pen.Color clBlue•
Image2.Canvas.Brush.Color clWhite•
Image2. Canvas Rectangle(10, 1,23 60); end;
procedure TForml .Button2Click(Sender: TObject); var a,
b, c : real• begin a StrT0Float(Editl . Text); if (a > 0) or (a < 100)
then b 1.8 * a + 32 • if a > I OO then b
if a < 0 then b 32•
Edit2
Text FloatT0Str(b);
Imagel .Canvas.Pen.Color := clRed•
Imagel .Canvas.Brush.Color .= clWhite![]()
Image I. Canvas.Rectangle(10, 1,23, 360)
Imagel .Canvas.Pen.Color := clRed![]()
Imagel
.Canvas.Brush.Color := clRed
Image I. Canvas.Rectangle(10, round(3
Image2.Canvas.Pen.Color := clBlue
Image2.Canvas.Brush.Color := clWhite,
Image2.Canvas.Rectangle(10, 1,23, 360)
Image2.Canvas.Pen.Color := clBlue![]()
Image2.Canvas.Brush.Color := clBlue;
Image2.Canvas.Rectangle(10,
end![]()
procedure TForm I Hutton I Click(Sender: TObj ect); var a, c,
d : real
begin c := StrToFloat(Edit2.Text); if (c
> 32) or (c < 212) then d ( c - 32)/1.8, if c < 32 then d := 0
if c
> 212 then d := 100
Editl. Text FloatT0Str(d);
Image2.Canvas.Pen.Color := clBlue![]()
Image2.Canvas.Brush.Color := clWhite
Image2.Canvas Rectangle(10, I , 23 , 3 60) •
Image2.Canvas.Pen.Color := clBlue![]()
Image2.Canvas.Brush.Color
:= clBlue
Image2.Canvas Rectangle( 10, round(3
Imagel .Canvas.Pen.Color := clRed
Imagel .Canvas.Brush.Color := clWhite
Image I. Canvas.Rectangle(10, I , 23 , 3 60) •
Imagel .Canvas.Pen.Color := clRed•
Imagel .Canvas.Brush.Color .= clRed![]()
procedure TForml .Button3Click(Sender: TObject); begin
Edit2.Text![]()
Imagel .Canvas.Pen.Color clRed•
Imagel .Canvas.Brush.Color clWhite• Image I. Canvas.Rectangle(10, 60), Image2.Canvas.Pen.Color clBlue•
Image2.Canvas.Brush.Color clWhite•
Image2.Canvas.Rectangle(10, 1,23, 3 60), end;
procedure TForml .Button4Click(Sender: TObject); begin
91![]()
procedure TForml .EditlEnter(Sender: TObject); begin
Button2.Visible := true,
Button I. Visible := False
end![]()
procedure TForml .Edit2Enter(Sender: TObj ect); begin
Button I. Visible := True; Button2.
Visible := False
end
end![]()
Практическая работа 33 Вывод
табличных данных![]()
На одной 413 знаменитых гравюр Альбрехта
Дюрера изображен магический квадрат
Одним 113 его свойств является то, что
суммы ло всем столбцам, строкам диагоналям
равны.
![]()
Цель работы • создать программу,
суммы
по столбцам и строкам
чисел.
|
|
|||||||||||||||
Рис. 6! .
1. Добавлтъ
на форму сетку — компонент StringGid. Этот компонент служит для ввода и
н
таблич нь!х лан ных.
2. Необходимо
ввести данные описать событие реагированл; на их ввод. В свойстве C)ptions
устаиоттте пункт лиаче сетка будет доступкой только для чтенгл. Теперь
запуске
лрограммы МОЖНО ВВОДИТЬ текст.
З. Щелкнув мышкой в Инспекторе
Объектов. описать обработчик события 0r.SelectCell,
которое вози ккает,
когда пользователь выбирает какую-либо ячейку для редактировагмя.
4. Теперь запуске орограммы и выборе
ячейки заголовке ![]()
о столбце и строке ввода.
5 Таким сбразом, в
разделе uses возникла ссылка ла модуль Cirids, д котором описаны
компоненты
сеток. В описания класса формы добавклась переменная — ссылка на компонент
сетки, а также опкскнме метода — обработчика события- Сам обработчик
уже
разделе i1TtplejTten1a1i01j.
6. Обработать событле, возникающее. когда пользователь пытается выделить какую-нибудь ячейку.
procedure Tform1.StTingGrid1
SelectCell(Sender- Tohjeci; Асс], 111teger•, war CamSe1ect:
Всю]еап)•, hegin
Caption := $Выделена клетка ($ +
+ + lntToStriArow) + '![]()
CT'td;
В качестве лараметров обработчик получает
(кроме Sender) номер столбца, помер Слроктт переменную CanSelec1. которую можно
внутри
обработчика. та; ка; она передается как чаг.![]()
|
клетка |
|
Выделена (2:2)
|
Рис. 62.
Можно, например, залретить выделетме ячеек третьего столбца. Для этого вставьте д этот обработчик еще строчку: CaIISelect := (Acol 3);
В этом случае CM1Select будет равен fa]se, ес.лл Acol = З![]()
7. Пастрспттн
сетку в зависимости ог значения
которые надо объявить н inteface. Теперь
при запуске программы сетка имеет размер, заданный в константе, ![]()
выглядит
злачгттельно аккуратнее. Если изменить значение
то лги запуске
и
размер C€I“kl.f будет соответствующим.
8. Установить размер сетки согласно значенкн:т констант Кит и cSize, объявленных в interface• const Nll[11 4, cSize 30,
procedure Tf01T111.FormC.rcatc(Sc11dcr: Tobjcct); begin
Pefatl(1ColWid1h![]()
MyG1id Dcfau[tRowHeight := cSize;
MyGfld.ColCovnt
:= Nvm•,
MyGrid-Width := *
(cSize + 1) + З;
MyGfid.Height := Хит * (cSize + 1) + з;
MyGid.F011t.Size :=
cSize div 2; end,
|
|
||||||||||||
|
Выделена клетка(2:2)
|
Рис. 63![]()
В приведенном участке кода изменяются ширина 1• высота сеткщ
установленные по умолчанию, а также количество строк столбцов сетки. Добадлетме
едивткц'*] к мирике каждой ячейки связано с налячлем „линий между ячейками, а
добавление тройня ко всем
сумме наличием бордюра вокруг сетки. В
последней строчке устанавливается соответствую (Лјтй величине клетки размер![]()
9. Для расчета суммы по столбцам и строкам вводимых чисел написать собственную процедуру и две функции.
Функции будут рассчитывать сумму в строке и столбце, получая их номер в качестве параметра. Процедура будет в цикле вызывать эти функции и соответствующим образом заполнять клетки.
Теперь надо создать обработчик для нажатия на саму форму и описать в нем вызов расчета. Собственная процедура стоит в коде раньше, чем обработчик, из которого она вызывается. Когда описывается собственная процедура, нужно обращаться к компонентам через форму.
При запуске программы требуется
ввести числа в сетку и кликнуть на саму форму . Function ColSum(n: integer):
integer; var i: integer; begin Result := 0
for 1 to Num — 1 (10
Result := Result + StrToInt (Forml .MyGrid.Cells[n, i]); end;
function RowSum(n: integer): integer; var i: integer; begin
Result := 0
for 1 to Num — 1 (10 Result Result
+ StrToInt(Form .MyGrid.Cells[I,
end;
procedure Calculate
var i: integer; begin
for I — 1 to Num — 1 (10 begin
.MyGrid.Cells[I, 0]![]()
Forml .MyGrid.Cells[O, i] IntToStr(RowSum(i)); end; end;
В данной программе используется свойство Cells компонента сетки. Это свойство имеет тип двумерного массива строк. Счет в этом массиве начинается с нуля. Фиксированные (серые) клетки, с точки зрения индексирования массива, ничем не отличаются от прочих. В нашем случае фиксированы первая строка и первый столбец (в массиве они имеют соответствующие нулевые координаты). Поэтому при расчете суммы проходят от (а не от 0) до Num — (при индексировании с нуля последний столбец/строка имеют, понятно, номер Num — 1).
Однако, если произойдет ввод какой-нибудь
буквы, сразу возникнет исключительная
ситуация. Она, очевидно, возникает из-за
невозможности перевода буквы в число в функции StrToInt. Если нежелательно, чтобы
при возникновении исключительной ситуации программа в Delphi переходила в режим
отладки, можно отключить флажок Мепи => Tools => Debugger 0ptions =>
Language Exceptions => Stop оп Delphi Exceptions. Теперь программа будет
выполняться так, как если бы она выполнялась из-под Windows. Теперь каждый раз,
когда вводится нечисловой символ, программа не останавливается, а только
появляется
стандартное окно Windows с сообщением об
ошибке.
С помощью обработки исключений можно
избежать появления этого окна. Для этого надо добавить в функцию конструкцию
try..except. Таким образом «опасная» команда (или целый блок) помещается внутрь
конструкции try. .except..end или try..fmally. .end
function StrToVal(s:
string): integer; begin if S then Result := 0 else try
Result := StrToInt(s); except
Result := 0![]()
Forml .Caption := ' Вводить надо числа!
end; end;
Если возникает исключительная ситуация,
т.е. введено нечисловое значение, считается, что введен ноль, а также выводится
сообщение об этом пользователю. Еще нужно добавить вывод информации, что все в
порядке. А также удалить код внутри обработчика Click формы. В результате, если
введено неправильное значение, то окно ошибки не появляется, а в Caption формы
выводится напоминание.
Практическая работа № 34
«Игра»
Цель работы - создать программу — игру.
Игрок управляет пушкой зенитки, его боевое задание справиться с нашествием
воздушных шаров. Воздушные шары несут бомбы, которые они сбросят, как только
окажутся над пушкой. Необходимо не допустить этого и уничтожить их все на
подлете. Снаряды не ограничены, но следующий выстрел можно делать только после
того, как выпущенный снаряд поразит цель, упадет на землю или уйдет из зоны
видимости. В игре участвуют:
воздушные шары,
знитная пушка,
пушечный
снаряд,
бомба,
внешняя среда.
Для шаров введен специальный тип ТВаПооп.,
в котором содержатся данные о координатах шара, его скорости, состоянии и
цвете. Массив переменных Balloons типа ТВаПооп будет содержать полную
информацию обо всех шарах. Индексирование идет, начиная с нуля. Общее число
шаров в массиве задается соответствующей константой. Кроме того, к шарам
относятся константы, определяющие:
количество шаров,
их возможные цвета,
возможную
высоту над землей (всего предполагается четыре уровня) ![]()
интервал между шарами
и их радиус. type
ТВаПооп = record х, у, у, Explosion: integer; Color: TColor• end; const
BallCount = 10![]()
BallColors: array [0 .. 9] of TColor =
(clRed, clGreen clNavy, clMaroon clPurple, clOlive
clLime clYellow
clFuchsia clSilver);
BallAltitude. array [0 3] of integer = (240 160 200 120);
BallInterval = 40
BallRadius = 15
var
Forml: TForml
х, у, vx, vy, ВотЬУ, BombV: double•
Angle, GunPosition, GunExplosion: integer;
Balloons: array [0 .. BallCount - 1] 01' ТВаПооп•![]()
Зенитная пушка описывается переменными:
угол наклона
пушки,
ее положение
ее состояние.
Пушечный снаряд описывается переменными:
координатами,
текущей
скоростью,
начальной
скоростью при выстреле![]()
Бомба, сбрасываемая с воздушного шара, имеет:
координату,
скорость.
Для расчета положений объектов нужно знать ускорение падения и шаг по времени.
В качестве состояния шара и пушки мы используем переменные ТВаПооп. В определенный момент времени каждый элемент должен находиться в каком-то состоянии, определяющем то, как элемент выглядит на экране. Шары и пушка могут быть боеспособными, взрывающимися и уничтоженными.
Если Explosion 0 - шар боеспособен, если Explosion 10, то он уничтожен, а значения от 1 до 9 обозначают фазы взрыва. Чтобы инициировать взрыв боеспособного шара, нужно присвоить Explosion := 1. То же самое касается и пушки.
Состояние, в котором скорость снаряда равна нулю: 0 и Vy 0. В этом случае считают, что можно сделать новый выстрел. Пока же снаряд летит (то есть скорость его не нулевая), новый выстрел сделать нельзя.
Бомба будет сбрасываться шаром, когда он
поравняется с пушкой. Таким образом, Х координата бомбы всегда равна Х -
координате пушки. Следовательно, необходимо хранить только У-координату бомбы.
Бомба не сброшена, если ВотЬУ = 1000. Если ВотЬУ < 1000
то она
считается сброшенной и начинает падать.
Поместите на форму TrackBar, Button, Image и Timer и настройте их параметры.
Timer: Interval = 100; Image: Width = 440,
Heigth = 260; Button: Caption = ' Новая игра '
TrackBar: Min = -90,
Мах = 90, Frequency = 10.
Image - сражение в реальном времени. Timer - реальное время. Button - запуск новой игры. TrackBar - управление зенитной пушкой.
В обработчике нажатия на кнопку ”Новая игра“ необходимо обнулить параметры, расставить пушку и шары. Для каждого шара устанавливается случайное направление движения: v = 1 или —1. В зависимости от направления, определяется высота, на которой находится шар (на одном и том же уровне шары летят в одну сторону). По х-координате шары расставляются так, чтобы они шли с примерно равным интервалом в направлении пушки из-за границ экрана.
Каждый шар Balloons[i], элемент массива
Balloons, имеет тип записи ТВаПооп, и для того, чтобы получить доступ к его
элементам, нужно писать: Balloons[i].Explosion := 0 Color
BallColors[random(lO)]
и т.д. Конструкция with Balloons[i] do begin .. end позволяет избежать
повторения.
procedure TForm .Button 1 Click(Sender: ТОЬј ect); var i: integer; begin
Caption := Нашествие';
.Position О;
GunPosition := 170 + random(lOO);
Vx 0,
![]()
GunExplosion := 0; for i := 0 to BallCount— do with Balloons[i] do begin
Т random < 0.5 then v
у := BallAltitude[l +
v + random(2)] + random(lO); х := 220 - v * (220 + i * Balllnterval +
random(20));
Explosion := 0;
Color
end;
ВотЬУ
end;
В обработчик события формы 0nCreate вводится датчик случайных чисел, устанавливается клиентский размер формы (ClientWidth := 455; ClientHeight з 15;). Размер клиентской области формы в приложениях определяется автоматически как Width и Height формы минус ширина заголовка и бордюров.
procedure TForml .FormCreate(Sender: TObject); begin
Randomize;
ClientWidth := 455![]()
ClientHeight 315![]()
Button .Click; end![]()
Пушка танка будет управляться с помощью компонента TrackBar. Выстрел производится нажатием пробела на клавиатуре. При этом фокус ввода должен быть у TrackBar. В обработчике 0nkeyPress реализуется выстрел, задавая начальную скорость и положение снаряду, а также издавая звук выстрела.
Процедура, проигрывающая этот звук из лучау-файла, описана в модуле, который необходимо подключить в разделе uses. В модуле MMSystem имеется функция PlaySound, с помощью которой можно проигрывать файлы wav. Для асинхронного воспроизведения (приложение не приостанавливает работу на время воспроизведения, а проигрывает его в фоновом режиме) вызов выглядит так:
0, SND ASYNC)![]()
В стандартных звуках Microsoft 0ffrce
можно подобрать звуки для выстрела и взрыва. В зависимости от версии программы,
эти файлы хранятся в C:\Windows\Media\ Microsoft 0ffrce 2000 C:\Program
Files\Microsoft
или в какой-то подобной папке. Найдите
звуки для выстрела (условно назовем GunShot.wav) и взрыва (условно назовем
Explode.wav) и скопируйте их в папку, в которой сохранен проект.
procedure TForml .TrackBarlkeyPress(Sender: TObject; var Кеу: Char); var i: integer; begin
Т (1<еу ' ') and (Vx 0) and (Vy 0) and (GunExplosion 0) then begin try
О, SND ASYNC); except end;
Vx * Sin(Angle * pi / 180); Vy V * Cos(Angle * pi / 180); х := GunPosition + 15 * Sin(Angle * pi / 180); у := 20 + 15 * Cos(Angle * pi / 180); end;
Т (l<ey then begin
O, SND ASYNC); except
end; for i := 0 to BallCount - I do if Balloons[i].Explosion = 0 then
Balloons[i].Explosion := I![]()
Caption := 'YHHHTO)KeH'•, end; end;
B 06pa60TLIHKe H3MeHeHH¶
6erymca TrackBar MeH¶eM HaKJIOH
ny111KH.
procedure TForm I. TrackBarl Change(Sender: TObj ect); begin
Angle := TrackBarl Position, end;
BblCTpeJ1 npoucx0AHT, ecnu:
l) HOKaT np06eJ1,
2) cHapqn FOTOB (Vx = 0) H (Vy = 0);
3) 11Y111Ka 60ecnoc06Ha (GunExploion = 0).
Ilpouenypa MoveAll, Bb13b1Baervraq TaKT Tarmepa, OTBeqaeT 3a TO, HT06b1 BCe npoueccbl CBOHM HepenoM. BCTaBbTe ee cpa3Y nocne implementation.
procedure MoveAll
var i: integer; begin
for i := 0 to BallCount - I do with Balloons[i] do if Explosion = 0 then
![]()
else begin if Explosion < 10 then inc(Explosion); end; if (Vx <> 0) or (Vy <> 0) then begin x + Vx * dt• Y + Vy * dt;
Vy Vy + g * dt; end; if < 1000 then begin
BombY BombY + BombV * de
BombV BombV + g * dt end; if (GunExplosion > 0) and (GunExplosion < 10) then inc(GunExplosion); end;
IOO
Процедура пододвигает все шары, которые
живы (у них Explosion = 0), в направлении вектора их скорости. Остальные шары,
если они находятся в фазе взрыва (0 < Explosion
10), переходят в
следующую фазу.
Если снаряд выпущен (Vx о 0) или (Vy о 0), то его координата и скорость изменяются согласно законам природы.
Если бомба сброшена (ВотЬУ < 1000), то она также подчиняется закону всемирного тяготения.
Если танк находится в фазе взрыва (0 < GunExplosion < 10), он переходит в следующую фазу.
Ошибки, возникающие в обработчике таймера
или процедурах, которые вызываются из обработчика, не останавливают таймер и,
значит, через секунду возникают опять. Чтобы их остановить, приходится
использовать Ctrl-Alt-Del![]()
В этой процедуре мы работаем с массивом. Одной из самых частых ошибок, которые не так-то просто найти, является выход за границы массива. Для предотвращения подобных ситуаций включите проверку на выход из диапазона допустимых значений (Project => 0ptions => Compiler => Runtime errors => Range checking), которая по умолчанию отключена.
Перемещения сами по себе могли бы продолжаться бесконечно. Необходимо проконтролировать:
• не попал ли снаряд в шар, следовательно, взорвать его;
• не уничтожены ли все шары, следовательно, выдать надпись о победе;
• не поравнялся ли шар с пушкой, следовательно, сбросить бомбу;
• не упал ли снаряд и не вышел ли он из зоны контроля, следовательно, перезарядить пушку;
• не упала ли бомба на пушку, следовательно, закончить игру. Для контроля за передвижениями предусмотрена процедура.
procedure CheckCollisions; var i, .ј : integer;
HappyEnd: boolean
begin for i := 0 to
BallCount - 1 do with Balloons[i] do begin if (Explosion = 0) then begin if
(sqr(x - Unitl .х) + sqr(y - Unitl у) < sqr(BallRadius)) then begin
О, SND ASYNC); except
end; Explosion := ![]()
Unitl.x := О
Unitl.y := 0;
Unitl.Vx := О
Unitl.Vy := 0;
HappyEnd := (GunExplosion 0);
0 to BallCount - 1 do
HappyEnd HappyEnd and
(BalloonsLj] Fxplosion > 0); if HappyEnd then
Form 1 .Caption :=
Победа!'• end;
![]()
if (x = GunPosition) and (Bomb Y 1000) and (GunExplosion 0) then begin
BombY y - BallRadius - 5,
BombV O
end; end; end; if (y < 0) or (x < 0)
or (x > 440) then begin

end if Bomb Y < 10 then begin
BombY 1000
GunExplosion := I
try
O, SND ASYNC); except end;
B 3TOM 6JIOKe
B03MO)KHaq 0111H6Ka CB¶3aHa C HCFIOJ1b30BaHneM with . . . do begin . . . end![]()
X-K00PAHHaTa cHapqna xpaHHTC¶ B FJ106aJ1bHOï1 nepeMeHHoÏ1 x, X-K00PAHHaTa B03AY111Horo wapa B nepeMeHHoÏ1 Balloons[i].x. OAHaKO Korna IIHLIIYT KOA BHYTPH with Balloons lil do begin . . . end, TO HMeHHO K KOOPAHHaTe Il-lapa 06pa1-uaK)Tcfl npocT0 KaK K X. ECJIH HY)KHO n06paTbCfl no FJ106aJ1bHOï1 nepeMeHHoñ, TO Tenepb Y)Ke nepen Herl HY)KHO CTaBHTb YT0HHeHHe: Unit I x, rne Unit I — MOAYJI¶.
Puc0BaHHe
OTAeJ1bHb1X 3J1eMeHTOB 6aTaJIHH TaK)Ke pa3YMH0 HOMeCTHTb
Cne1-uaJIH3HPOBaHHb1e 3Toro
npouenypbl.
XYAO)KeCTBeHHb1e 06pa3b1 wapoB, H B3Pb1Ba nepenak0Tcq C HOMOLUbkO npouenyp•
procedure DrawBalloon(x, y: integer; Color: TColor)•
begin
with Form I Imagel .Canvas do begin
Pen. Color clBlack;
Brush.Color Color
Ellipse(x - BallRadius, y - BallRadius, x + BallRadius, y + BallRadius);
Pen. Color clWhite•
Brush.C010r clWhite![]()
Ellipse(x - BallRadius div 2 - 3, y - BallRadius div 2 - 3, x - BallRadius div 2 + 3, y - BallRadius
![]()
Pen Color clBlack;
Brush.Color clOlive•
Rectangle(x - 5, y + BallRadius + 5, x +
5, y + BallRadius + 10);
MoveT0(x - 5, y + BallRadius + 5);
LineT0(x - BallRadius, y);
MoveT0(x, y + BallRadius + 5);
LineT0(x, y);
MoveT0(x + 5, y + BallRadius + 5);
LineT0(x + BallRadius, y); end
end![]()
procedure DrawGun
begin with Form I
.lmagel Canvas do begin if (Vx = 0) and (Vy = 0) then
Pen.C010r RGB(O, 70, 0) else Pen.C010r clBlack;
Brush.Color := Pen. Color![]()
Pen.Width 5![]()
MoveTo(GunPosition, 240)
LineTo(GunPosition + round(15 * sin(Angle * pi / 180)), 240 - round(15 * cos(Angle * pi / 180)));
Pen.Width 1![]()
Ellipse(GunPosition - 8, 232, GunPosition + 8, 248)![]()
Rectangle(GunPosition - 10, 240, GunPosition + 10, 260)
end;
end;
Ilpouenypa DrawExplosion 06ecneHHBaeT nocTyn K KOOPAHHaTaM cHapqna.
procedure DrawExplosion(x, y, Phase: integer); var i,
xx, yy, Size: integer; a, b: double
begin with Form I .lmagel Canvas do for i
:= 0 to Phase * 10 do begin a := random * 2 * pi• b .= random * sqr(Phase) / 3
+ 5
xx := x + round(l * sin(a)); YY y +
round(l * cos(a));
Size round(sqr(10 - Phase) / 8 + 2);
Pen.C010r
O, 0);
Brush.Color Pen. Color
Ellipse(xx - random(Size) - l, yy - random(Size) - l, xx + random(Size), yy + random(Size)); end; end;
Kporqe Toro, nytmca MeH¶eT UBeT, Korna FOTOB oqepeAH0ñ cHapqn. B A0BepmeHHe, HY)ICHO
COeAHHHTb BCe HanucaHHoe BOeAHHO.
Ilpouenypbl PHCOBaHH¶
B npouenype,
pucyrolueñ BCe 110Jue 6051:

06beAVIH¶Tb BCe BMeCTe 06pa60TLIHK Tarwepa.
proced ure OrawB
var i: integer, begin with Forml Imagel
.Canvas do for i := Oto 259 do begin
div 2, i div 2, 255),
LineTo(44Q i); end; for i := 0 to Ba]lCount • 1 do with
Balloons[il do if Explosion 0 then DrawBalloon(x, 260 - y, Color) else if
Explosion 10 then
260 • y, Explosion); if CrunEsplosiort LL
0 then
else if GunExplosion 1 0 then
IDrawExplosion0GunPosilion,
240, GunE.xplosi011L with Forml Imagel .Canvas do begin
Pen. Color := clMaroon; Blush.Color := clRed; if (Vx 0) or
(Vy 0) then
- 2, 260 -
- 2, round(x) + 260
round(y)
+ 3); if (Bomby 1000) Ellipse(GunPosi1ion - 2, 260 -
- 2,
GunPosition 3,
260 - round(BombY) 3); end; end;
procedure T Form I . Timer I Timer(Sender: TOb' eco; begin
MoveAll![]()
CheckCollisions;
DrawBattleField
end;

Pitc. 64.
1 04
Практическая работа 35
«Тест»
Цель работы - создать программу, которая
тестирует учащегося по лнформатике
математике.
Проект должен содержать последовательность форм, реаллзуеощх диалог с тестируемым учащимся .
На (јерм,зй форме оројтсхол•тт регистрация учащегося,
|
|
Регистрация Введите Фамилию Имя Отчество
|
|||||||||||
Ркс. 65
Фрагмелт
программы (№nitl):
![]()
procedure ТРогп11.Butt0I12C.lick(Scndcr: TOhject}•, 1;yegin сое: end,
![]()
heg:in
1 .Editl .Text;
end,
На второй форме лредлагаетея выбрать один 113 тестов.
|
начало теста Уважаемый тестируемый Иванов хотите пройти тест Р
|
||||||||||||||
Рис.![]()
Фрагмент программы (u11it2):
![]()
proced иге TFom2.Butt0I11 СЛ ick(Scndcr: TOhj ect}•,
1;yegin
гопјјз ShowModa1: end,
т 05
procedure T Form2.Button2Click(Sender: TOb'ect); begin
Fann2-Close, end,
procedure TForm2.Button3Click(Sender: TObject); begin
Fonn6.Edit2.![]()
Formb.ShowModalt end,
|
|
||||
|
TECT YcrpcDcrsoBNRCU7â
/A'O.O*KO B ãâDreP
|
P„c. 67.
toporpa
uses Unit4„ Unit2;
*.dfm}
proced ure TForm3.Butt0J11 C.I ick(Scndcr: TObj eco; begin
k:L01
if CFormYEditl . Text=Y M0H1rrop') or' (Form3-Editl . or (Forms
.Editl. Text='MOHVITOP') then if CForm3.E.dit2. or (Form; or then
then k: L kv1 Fonn4.Labe12. Caption: =IntTöStTCkL ifk=0 then
Form4.Label I -Caption-HOue11b moxo' else ifk LL l then
l
.Cap1i01T LL '11aosov else
ifk=2 then Fann4-Label
if k=3 then Form4.Labell xopomo';

procedure TForm3.Button2Click(Sender:
TObject); begin
Fonn3.Close, end,
J la
(l)OPMe
pe3yasrtT
nPOMOTpc 0T1*era.
106
![]()
|
OueHKa 2 Xepewe
|
PHC.
OS![]()
cbparMetiT nporpaMMb1 (unit4): uses Unitlt Unit5, Unit-N Unit2;
![]()
procedure TForm4.Buttort2Click(Sender: TC)bjec1), begin
Form4.Close•, end,
proced ure TForm4.Buttonl Cl
ick(Sender: TObj
begin
Form4.Close;
![]()
procedure TForm4.ßuttort3Click(Sender: TC)bjecO•, begin
Form5.ShowModal; end,
He
c.neaylotneii
11PaBVE1bHb]e OTEœTb1.
|
npaBhJ1bHble OTBeTb1: |
|
1 . MDHI/ITOP 2. KnaavlaTypa
|
PRC. 69.
(artit5): uses Unit4ž Unit3,
Unit2, Unit' ;
tSlQ
*.dfm}
proced ure TForm.S .Butt0111 Cl
ick(Sender: TObj eco; begin
Fon•n4.Close•,
FarmYClose;
Form2 Closel
Form I Close;
107
Ропп5.СЈозе•, end,
Если учащийся лест математикег то ему
знания таблииы умноження. На
следующей форме случайным образом выбкраются чттс.ла.
Учащийся долкеп ввести
зкачетме прогвдеденмя в текстовое поле. С ломощь•о кпопхтт «проверка»
правильность
введенного ответа- Если ответ правильный, то можно сгенеркровать следующий
пример- После нескольких примеров можно проверять свой
рейтинг![]()
|
66 |
||||||
Тест на знание таблицы умножения Сгенерируите числа
8 9 -
|
Рис. 70
Фрагмент ПРОГРЕТММЫ
(vnit6}:
uses Vnit7, 1Jnitl,
![]()
1;yegin
Form6.Labe12 .Caption
F0fIt"6.Edit2.Text — Fom6.Labe16.C.aption:—”; end,
procedure TForm6.Butt0I12C.lick(Scnder: TOhject};
1;yegin if
begin
Fom6.Labe16 Caption![]()
end
else begin
правильное;
end,
ТОЪјес1У* var c:rea],
hegin
Form7.Labe[2.Captj ол 1-Edit1. Тех;
ответили на
нолросовг
11:3, правильно
'+lntToStrtIT1); рейтипг “+1ntToStr(f)•,
if then плохо- else if then Form7.Labe13 , оп: else if с=О.5 then доучкть“ else if (с>О..$} and (с<1ј then else if c z l Сарт{оп -'Молодец!'
Fom7.Show,Modal•, end,
При нажатии на кнопке «Ваш
на
следуј0(дтей форме (ЈО;ВЛЯ€ГС.Я результаты
рентенга. Тестированне
можно заверимть-
|
Рейтинг!!! |
|
|
Иванов Вы ответили на 5 вопросов. из них правильно 5 Ваш рейтинг = 5 Молодец!
|
Рис. 71![]()
Фрагмент программы (vnit7): ![]()
uses
Unit6•,
![]()
![]()
heg:in
Form7.Close,
end,
Обратите длимапгке ла подключелие модулей в строке Uses. 'Гаккм образом, проясхощгг обращение к соотвсгствуюилсЙ форме. Для отображення формы используется функция funciipn $hpwMQda[; [nteger;
Данная функция лозволяет показывать форму в работе режима дуалога.
Практическая работа № 36
«Проигрыватель»
Цель работы - создать программу •
проигрыватель файлов мультммедиа, снабженный системой визуализацик. для начала
многоокотмость будет реалвоваиа посредством стандартных диалогов Проигрыватель
файлов мультлмедуа, пролгрывающий рамнтчные форматы, а также сопровождающиЙ
музыкальные файлы визуализацкей.
1. Создать на диске па: ку (например
в
которой будет создан
проект, скопировать в эту лапку несколько
музыкальных файлов клипов Для демолстрацли полноце•шой раооты проигрывателя
попадобятся мультимедкйвые файлы 1јјр3. которые МОЖНО найти Н папках.
Влдеофайлы:
![]()
Аудуофайлы:

2.
простейшую программу
проигрывания аудиофайлон (см- ттрак•птческая
работа№ 10). Для этого
поместить на форму кнопку, медиапрокгрыватель, дли:юг загрузки.
З. Настроить фкльтр
дналога на файлы мультлмедка, соответственно заполнив таблицу„ У братн ненужные
нам кно1!ки ОТКЛЮЧИВ их н Инспекторе Объек-л_-зв (VisibleButtons). В
обработчике нажатия на кнопку оплсать загрузку файла.

Рт,с. 73.
0penDiaIog дналог загрузктт
Основное СВОЙсТВО — FileN*Ijje: ОСНОнНОЙ
мел_-зд —
При вызове
программы метода
Executc происходит вывод на экран дна:тога. Параметры вывода определяются
свойствами компонента: Title, 0ptionse и др. Если пользователь выберет файл для
открытия нажмет - Открыть“, то в свойство FileName компокеита будет заттсаво
имя этого файла в формате S(Ti1jgv а результатом метода будет значение Иначег
если пользов-атель нажмет в диалоге кнопку ”Отмена”, результат E.xecute будет
fa]se, т.е. Execute является булевой фулхцкей.
Medi*Playet— медлапроигрьгаатель![]()
Основное свойство — FileName: sting,
основные методы — Нау, Раи. Мор. После того как н СВОЙстВО
помещено
имя файла
этот файл нужно открыть с помощью метода
Ореп (если установлено свойство АитоОрспе то открытле проксходкт автоматически,
по это не всегда хорошо, лоскольку, если FileName не задало или задано неверною
при автоогкрнп•итт тлротвойдег 01![]()
Когда файл открыт, он может быть
вослроизведен. Это можно сделать с помощью кнопок стого компонелпа, либо
метод
Play. То же касается остановки паузы
методов Stop Pausc. Для настроЙки внешнего
вида компонента используется множество свойств, к гркмеру можно скрыть часть
КНОПОК, настраивая свойство VjsibleBvttons.
4.
В обработчике нажатия на 13(I1T01jl вызын„аегся метод диалога
если
он выдает результат trve (пользователь выбрал файл нажал ”Открьть-ј. то
медкапролгрывателаэ передается имя этого файла файл открывается Телерь
пользователь может воспроизвести нажав кноПки проигрывателя.
![]()
procetf nre
.Buttonl Click(Sender- “ГОЬј
hegin if 0penDia[og 1 -Execute then begin
MediaPlaycrl .Fi[eName :=
0penDialogl.FilcNa'11c;
,MediaP1ayerl .Ореп; end,
5.
При запуске
(јолн.зонатель ВиДиТ проигрыватель.
Проигрывктель не ЯМЯеТСЯ актлвным, поскольку файл, который он должен
воспроизводит»
не открыт![]()
![]()
|
form1
|
- о х |
|
|
|||
|
Тип Ф.вйлов: |
Все Файлы мультимедиа |
|
||||
|
|
Все фВЙПЫ мультимедив
MlDl Ф.зйл “.mid |
|
||||
|
23: 1 М |
МРЗ Ф.зйл (Х.трЗј Видео Ф.зйл lX.avi |
|
||||
Рис. 74.
Пря нажатия на кнопку актлвтвируется
диалог. Параметры диалога соответствуют значевткям свойств, задалвых
предварительло в Инспекторе Объектов. К лримеру, выбранныЙ флльтр звуковых
файлов скрывает все файлы с отлячаюи.щмся расширением.![]()
После выбора в музыкальной папке файла
при нажатии ХНОЛКИ ”Открыть” происрынатель стал доступным. Файл
МОЖНО
воспроизвести ело.
Если необхощтмо воспроизвести вкдсофай:т.то при запуске автоматически будет создало отдельлое охло, в котором отобразится твображетме.
б. Проигрыватель. (“OI“OB. Необходимо ОФОРМИТЬ.
интерфейс.
Поместнте на форму панель, а на ней раслоложтте компонент lmage, растянутый на
всю палелы Добавьте таймер. Сохралите модуль как MainV11it и проект как
МуМР1ауег в приготовленную папку![]()
Дайте каждому компоненту
подходящее Обработчик кнопки
помепяйте согласно
изменениям добанюе растяжение видеоэкрана
Для “(“ОЈХ“'
видеофайлы воспротвводилттсь не в
отдельном окне, а в заданном месте, например, на Pane11, необходткмо
соответствуощкм образом усталодить свойство медиалронгрывателя Display. Дл;
того чтобы установкть растянуть нужным образом язображенме, нужно установять свойство
Di sp[ayRect.
MPlayet nisplayRec1 О, где Rcct(xl, yle у2: — функщт;, преобразующая четыре числа к формату 41“Rect— прямоугольник, а свойство DisplayRect имеет кметмо:зтот формат.
чтобы переименовать компоненты
сВОЙСТВО
Najj'te. ! Таслтойте параметры компонентов![]()
TmainF0fIt1
Cap(ion • Мультимедиа-т(роијфыватель![]()
C[ientWidth 402 CtientHeigth = 290
2) LifeTimer: Ttimer
Enabled fa]se
• lf)0
Э)
Mct1iaOpcnD[g:![]()
()ptions: otTileExist tme
• Загрузить файл мультимедиа '
LifeImage: Tlmage
Align = alClient
5) Sc«oanel: TPancl
Alig11 = а[Тор
Caplion •![]()
Width![]()
Heigth 252
МемјаОрепВ1п![]()
Captoin = 'Отхрыть'
7) МР[ауег: “I“MediePtayer
Display![]()
VjsihleButtons [btPlay, btPause, btStopl
7. Необходимо создать единую форму для
воспроизведения звуковых и видеофайлов. Причем воспроизведение звуковых файлов
тоже будет сопровождаться анимацией. В качестве этого сопровождения
используется игра ”Жизнь”![]()
Для этого добавим соответствующий ”рассчитывающий” и ”рисующий” код.
Опишем константы, определяющие размер поля, введем новый тип — массив клеток и объявим глобальную переменную этого типа. const
XSize = 40![]()
YSize = 25, type
TLifeCells = array [0 .. XSize - YSize
- 1] ofboolean
var
MainForm: TMainForm![]()
А: TLifeCells![]()
Создадим процедуру, случайным образом заполняющую массив.
procedure RandomCells• var i, .ј : integer; begin for i := 0 to XSize - 1 (10
forj О YSize - do
random < 0.5• end;
Это процедура случайного заполнения поля.
Булева переменная присваивается логически, а не с помощью условного оператора
if random < 0.5 then A[I,j] := true else A[i.j]
false.
Создадим функцию, определяющую число
живых клеток-соседей у данной клетки. function NumOfCells(x, у: integer):
integer; var i, .ј , хх, уу: integer; begin Result
for i -1 to 1 do
• -1 to 1 do begin
![]()
ifxx
-1 then хх := XSize -
1; ifyy
-1 then уу := YSize
ifxx
XSize
then хх := О ifyy
YSize then уу := 0; if А[хх, уу] then
inc(Result); end; if А[х, у] then dec(Result); end;
Это функция подсчета живых соседей. Обратите внимание на переменные хх и уу. Подобным образом реализуется ”сшивка” верхнего и нижнего, левого и правого краев. В конце исключается сама клетка из числа соседей: if А[х, у] then dec(Result); Создадим процедуру, рисующую поле клеток. procedure DrawCells• var i, ј: integer;
1 13
begin with MainForm.LifeImage.Canvas do begin
Brush.Color clBlue![]()
Pen.Color := Brush.Color![]()
Rectangle(O, О, XSize * 10, YSize *
10); Brush.Color := clRed, for i := 0 to XSize - 1 do forj 0 to YSize - do if
A[i, ј] then Rectangle(i
end; end;
Опишем обработчик таймера; каждый такт у нас будет происходить перерасчет живых клеток по правилам игры.
procedure TMainForm.LifeTimerTimer(Sender: TObject); var i, ј:
integer; В: TLifeCells
begin for i := 0 to XSize - 1 (10 forj О
YSIze - do case NumOfCells(i, .ј) of
З: true, else B[i, Ј] false
end;
DrawCells• end;
Каждый такт таймера пересчитываются живые
клетки. Алгоритм игры, как известно, состоит в следующем. Если у живой клетки
два или три соседа, то она остается живой, если меньше двух, — погибает от
одиночества, если больше трех, — гибнет от тесноты. Рождается клетка, если у
нее ровно три соседа. С помощью оператора case реализуются правила.
Использование локального массива В необходимо. Если записывать сразу в А, то
клетки нового поколения будут также считаться при учете соседей, что
недопустимо: каждому
свое. В конце, однако, нужно скопировать
новое поколение, содержащееся в В в массив А
Простые массивы можно
копировать присвоением: А В.
Модифицируется обработчик нажатия кнопки под новые задачи. Проанализируйте расширение загружаемого файла, и, если загружен видеофайл, Image становится невидимым, освобождая экран для ролика, в противном случае, наоборот, выводится картинку, на которой идет игра, заполняется поле клеток и запускается таймер. procedure TMainForm.MediaOpenBtnClick(Sender: TObject); begin if MediaOpenDlg.Execute then begin
MPlayer FileName MediaOpenDlg FileName•![]()
MPlayer.Open;
MPlayer DisplayRect Rect(O, О, ScreenPanel
Width, ScreenPanel Height);
MPlayer Play;
Т ExtractFileExt(MPlayer FileName) - avi' then LifeImage.Visible := false else begin
Lifelmage. Visible := true;
1 14
RandomC.c]ls;
1-ifeTimef.Emabled := true; cntl; end; end;
Экран вывода - растягмваегся” на всю панель. Добавлен автоматлческий запуск воспроизведения. В зависимости от расширения воспроизвод•тмого файла. Lifelmage, на ко:ором происходит - Жизнь“. либо зрячегс.я (в случае v .a№i'), либо выводится (н других случаях).

Рис. 76.
8. Необходимо предоставить пользователю возможность настройки
лне:он. Па форму добавляем три компонента — два диалога выбора цвета
FieldColorDlg:
(Color =
c1Navy), CetlColorDlg:
“fC010fOialog (Со]ог clYe110w) одну кнопку SetC010fBtn: TButton (Cap1i01j
Цвета).
В обработчике нажатия на эту кнопку нужно описать вызов
диалогов.![]()
|
|
Мультикедиа проигрыватель |
|
||||
|
|
||||||
|
Пткрьггь |
Цвета |
|
|
|
|
|
Рис. 77-
(ОСНОННОе СВОЙСТВО Со|ос• ТСС'ЈОТ.
основной —
выбора цвета. Если
пользователь выбрал цвет и нажал ”ОК-, результат этого метода — trve, если
пользователь пахал - Отмена“, то результат fatse. procedure
TObject);
1;yegin if
О) • (Ijj•N0
if
MainF01T.FieldColorDlg.Execute then ЫгеепРапе[.Со1ог :=
MainF0T1-FicldColorDlg-C.olor;
томелмте цвет
клеток“, mtlnformation. (плЬОК] О);
DrawCells; end;
MessageDIg(const Msg: sting; 01gType:
TMsgDlgType; Buttons: TMsgOlgButtons; HelpCtx: Longint): „ вызов окна
сообщения- Это служебное окноMsg — текст сообщения .
![]()
01gType — тил диалога.
Возможные значенкя: mtWaming, mtError, mtlnformation,
1TtTC01jfvTITta(ion.
1TtTCustonj.
Buttons — используемые кнопки. Переменна; тяпа - множество”,
возможные элементы: It"5Ves, mbNo, mbCancel, It"bAbort,
mbRetIY, It"b1gnore, m5A[l, mnNoToA11,
mbJIe(p.
HelpCtx — индекс контекстной слраекгг В
ДЕННОМ лримере индекс равен нулю. При
палиса•лтм проектов с развернутой
справочной скстемой указывается реальный индекс.![]()
MessagcDlg возвращает члсло, равное одной
из следующих констант: тпгнопе,
mrAbort, mrYes, ТОК, лтгКе1гу, mrNo,
mrCancel, mrlgnore, лтгАЛ Эти константы — так называемый
результат
((Ij0(ial 1•esulO нажатия на
кнопку диалога.
В далмой программе проверяется, равен ли модальный результат
mrNo, т.е. ваката ля кнопка “ Неј“”•» если нажатаг то нызываевся и
(ЈIЈ0(фамма немедленно ВЫХОДИТ (в текущей
процедуры•обработчкка.
Фулхи.нл MessageDlg Execute 0e1phi позволяет дьиывать как
процедуры:![]()
MediaOpc1jI)lg.Execute вместо ifMediaOpenDlg F.xecute then![]()
При этом невозможно лрокоњтролкровать,
кате кнопки быля нажаты: ”ОК” МЛМ
”Отмена"![]()
Далее необходимо откорректировать процедуру рисования, затем
запустят» программу, загрузить музыкальлый файл
настройте цвета.
Накокец, необходимо ислользоватн цне•а ДИЗЈТОЈХ“'Н рисовании.
Внесите изменения в DrawCeIls•![]()
»vith
00 heg:in
Bmsh.Color := MainForm.Fie1dC010rD1g,C010r;
Реп .Со1ог Bmsh.Color,
Rectangle(O, О, XSize * 10, YSize * 10);
I3njsh.Color CellCoIorDlg.Colo,•;
Bmsh.Color• := MainForm.C.eIlColovDlg.C.olor;
|
|
|
|||||||||||||||||||||
Рис. 78.

Ряс. 79![]()
9. На данный момент форма может оьпь
масштабирована во время работы приложения- Для того чтобы з-афкксировать размер
формы, необходимо установлть соогвегс•гвуяоикее СНОЙСТНО
Кроме
нужно запретить. разворачттн,анле формы на весь экран (это также нежелательно).
Перечислим остов] ме свойства события формы-
![]()
BorderIeons: TBorderlcons иконк••
заглавной панели формы, тяг своиства
множество, возможные элементы:
5i„SystemMenv, biMi11imize,
biHetp (д данлом
случае нужно отключить
hi,MaxiI11izee чтобы форму нельзя было развернуть).
BorderStyle: TBorderStyle — сткль бордюра
bsDialog, bsSi11!le, bsNone, bsSizeahle, ![]()
Если
установить bsN01'(e. •лО форма будет без заглавной
панели, а значкт и без
кнопки закрыткя программы. Следовательнр, выходить из программы возможно лкбо с
помощью Alt-F4, либо предусмотреть дололшттельку•јо ктогху с методом C10se![]()
ClientWidth, ClientHeigth: i11teger — ширина высота клиентской области формы.
FormSty1e-
сткль формы. Наиболее является
![]()
Если
установлено это значение. то форма будет находиться над остальными
формами,
даже если она не активна, и лересекается с актмвной на данный момент формои.
1'osition- “I“Positi011 располок•еште
формы. Здесь зада•отс• рщлкчтпые начальлые положен“ формьге напримере задать
положение го центру экрана (ре*сгеепСетегГ Пря запуске программы она окажется в
центре.
состояние окна.
Возможные значения
wsMini[13iud, wsMaxi[13izcd. С помощью
этого свойства МОЖНО разворачивать сворачивать форму
![]()
ОпА«ћг ащ 0nDesactivatefSe:11der: ТОЬјес1) — событкя, возникающие, когда форма активкруется дезактив«руется (при этом в форму лереходлт илл ее покидает фокус ввода).
0nCloseQwery4Sender TOhject•, var CanC.lose: Воо}еап} — событисе возникающее гчят попытке закрыть форму. Например, некоторая лрограмма спраижвает: -вы хотите завершить
Это — результат
события. Делается
это н обработчике подобным образом: CTClose := MessagcDlg('E.xit поре?!
w.tC0116rwation. [1T1bYes 1T1bNoJe О)
ItwVes.
О (ЕСТСЯ (е,
ТОЪјес1}
необходимое
для описания
действий, требуемых в начале или в конце
работы приложения (открытке з-акрытке файлов,
чтелие сохранелие
настроек, ијштцткализадия переметил тп.у![]()
01tHide, 0nShow(Scndcr TObjectJ —
вызываются, когда форма становится видимой
ИЛИ невидимой (пр“
присвоенигт соответствующего значения свойства VisibleJ.
ТОЬјес(ј —
происходит. когда форма
или сжимается.
Здесь описывают
изменение размеров и расположение компонентов на форме.
10. продолжттгь оформлелие
медиалроигрывателя.
1) Для “(“0П_Ђ чтобы случайное заполнение
было более случайнымг событии формы 011Create добавить Randomize-
TObject)l hegin
![]()
RandomCclls; end;
2)
Также желательно зациклить воспро•введенме медкафайла, описать
обработчик события медкагроигрывателя 0nNotify. У MediaPlayef есть два свойства
Position: Longlnt
Length: 1.-,0I1g111t Это, соответственное
текуг.ллы; позиция в запися и длина записи. Событие проигрывателя 011Notify
возникает пр•т завершении разлкчных управляющих методов MetliaPlayej•.
Сосл_-зянтте проигрывателя можно узнать (в снойстна (Мсме![]()
Когда залусь будет доигрываться до КОНЕВ, будет вызываться метод Play, залускапзщий ее с начала. При остановке проткгрывателя «перематываем» запись па лачало.
Lejjg11'( 1jjejj Нау![]()
procetfnre
1'MainForm.MPtayerNotify(Sender: TObject); begin with МР1ауег do ease Mode of
mpP[aying: ifPositjon Length then Р[ау;
1j'(pSTopped:
end;
end;
3)
Установить название
выбрать ему иконку. В главном открыть
Ргојест 0ptions- На вкладке Applicati01j. задать название приложения (это
название,
частностк, будет отображаться слизу ла
папелл задач \Vindows), а также загрузить
иконку Стандартную
иконку можно найти н панке![]()
Files\Bodand Sharedilmages\lcons, создать свою иконку — в
редакторе Delphi (меню Tools ![]()
1та е•е Editor) или в лобогл
другом редакторе ресурсов.


Рис. 81![]()
Проанализируем
недостаткк: не выводится название проигрываемого файла,
комлолентът ла форме
не очель„то гармонируют друг с другом, неизвестло, сколько пролетов записи
(ЈIЈ0}тсрано на данный момент. нельзя устанавливать скоростн визуалвацил, нет
ВОЗМОЖНОСТ редакткров-ания сохраненля пом•цмй гтгры ” Жизнь
Создайте
копна» проекта. Добавить в проект нову•о форму для упраштетптя воспроизведением
меднафайла. Дл; создания новой формы щелкнлте на кнопку меню. Есть возможность
сделать это и в пункте меню File => New... Там же можно создать форму с
![]()
Добавьте на форму пять Speet1Bvtt01j* 'ТгасКВаг таймер.
|
ноет1 |
|
|
Рис. $2.
Кнопка SpeedButton отлкчаетс• от обычной
КНОПЕ“, во-первых, тем, что может содержать картинку. а во-вторых» что
мо>к€г кх-тавгтгъся нажатой![]()
|
медиафайл не загружен |
||
|
|
|
|
РКЦ. 83.
Основные свойства — Glyph:TPicturc
(КЕТРТ}'НКа•,
основное событие — 0nOick. У этой хнолки
есть еще несколько важных свойств. Для того чтобы кнопка мосла быть нажата, ее
СВОЙСТВО Gt'(njp• in1eger ДОЛЖНО быть больше нуля. в Этом случае все кнопки С
одинаковым значением группы становятся переключателями — если нажать одку,
остальлые отщелкнвајотся. Это может быть лекелательно в случае одной КНО(ЈКИ с
ненулевой срутијой — ОДиН раз ее нельзя
В этом случае
свойство
AlIowAllUp: boolean. Современный енд
придает свойство Flat: boolean.![]()
В лрограмме откажемся от стандартмого
тмтерфейса MediaI'1ayer, и, сделав его невидимым, будем обращаться к нему через
созданные кнопки. Коляски; иконок щи кнопок находится в папке
Files\Borla11d
Настройка TrackBar проводится с помощью свойств ThumbLength:
integer (длина бегунка), TickMarks: TTickMark (положение рисок линейки),
TickStyle: TTickStyle (стиль рисок)![]()
Настройте форму и компоненты. Измените имена компонент.
1) ControlForm: TControlForm Caption = ' медиафайл не загружен'
BorderStyle = bsToolWindow
ClientHeight = 24
ClientWidth = 402 2) NewSpBtn: TSpeedButton
AllowAllUp = true
Flat = true
Glyph: rety.bmp
GroupIndex![]()
3) PosTrk: ТТгасКВаг
ThumbLength 15
TickMarks = tmBoth
TickStyle = lsNone 4) PosTimer = TTimer
Enabled = false Interval = 500
5) MediaOpenSpBtn: TSpeedButton
Flat = true
Glyph: MdOpen.bmp 6) PlaySpBtn: TSpeedButton
AllowAllUp = true
Flat = true
Glyph: vcrplay.bmp
GroupIndex = 1
7) PlaySpBtn: TSpeedButton
AllowAllUp = true
Flat = true
Glyph: vcrpause.bmp
GroupIndex = 1
8) StopSpBtn: TSpeedButton
AllowAllUp = true
Flat true
Glyph: vcrstop.bmp
GroupIndex![]()
12. Когда требуется обратиться к каким-то
переменным, функциям, типам, объектам, описанным в другом модуле, необходимо
описать ссылку на этот модуль в разделе uses. Однако тонкость состоит в том,
что uses может располагаться и в разделе interface, и в разделе implementation.
При запуске приложения новое окно должно находиться под главным окном. Но если
описать ссылки двух модулей друг на друга в разделах interface
возникнет
так называемая ошибка круговой ссылки. В рамках Pascal два модуля не могут
использовать интерфейс друг друга. Ссылка в интерфейсе нужна для того, чтобы
при описании типов, классов, переменных интерфейса использовать типы и
константы
описанные в других модулях. В данном
интерфейсе используется, к примеру, класс TForm, TSpeedButton, TTrackBar,
TTimer, описанные, соответственно, в модулях Forms, Buttons
ComCtrls,
ExtCtrls. То есть использование других модулей в интерфейсе дает возможность,
прежде всего, описать новые типы с помощью уже описанных типов. Именно поэтому
120
запрещена круговая ссылка. Тогда потенциально возможно было
бы олусать: ТуреА
апауГО..4] Турен в одном модуле ТуреВ
апау [О-.99]
в другом. То есть рег — неизвестное
через еще более
(лат.).
Что же касается использования не ткпов, но
конкретных леременны.х объектов,
фигурирующих в другкх формах, то это
тсго:тьзовалие происходит хак раз д iIttpleIttentati011. и тут круговые ссылки
вполне допустимы. При работе с нескольким“ формами важно также учгттывать
порядок к.х создан•л. Это касается обработки событий ОлСгете — обращаться можно
ТОЛЬКО к созданным формам![]()
Vnt Contt'01F01Tt: TC01jtt01F0ttj, i•npjementation
*.DFM}
procednre TC0fttt01Fom.ForttjCreate („Setjder• ТоЪјесЏ•, begin
Тор := MajnForm-Top + MajnForm-Height + 4;
1.„eft :=
\1ai11Form.Left•, end;![]()
Свои свойства 1-eti Тор вторая форма
лодстраи€ке•г под те ке свойства первой формы. При попытке запуска программы„
однако. выводится сообтенје о том, что не указан
модуль, в котором
описана первая форма-

Если нажать кнопку Ves, то в раздел uses автоматл•ческл• добавятся ссылка на нужный модуль. Одлако, система ле всегда автоматически работает Лучше добавлять ссылки самостоятельно. В данном случае — в раздел implementati011. implementation
Здесь лдет обращение х MajnForm, даллдя
форма должна быть к этому моменту (то есть моменту создания
уже
созданной![]()
По умолчанттю пр•т создании пркложенгл полагается, чтобы при запуске выводилась только главлая формг Одлако в данном случае д лрограмме дольют быть обе формы. Обязательно, у C011tT01F0'111 установить свойство Visib[e := tme- Иначе форма будег не видна при залуске программы.
|
Муяьтимедиа проигрыватель |
|||||
|
|
|||||
|
Открыть |
|
|
|
|
|

Можно описать тот ке код, с точлостыо до
перемены ссылок, д обработчкхе
()ljCrea1e главной формы. Для того чтобы
выбрать нужный модулнг нажмите на кнопку ланели кнструментов (выбрать модуль
лая редактированля). Соседняя кнопка служит для выбора форм (выбрать форму для
редактировавкя). Следующая ктогка переклочатель
![]()

Рис. 86.
Первая форма создается раньше второй.
Следовательно, и событие 0nCreate у нее дозиккает еще до того, хак создана
вторая форма, значит попытка доступа вей (попытка установить ее положенлеј
вьг40вет ошлбку![]()
ТЗ. Оставим главной форме только (Предназначение экрана.
Удалите код внутри
обработчиков кнопок. а также сами кнопкј'
procedure
“I“Mai11Form.MediaOpenBtnClick („Sender : TObJect); hegin
CT'td; procedure TMai1jF0T1.SetCol0TBtnC[ick (S"11der • TObject);
1;yegin
Усј}щно$'јте
fajse. переместите
его понерх панели. Если панель в форму добавлена ломке проигрывателя, то
проигрыватель окажется под палель•о. 1“1сптому предварительно поменяйте порядок
щелкаттте правой хлопкой мыши ка пролгрыватель выберите ”Bring То Front”![]()
|
рев те.“
|
|
|
|
Рис. $7.
Телерь темените клиентскую высоту формы. Экран (ОЈ“Он.
|
|
|||||||
|
|
|
|
|
|
|
3.1 |
|
|
|
|||||||
|
|
|||||||
|
|
|||||||
Рис. 8$![]()
Теперь предстоит описать обработчик“
компопеитов второй формы. Таймер будет
передвигать бегунок, отображая процент
проигранноЙ залуси.
![]()
heg:in
PosTfkBar.Positjon :=
MainForm.MPlayer.Positiow, end;
procedure TContr01Form.PosTfkBarChange(Sender: ТС)Ь'
hegin
if not PosTimer.Enahled then![]()
MainF01T MPlayeT.Posi1i01j
end;
В обработчике кнопки загрузки
на
тот» что уже![]()
Код относится х компонентам главной формы. Из-за этого необходимо указывать вторую форму, когда обращаются к ее компонетгтам, хотя так находятсяся д обработчике «горой формы.
Обратите вниман•те на два таймера — один
запускает вкзуализацмю, а другой денгает бегунок Передвижения бегунка
только
когда воспроизведение остановлено — PosTj
:= falsc. Иначе
происходут конфликт — таймер меняет ПОЗиЦИЮ бегунка, а бегунок в ответ меняет
позицию проигрывателя. Если необходимо менять позицию во время воспроизведения,
придется вводить дополнительные проверки.
Когда запись остановлена, можно поменять ее позицию тем же бегунком. Кнопки управления программно запускают и останавливают проигрыватель. Пока файл не загружен, их следует отключить, иначе при нажатии на них произойдет ошибка. Последняя кнопка определит, проигрывать ли запись в цикле.
procedure TControlForm.PlaySpBtnClick(Sender: TObject); begin
MainForm.MPlayer.Play;
PosTimer.Enabled := true; end;
procedure TControlForm.PauseSpBtnClick(Sender: TObject); begin
MainForm.MPlayer.Pause;
PosTimer.Enabled := false
end;
procedure TControlForm.StopSpBtnClick(Sender: TObject); begin
MainForm MPlayer. Stop;
PosTimer.Enabled := false
end;
Запуская и останавливая проигрыватель, мы запускаем и останавливаем таймер. Необходимо внести изменения в код в моДуле MainUnit, событие 0nNotify проигрывателя.
procedure TMainForm.MPlayerNotify(Sender: ТОЬј ect); begin if ControlForm.RewSpBtn.Down then with MPlayer do if NotifyValue = nvSuccessful then begin
Notify true![]()
Тау, end; end;
Здесь происходит проверка, зажата ли
кнопка ”цикличного воспроизведения“ во второй форме. При открытии файла
необходимо включить все кнопки и бегунок (изначально Enabled false), запустить
таймеры, настроить PosTrkBar на длину записи и вывести
название
воспроизводимого файла в Caption формы:
procedure TControlForm.MediaOpenSpBtnClick(Sender: TObject); begin with MainForm do
Т MediaOpenDlg.Execute then begin
MPlayer FileName MediaOpenDlg FileName•![]()
MPlayer.Open;
MPlayer.Display := ScreenPanel•
1 24
MPlayer.DisplayRect := Rect(0, 0, ScreenPanel.Width, ScreenPanel.Hcig11t); MPlayer.Play;
Life1mageVisible not (Exttac1FileEs1(.MPlayerFi1eName) •![]()
LifeTimer.Enzbled := true;
ControlForm.PosTimer.Enabled := u•ue;
ControlForm.PosTrkBar.Max := MPlayer.I..engttu
ControlForm.PosTrkBar.EJ1zbled := true;
CorttrolForm
PlaySp13trt.Enabled![]()
ControlForm.PauseSpBtJ1.Enabled := true;
ControlForm.StopSpBtn.Embled![]()
ControlForm.Caplion MediaOpertI)lg.Filename} end; end;

H3MeH'1Te naparae-rpb] KOMnot•aeHT:
LifeSavel)lg: TSaveDialog
lifLifeOpenDlg: LTOpenOialog DefaultExt
rillet •![]()
Opti ans .offii] eMustExist true
Title
T.oxpa111dTb ![]()

PHc. 89.
cKpb1aa]0LLlte
![]()
procedure TControlForm.MediaOpenSpBtnClick(Scndcr: TObjec0;
begin
willi MainFonn do
if
MediaOpeJIDlg.Execute then
begin
MPlayer.FileName := MediaOpenDlg.FileName;
MPlayer.C)penJ
MPlzyer-Display := Screenl'anel,
MPlayer.DisplayRect := Rect(0, 01 ScreenPanel.Width, ScreenPanel.Heig11t); MPlayer.Play;
Lifelmage-Visible
:= not '-avi)•,
LifeForm EditSpBtn.D0&VT1 := falses
LifeTimer.Embled := true;
CorttT01Form.PosTimer Enabled : LLL ![]()
ControlForm.PosTrkBar.Max := MPlayer.Length;
ControlForm.PosTrkBar.lThabled![]()
ControlForJ11 .PI ay SpBtJ1. Enabled := tm e;
ControlForm.PauseSpBtn-Enabled := true;
ControlForm.StopSpIJtjvEjulbled LL true,
ControlForm.Caption := MediaOpenDlg.Filename; end;
Ha
LifeForm
pacnoaarmorreq LifeOpenBtn, LifeSaveBtn,
FillBü1.
ClearBtJ1, SetC.olorBtn. EditSpBtJ1, SpeedTrkBar
HacTPOÏr•re![]()
LifeForm: TLifeForm
BorderS1yle LL bsToolWind0'0"
Caption![]()
ClientWidth 402
Clienllleighl L 56
EditSpBtn: T SpeedBUtton
AllowAlllJp = true
Caption LL 'penaF1'1tpogaTb'
Grouplndex = I
SpeedTrkBar:TTrackBar
Frequency 50
![]()
Position 100
ThumbLen•th 15![]()
TickMarks![]()

B oöpaö0Ti1"Ke sarpygh'li Mealdacþarma
Ileoóx0AHM0 noóa0HTb cneaylouaue e-rp0K1i.
LifeForm.Visible LifelmgYVisible;
Ec.ll'l Lifelmg T-e. HY*Ha 3By«oaoro •:þzïrna, TO moya.'lloauueii *e Lifelmg cnpwretii TO cþoPMb' ynpaW1eHJ1fl BW3ya:1H3auvreñ
LifeForm.EditSpBtn.Down, false;
![]()
ITOCKOJ1bKY 3Aecb, npn OTKPb1THH, Mbl BKJ1kOqaeM 3TOT TañMep, TO pe)KHM peAaKTnp0BaHH¶ AOJ1)KeH 6b1Tb OTKJ1kOqeH H KHOr1Ka 0THY1-ueHa.
MPlayer.Play•,
Lifelmg. Visible := not (ExtractFileExt(MPlayer.FileName) .avi');
LifeForm.Visible := Lifelmage.Visible![]()
LifeForm.EditSpBtn.Down := false;LifeTimer.Enabled := true;
ControlForm.PosTimer.Enabled := true,
15. He06x0AHM0
OllHCaTb 06pa60TLIHKH C06b1THÏ1 HOBb1X KOMHOHeHTOB. OnpeneJIHM
C03naHHH cþopMb1 ee
rueCT0110JIO)KeHHe.
B M0AYJ1e LifeUnit.
var LifeForm: TLifeForm, implementation uses MainUnit, ControlUnit; procedure TLifeForm.FormCreate(Sender: TObject); begin
Top := ControlForm. Top + ControlForm.Height + 4![]()
Left := ControlForm.Left; end;
IIPH HOKaTHH
Ha KHOFIKH OHHCTKH H 3aF10JIHeHH¶ Mbl HC110J1b3yeM npouenypbl, onucaHHb1e B
Monyne rnaBHOñ![]()
B Monyne LifeUnit.
procedure TLifeForm.ClearBtnClick(Sender: TObject); var i, j: integer; begin for i := 0 to XSize - I do
O to YSize - 1 do
Ali, j] false![]()
DrawCells
end;
procedure TLifeForm.FillBtnClick(Sender: TObject); begin
RandomCells•
DrawCells• end;
OAHaKO TOPO, LIT06b1 HOA06Hb1ñ Bb130B 6b1J1 B03MO)1œH, He06x0AHM0 B FJfflBHOM MOAYJ1e 06b¶BHTb npouenypbl B HHTep(þeñce. Id3BHe AOCTYHHO TOJ1bKO TO, 06b¶BJueHO B
HHTep(þeñce. B MainUnit He06XOAHM0 "Bb1BeCTH" B HHTep(þeñc 06b¶BJueHHe npouenyp:
MainForm: TMainForm;
A: TLifeCells• procedure RandomCells• procedure DrawCells• implementation uses ControlUnit;
![]()
'Tarmepat
TeM caM1,1M "'kopoeTb
nepe«.'ffouacr
ocrraHaBJT'taan ![]()
procedure TLifeForm.FillBtnClick(Sender: TObject); begin
RandomCells,
DrawCells; end;
procedure
TLifeForm-SpeedTrkBarChange0Sender: TObject); {MeHRT CKOPOCTb
begin
MainForm.LifeTimer.Interval := SpecdTrkBar.Position; end;
procedure TLifeForm-EditSpBtnClickCSender:
TObject);
begin
Mai nForm .LifeTimer.
Enabled := not EditSpBtJ1. Down, end;
![]()
OJIMouscDown KOMA0'•tewra Lifelmg.![]()
Shift TShiftState; X, Y: Integer}; begin ifLiferorm.Edi1Sp131n
l)own![]()
AIX div 10, Y div 101 := not AIX div 10, Y div 101;
DrawCells;

P„c. 91.
![]()
16. Вначале при загрузке и сохранении картинок и прочих файлов использовались специальные методы объектов, в которые происходила загрузка. Теперь произведем эти операции вручную, пользуясь процедурами работы с типизированными файлами.
Типизированные файлы содержат записи
определенного типа. К примеру, f11e of integer может хранить произвольное
количество переменных integer; f11e of TLifeCells
произвольное
количество переменных типа TLifeCells. Однако для наших целей достаточно только
одной записи. При работе с типизированными файлами используются следующие
процедуры.
AssignFile(var Р, FileName: string) — связывает файловую переменную F с текстовым именем файла. Это действие необходимо сделать перед всеми последующими операциями.
Reset(F) открывает существующий файл, связанный с переменной F, и устанавливает позицию чтения-записи в начало.
Rewrite(F) — создает файл, соответствующий файловой переменной F.
Read(F, У) — читает из файла, связанного с F, данные в
типизированную переменную У. Позиция файла увеличивается на один файловый
компонент, байтовый размер которого равен размеру типа переменной (для integer
это 4 байта)![]()
Write(F, У) — записывает в файл, связанный с F, типизированную переменную V. Позиция файла увеличивается на один файловый компонент.
Seek(F, ТЫ: LongInt) — перемещает позицию файла к номеру ТЫ, начальная позиция при ТЧ = 0. CloseFile(var F) — закрывает файл F.
В главном модуле описан тип TFileCells:
{Private declaration} public
{Public declaration} end;
const
XSize = 40
YSize = 25
type
TFileCells = array [0 XSize YSize
1] of boolean
var
MainForm• TMainForm![]()
А: TFileCells![]()
В обработчике 0nClick кнопки LifeOpen
определяем файл такого же типа. Если файл выбран в диалоге, ассоциируем имя
файла с переменной, устанавливаем позицию для чтения
в начало и считываем
из файла данные в переменную А, описанную в MainUnit и хранящую положения
клеток.
procedure TLifeForm.LifeOpenBtnClick(Sender: TObject); var
file
TLifeCells
begin if LifeOpenDlg.Execute then
Т FileExists(LifeOpenDlg FileName) then begin
AssignFile(F, LifeOpenDlg FileName);
Reset(F);
Read(F, А);
CloseFile(F)•,
DrawCells
end; end;
Подобное чтение корректно, поскольку типы файла и переменной А совпадают.
При записи в файл ситуация похожая, только вдобавок проводится проверка, существует ли файл. Если нет, то он создается; если да, то должны спросить, действительно ли пользователь хочет его перезаписать. Если он просто ошибся, то закрываем файл и выходим из обработчика; если нужно переписать, открываем его и устанавливаем позицию записи в начало. Затем производится запись переменной и закрытие файла.
procedure TLifeForm.LifeSaveBtnClick(Sender: TObject); var
1ile 0f TLifeCells
begin
if LifeSaveDlg.Execute then begin
AssignFile(F, LifeSaveDlg.FileName); if not FileExists(LifeSaveDlg.FileName) then
Rewrite(F) else if MessageDlg('11epe3arwcaTb?' mtWarning, [mbYes, mbNo], 0) mrYes then
Reset(F) else begin CloseFile(F)•, exit; end;
Write(F, А);
CloseFile(F)•, end; end;
Работа с нетипизированными файлами похожа
на работу с типизированными. Отличия в том, что объявляются такие файлы просто
var F: f11e; (без of .. .), при открытии
Reset(F, 1) — нужно
указать размер блока записи (который по умолчанию равен 128), чтение и запись
происходят с помощью процедур BlockRead, BlockWirite(var F: File; var ВИГ Count
Integer),
где Buf — переменная, в которую (или из которой) идет запись, Count — число
блоков записи (размер блока был определен в Reset). Если надо писать
произвольные данные (к примеру, а: integer; Ь: boolean; с: TLifeCells; d:
string[20]), сделайте следующее.
При записи:
Rewrite(F, 1);
BlockWrite(F, а, SizeOf(a));
BlockWrite(F, Ь, SizeOf(b)); BlockWrite(F, с, SizeOf(c)); BlockWrite(F, d, SizeOf(d));
CloseFile(F);
При чтении, соответственно:
Reset(F, 1);
BlockRead(F, а, SizeOf(a));
BlockRead(F, Ь,
SizeOf(b));
BlockRead(F, с, SizeOf(c));
BlockRead(F, SizcOf(d));
C10seFile(F)•,
17- Чтобы решить проблему цвета,
необходимо сделать спецнальное собственное диалоговое окто, позволяющее выбрать
цвер Ральше мы
стандартлые диалоги.
Диалог — это обычна; форма, которая.
однако, вызывается специальным методом Show,Moda] и возвращает модальный
результат. Модальный вызов пркводит к тому, что при
выведенном нельзя
переключ(.ттьс.я нз к ОдНОЙ другой форме ггрттло-А-ентгя. пока не будет нажата
одна из модальных кнопок диалога, после чего диалог закроется и управленке
дертегея д приложелие. Модальтљлм кнопкам люке пе ладо описывать обработчики.
Просто
![]()
Создайте новую форму, сохраните модуль как Co[orUnit Добавьте на нее две фигуры Shape (CeltShape: TShape, FietdShape TShape), ккогху «Утвердить» (ModatResult ттмС)К), кнопку «Отмена» (ModalResult тпгСапсет•.

Р„с. 92.
Настройте форму В частности. задайј“е ее
позицию и определите
результат кнопок.
C010rForm• TCot0fForm
= bsToolWindoiw
Caption выберите цвета
![]()
В обработчике нажаткя па фигуры Shape
опкшите дьиов диалогов. Обработчикт' для
кнопок можете не![]()
В модуле ColorL,1 11it — обработ•типт нажатия на
FieldShape CellShape![]()
procedure
TObjcct; Butt0I1: T,MouseButton,![]()
Shit№
TShiftState•, Х, У: lntege:r}•,
begin
MainFom.FjeldCo[orDlg.Execute•,
Fietd„Shape.Bwsh.Cot0f := MainForm.Fie1dColorDlg-Cotor•, end;
procedure “I“Object;
13'Itton:![]()
Shifi TShifiState; Х, У:
1;yegin
![]()
Ce[l Shape.B (-vsh .Со1ог := Mai r.F01T.CellC010TI)l g.Color; end;
В обработчике КНО(ЈКИ «задать (1В€Г3” на
Орме низуалтв,ацми
вызов этого нового диалога-
В модуле LifetJnit описываем ся5работчих SetC010fBtn.
procedure
var си СГ: тсо10(. heg:in
С 1 := MainForm.FietdC010rD1g.Colcw;
СГ
соток
ColorForm.FieldShape.Brush.Color := СТ; C010fForm.Ce11Shape.B№h.C010f := (12; ifC010TFom.ShowN10<1al [11тСапсс[ then begin
Mai1jFortIj.FieklC010rD1grolor
end; end;
В данном случае вызывается форма
—
диалог установки цвета. Если е нем
нажата ктлзпха ”Огмева•, то значения
цветов восстанавливаются. Отм спецкальво для этого перед вызовом сохраняются в
С] и С2.
18- Пользователь проигрывателя МОЖСТ с:тучаЙнО закрыть окно формы упражлсния.
Следователь, придется перезапускать программу.
МОЖНО эту проблему следующим сбразом. При
попытке
пользователя, хочет ли он совсем выйт••
мз программы. И еслк хочет— закрыть главную форму![]()
procedure
TControlForm.FormCloseQuery(Sender: TObject; чат CM1Close: Воо[еал}•, begin
ifMessageD уД'ВыГгтј' w3 программы?'$ 1T1tWan3ing, [плЬУе*, mbNol, 0) = mrYes
then Mai11Form.C10se clse CajjC10se Гаке:
Этой кокструкцкей закрывается главлая форма из формы упраштегмя. То же собьтке МОЖНО обработать в ГЛАВНОЙ форме, каждый раз слрам.штвая о желании выйти. Запустттте программу.

Рис. 93![]()
19. Подведем итоги. Для создания многооконности необходимо![]()
1 Создать очередную форму.
2. Модули, предназначенные пользователю, поместить в interface, а модули, предназначенные программистуто, поместить в uses.
3. Необходимо помнить о круговых ссылкахи и избегать ignotum рек ignotius. В интерфейс поместить только необходимое.
4 В 0nCreate делать описание, не забывая о порядке создания форм в файле проекта.
5 . Программа заканчивается, когда закрывается главная форма. Остальные формы приложения могут закрываться сколько угодно.
6. Диалоги: вызов ShowModal, результат — ModalResult нажатой кнопки.
7. Выбрать
нужную форму или модуль для редактирования можно с помощью кнопок панели
инструментов или клавишами Ctrl-F12 и Shift-F12. Переключение модульформа —
просто клавишей F12.
ПРИЛОЖЕНИЕ ![]()
1.1. Часто встречающиеся свойства элементов управления, используемые в Delphi
В зависимости от своего предназначения свойства могут быть представлены в окне свойств в самых разных видах. Например, свойства, диапазон значений которых невелик, нередко представляются в виде выпадающего списка, в котором перечислены все эти значения, и из них достаточно выбрать наиболее подходящее.
К таким свойствам относится в частности Color (цвет элемента). Его можно задать как для любого элемента управления на форме, так и для самой формы. При этом в списке возможных значений в дополнение к названию цвета также показывается небольшой прямоугольник, закрашенный соответствующим цветом - в правой части выпадающего списка значений окна свойств.
Свойство BorderStyle (стиль границ) позволяет задать внешний вид границ элемента на форме (или самой формы). Такие границы могут отличаться от элемента к элементу, а у некоторых элементов (например, кнопки) просто отсутствовать.
Свойство РорирМепи (контекстное меню) позволяет привязать составленное разработчиком локальное меню к некоторому элементу - оно будет вызываться при щелчке на нем правой кнопкой мыши.
Свойство Cursor (курсор) позволяет выбрать вид курсора, который может изменяться при наведении его на соответствующий элемент. Это изменение будет происходить только в работающей программе, а не в проектируемой форме в дизайнере. Доступные формы курсора наглядно показываются в выпадающем списке.
Свойство Enabled (включено) позволяет делать различные элементы временно недоступными для пользователя. Это свойство имеет логический тип Boolean и соответственно может принимать одно из двух значений True или False. Когда выбрано значение False, пользователь не сможет взаимодействовать с этим элементом управления - не сможет нажимать на кнопку, переключать переключатель, выбирать пункт меню и так далее. Но сам элемент на форме будет виден, только возможно в некотором ”пассивном” виде.
Свойство Visible определяет видимость элемента на экране. Если его значение равно Тте, то, хотя такой элемент будет виден в дизайнере, в рабочей скомпилированной программе он виден не будет. Но это свойство надо отличать от свойства Enabled, которое, будучи переведенным в состояние False, хотя и делает элемент недоступным пользователю для воздействия, тем не менее сохраняет его видимым в окне. А свойство Visible может просто сделать элемент невидимым.
С помощью свойства AutoSize можно задать автоматическую подстройку размеров элемента под длину содержащегося в нем текста. Данное свойство востребовано прежде всего в элементах вроде поля-надписи и имеется не у всех элементов, а преимущественно у тех, которые применяются для обработки и отображения текста.
1.2. Вложенные свойства
Некоторые свойства могут иметь вложенную структуру и сами быть вложенными. Такие свойства выделяются в окне свойств маленьким плюсиком с левой стороны списка. При щелчке этот плюсик раскрывается во вложенный список дополнительных свойств, относящихся к данному свойству. Только они будут несколько сдвинуты вправо, чтобы разработчик не путал их с собственными свойствами текущего элемента.
Вложенные свойства представляют собой другие объекты и элементы управления. Когда обращаются к вложенному объекту, то в окне свойств на дополнительном уровне показываются свойства этого объекта. Типичный пример такого свойства, часто вкладываемого в другие объекты - свойство Font (шрифт). Если выделить в дизайнере поленадпись и раскрыть данное свойство, то можно увидеть более подробно, из каких свойств оно на самом деле состоит.
34
В поле Name, относящемся к шрифту, можно подбирать подходящий профиль шрифта. С помощью свойства Size - задавать его размер, с помощью свойств Bold и Italic (они в свою очередь вложены в свойство Style) - делать шрифт жирным или наклонным и так далее. При этом, как видно, названия различных свойств обычно точно отражают их предназначение и совпадают где возможно с названиями, принятыми в различных популярных прикладных программах в качестве стандартных обозначений.
Свойство Color (цвет шрифта) определяет, каким цветом будут показываться надписи, сделанные на элементе управления. Свойства Left и Тор определяют местонахождение элемента на форме (координаты на форме левого - верхнего угла элемента). Свойства вложенных Width (ширина) и Height (высота) задают размер элемента. Свойство Position реализовано для формы. Оно позволяет определить, в каком месте экрана будет показана соответствующая форма при ее открытии (после запуска скомпилированной программы). Position может принимать одно из следующих значений:
poDesigned. Форма
показывается на экране в точности в той позиции, в какой она находилась на
экране при ее подготовке в дизайнере.
poDesktopCenter. Форма центрируется по
отношению к краям рабочего стола.
poScreenCenter. Форма центрируется по
отношению к краям экрана.
poDefaultPosOnly.
Форма показывается в месте, установленном в Windows по умолчанию.
poDefault. Форма
показывается в месте, установленном в Windows по умолчанию, а размеры окна
также принимаются равными с установленными в Windows по умолчанию.
poOwnerFormCenter. Форма центрируется по
отношению к родительскому окну.
1.3. Списки
Очень полезный элемент управления - список (набор строк) ListBox на панели
Standard. Свойство ItemIndex - номер текущей выделенной строки. Если ничего не выделено, то принимает значение -1, иначе - номер выделенной строки в списке. Нумерация строк начинается с нуля. Фактически, список - это массив строк (на самом деле объект, включающий массив строк), только он дополнен разными удобными свойствами и методами для работы с этим массивом.
Число элементов можно узнать через
свойство Count, а флажок Sorted (тип boolean)
когда принимает
значение true, приводит к автоматической сортировке значений массива. С помощью
Sorted удобно выполнять сортировку разных значений. Сами строки хранятся в
свойстве Items. Доступ к содержимому Items происходит через подсвойство
Strings.
Например, в s записываем
седьмую строку списка строк ListBoxl
s .= ListBoxl .Items.Strings[ 7 Г,
Содержимое списка можно очистить, обратившись к методу Clear свойства Items:
ListBoxl .Items.Clear•
Исходно список пустой, а добавление
новой строки в список происходит таким образом:
добавляемая строка![]()
ListBoxl .Items.Add( s у,
1.4. Элементы управления
Для списка можно отслеживать выбор какого-то элемента мышкой. Для этого в инспекторе объектов на закладке Events, где задаются события текущего объекта, которые можно обрабатывать, дважды щелкнуть на строчке 0nClick (событие, возникающее при щелчке мышкой на списке), и создастся обработчик такого щелчка (сначала надо выделить конечно сам список на форме). В этом обработчике можно с помощью свойства ItemIndex можно узнать, какой элемент был выделен. Это удобно, например, когда у нас есть список заданий, и мы хотим, когда выбрали в списке упражнений элемент-название, динамически
показывать, например, в поле-надписи или многострочном поле подробное описание соответствующего упражнения.
1.5. Многострочное поле Мето
Многострочное поле Мето позволяет
редактировать несколько строчек. Основное свойство - Lines (массив строк)![]()
Очистка содержимого: Мето1 .Lines.Clear•![]()
Мето1 - это имя компонента Мето по умолчанию.
Обратиться к любой строке можно
по номеру (нумерация начинается с нуля: Мето1 .Lines[O] := ' Это первая строка!![]()
Добавление строки осуществляется методом Add•
Мето1 .Lines.Add( ' эту строку добавляем в конец..![]()
Можно сохранить все содержимое Мето в текстовый файл (указываем полный/относительный к нему путь) •
Мето1 .Lines. SaveToFile( 'c:\txt\memotekst.txt'
Число
строк - метод Count.
п := Мето1 .Lines.Count; // текущее число строк в Мето
Свойство WordWrap задает, будут ли слова переноситься на новую строчку, если строка не уместилась в длину в окне Мето. При этом, даже если перенос будет автоматически, считается строка все равно одной целой, при автопереносе новые строки в Lines не появляются.
Свойство ReadOnly задает, доступно ли содержимое поля для редактирования, или же только для просмотра и выделения/копирования.
1.6. Компоненты, используемые в графике
Компонент Shape (панель Additional) позволяет на форме создавать разноцветные круги, квадраты, эллипсы. Конкретная форма задается свойством Shape, которое может принимать значения, из списка stRectangle, stSquare, stRoundRect, stRoundSquare, stEllipse, stCircle. Следовательно, форму расположенного на форме объекта можно менять динамически, по нажатию на кнопку:
procedure TForm 1 .Button
Click(Sender: ТОЬј ect)•
begin
Shapel. Shape stCircle
end;
И цвет соответственно, свойство Color
само вложено в свойство Brush (кисть)
поэтому к нему надо обращаться по
цепочке: Shapel .Brush.Color := clRed•![]()
У кисти есть подсвойство Style, которое определяет способ ”заливки” внутренности объекта - сплошное bsSolid, в решеточку bsCross и т.д. Конкретные значения некоторого свойства можно посмотреть в инспекторе объектов, в выпадающем списке.
Shapel .Brush. Style bsCross![]()
Компонент Bevel позволяет создавать выпуклые/невыпуклые панели, рамки и линии Его главные свойства - Shape и Style.
Компонент Panel (раздел Standard) предназачен для создания декоративных панелей, на которых удобно группировать элементы управления, выделяя их визуально. Панель оформляется с помощью свойств, связанных с внешним видом ее каемки - BorderStyle, BorderWidth, BevelWidth, BevelInner, BevelOuter.
Кроме того, можно использовать кнопки с картинками BitBtn или SpeedButton на панели Additional. Через свойство Glyph можно задать картинку, которая будет показана на самой кнопке.
2
|
Таблица 1.1 |
Цвет компонента или объекта свойство Color |
|
||
|
Значение |
|
Цвет |
Значение |
Цвет |
|
сВКсК |
|
Черный |
clGray |
Серый |
|
clMaroon |
|
Темно-красный |
clSilver |
Серебряный |
|
clGreen |
|
Зеленый |
clRed |
Красный |
|
clOlive |
|
Оливковый |
clLime |
Ярко-зеленый |
|
clNavy |
|
Темно-синий |
clBlue |
Голубой |
|
clPurple |
|
Фиолетовый |
clFuchsia |
Сиреневый |
|
clTeal |
|
Сине-зеленый |
clAqua |
Ярко-голубой |
|
|
|
|
clWhite |
Белый |
Таблица 1.2. Системные цвета Windows, определяемые цветовой схемой
|
Значение |
Цвет для элемента |
|
clBackground |
фон окна |
|
clActiveCaption |
заголовок активного окна |
|
cllnactiveCaption |
заголовок неактивного окна |
|
clMenu |
фона меню |
|
clWindow |
фон Windows |
|
clWindowFrame |
рамка окна |
|
clMenuText |
текст элемента меню |
|
clWindowText |
текст внутри окна |
|
clCaptionText |
заголовок активного окна |
|
clActiveBorder |
рамка активного окна |
|
cllnactiveBorder |
рамка неактивного окна |
|
clAppWorkSpace |
рабочая область окна |
|
clHighlight |
фон выделенного текста |
|
clHightlightText |
выделенный текст |
|
clBtnFace |
Кнопка |
|
clBtnShadow |
фон кнопки |
|
clGrayText |
недоступный элемент меню |
|
clBtnText |
текст кнопки |
Таблица 1.3. Базовые свойства Color как шестнадцате ичные константы
|
Цвет |
Значение |
Цвет |
Значение |
|
Черный |
$ 000000 |
Синий |
$ 000080 |
|
Светло-синий |
$OOOOFF |
Зеленый |
$ 008 000 |
|
Светло-зеленый |
$OOFFOO |
Сине-зеленый |
$ 008 080 |
|
Голубой |
$OOFFFF |
Коричневый |
$ 800000 |
|
Светло-красный |
$FFOOOO |
Темно-сиреневый |
$ 800080 |
|
Сиреневый |
$FFOOFF |
Оливковый |
$ 808 000 |
|
Светло-желтый |
$FFFFOO |
Темно-серый |
$ 808 080 |
|
Белый |
$FFFFFF |
Светло-серый |
$сососо |
Таблица 1.4. Выравнивание компонента внутри формы (свойство Align)
|
Значение |
Расположение компонента |
|
alNone |
Без выравнивания на месте размещения при создании программы значение по молчанию |
|
alTop |
Перемещение в верхнюю часть формы, ширина компонента становится авной ши ине о мы высота не меняется |
|
alBottom |
Перемещение в нижнюю часть формы, ширина становится равной ши ине о мы высота не изменяется |
|
alLeft |
Перемещение в левую часть формы, высота компонента становится авнои высоте о мы ши ина не изменяется |
|
alRight |
Перемещение в правую часть формы, высота становится равной высоте о мы ши ина не изменяется |
|
alClient |
Компонент полностью занимает всю рабочую область формы |
З
Таблица 2.1 Функции ввода вывода
|
Функция |
Описание |
|
InputBox (Заголовок, Подсказка, Значение) |
В результате выполнения функции на экране появляется диалоговое окно, в поле которого пользователь может ввести строку символов. Значением функции является введенная строка. Параметр Значение задает значение функции «по умолчанию», т.е. строку, которая будет в поле едакти ования в момент появления окна. |
|
ShowMessage (s) |
Процедура выводит окно, в котором находится сообщение и командная кнопка ОК. |
|
MessageDlg (s, t, Ь, h) |
Выводит на
экран диалоговое окно с сообщением и возвращает код кнопки, щелчком на
которой пользовательзакрыл окно. Параметр определяет тип окна: mtWarning —
Внимание; mtError — ошибка; myInformation информация; mtConfirmation |
Таблица 2.2. Математические функции
|
Функция |
Описание |
|
Abs (п) |
Абсолютное значение п |
|
Sqrt (п) |
Квадратный корень из п |
|
Sqr (п) |
Квадрат п |
|
Ехр (п) |
Экспонента п |
|
|
Натуральный логарифм п |
|
Random (п) |
Случайное целое число в диапазоне от 0 до пл (перед первым обращением к функции необходимо вызвать функцию Randomize, которая выполнит инициализацию п ог аммного гене ато а сл чайных чисел |
|
Sin ф) |
Синус выраженного в радианах угла |
|
Cos ф) |
Косинус выраженного в радианах угла |
|
Arctan ф) |
Арктангенс выраженного в радианах угла |
Таблица 2.3 Функции преобразования
|
Функция |
Описание |
|
Chr (п) |
Символ, код которого равен п |
|
IntToStr (К) |
Строка, являющаяся изображением целого К |
|
FloatToStr (п) |
Строка, являющаяся изображением вещественного п |
|
FloatToStr (п, f, Кэт) |
Строка, являющаяся изображением
вещественного п. При вызове функции указывают: f - формат; К - точность; т
количество цифр после десятичной точки. Формат определяет способ изображения
числа: ffGeneral универсальтный; ffExponent научный; ffFixed |
|
Format (s, [п 1, п2, 1) |
Строка, являющаяся изображением значений п], п2 и т.д. Способ преобразования значений в строку символов определяют управляющие символы, которые находятся в ст оке о мати ования s |
|
StrToInt (s) |
Целое, изображением которого является строка s |
|
StrToFloat (s) |
Вещественное, изображением которого является строка s |
|
Round (п) |
Целое, полученное путем округления п по известным п авилам |
|
Т гипс (п) |
Целое, полученное путем отбрасывания дробно части п |
|
Frac (п) |
Дробное представляющее собой дробную часть вещественного п |
|
Int (п) |
Дробное представляющее собой целую часть вещественного п |
4
Таблица 3.1 События
|
Событие |
Происходит |
|
OnClick |
При щелчке мыши |
|
OnDblClick |
При двойном щелчке кнопкой мыши |
|
0nMouseDown |
При нажатии кнопки мыши |
|
0nMouseUp |
При отпускании кнопки мыши |
|
0nMouseMove |
При перемещении мыши |
|
0nkeyPress |
При нажатии клавиши клавиатуры |
|
0nkeyDown |
При нажатии клавиши клавиатуры. |
|
События ()nkeyDown и ()nkeyPress это чередующиеся, повторяющиеся события. Которые должны происходить до тех пор, пока не будет отпущена удерживаемая клавиша в этот момент п оисходит событие ОпКе U |
|
|
OnI<eyUp |
При отпускании нажатой клавиши клавиатуры |
|
0nCreate |
При создании объекта (формы, элемента управления) Процедура обработки этого события обычно используется для инициализации переменных, выполнения подготовительных действий |
|
0nPaint |
При появлении окна на экране в начале работы программы после появления части окна, которая, например, была закрта другим окном и в других случаях. Событие сообщает о необходимости обновить пе е исовать окно |
|
0nEnter |
При получении элементом управленя фокуса |
|
0nExit |
При потере элементом управленя фокуса |
Литература
1 Симонович СВ., Евсеев ГА.
Занимательное программирование: Delphi. — М.: АСТ
ПРЕСС КНИГА: Инфорком
- Пресс, 2001![]()
2. Культин НБ. Delphi в задачах и примерах. — СПб.: БХВ — Петербург, 2005.
3. Фаронов
В В. Программирование на языке высокого уровня: Учебник для вузов.
СПб.
: Питер, 2003.
4 Бобровский СИ. Delphi 7. Учебный курс. — СПб.: Питер, 2005.
5
. Кетков Ю.Л., Кетков А.Ю. Практика программирования: Visual
Basic, С++ Builder
Delphi. - СПб: БХВ - Петербург, 2005.
142
Содержание
Введение
2 1 . Идеология объектно-ориентированного
программирования
З
1
. 1. Элементы интерфейса программы Компоненты
З
1.2. Инспектор объектов .
7
2. Три основных принципа ООП: наследование, инкапсуляция,
полиморфизм
8 3. Использование справки .
10
4. Структура программы![]()
5. Методы отладки и
борьбы с ошибками .
13
Практическая работа № «Моя первая программа».................................................................. 16
Практическая работа .№ 2 Создание консольного приложения
17
Практическая работа .№ 3 «Приветствие» .
19
Практическая работа .N9 4 «Случайный выбор».
21 Практическая
работа .№ 5 Изменение заголовка формы.
23 Практическая
работа .№ 6 «Двигающая кнопка» .
25
Практическая работа .№ 7 «Альбом».
26 Практическая
работа № 8 Работа с меню .
28
Практическая работа № 9 Случайный выбор из списка
31
Практическая работа № 10 Простейший плеер
33 Практическая
работа № 1 «Прыгающая кнопка» .
35 Практическая работа № 12 «Таблица
умножения» .
37 Практическая работа № 13 Применение
полос прокрутки.
40
Практическая работа № 14 «Светофор» .
43 Практическая
работа № 15 «Ханойские башни» .
46 Практическая работа № 16 «Электронный альбом»
.
49 Практическая работа № 17 «Вычисление
процентов» .
52 Практическая работа № 18 «Головоломка
№ 1».
54 Практическая работа № 19 «Головоломка
№ 2».
56 Практическая работа № 20 «Обычный
калькулятор» .
58
Практическая работа № 21 «Строковый калькулятор»
61
Практическая работа № 22 Нахождение индекса в массиве
случайных чисел
63
Практическая работа № 23 Находение минимального и
максимального числа в массиве
65
Практическая работа № 24 «Текущее время и текущая дата»
67
Практическая работа № 25 «Электронные часы»
68
Практическая работа № 26 Графика
70
Практическая работа № 27 «Олимпийский флаг»
75
Практическая работа .№ 28 «Узоры» .
77
Практическая работа .№29 Перемещение рисунка .
80
Практическая работа .№ 30 Рисунок..
83
Практическая работа .№ 3 Построение графика.
86
Практическая работа .№ 32 «Градусник».
88
Практическая работа .№ 33 Вывод табличных данных .
92
Практическая работа .№ 34 «Игра»..
96 Практическая работа .№ 35 «Тест» .![]()
Практическая работа 36 «Проигрыватель»
109
ПРИЛОЖЕНИЕ ![]()
1
. 1 Часто встречающиеся свойства элементов управления,
используемые в Delphi .
133
1.2. Вложенные
свойства.............................................................................................................
133 1.3 Списки......................................................................................................................![]()
1.4. Элементы
134
1.5. Многострочное поле
Мето .
135
1 43
| 6. Компоненты, используемые в графике
135
ПРИЛОЖЕНИЕ 2
137
Таблица 1.1. Цвет компонента или
объекта (свойство Color)
137 Таблица 1.2. Системные цвета Windows, определяемые цветовой схемой
137 Таблица 1.3. Базовые свойства
Color как шестнадцатеричные константы.
138 Таблица 1.4. Выравнивание
компонента внутри формы (свойство Align)
137
ПРИЛОЖЕНИЕ З
139
Таблица 2.1. Функции ввода вывода.
139 Таблица 2.2. Математические
функции 139
Таблица 2.3. Функции преобразования .
ПРИЛОЖЕНИЕ 4
Таблица 3.1. События.
Литература.
142
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.