1

Delphi. Учимся на примерах

Embed Size (px)

DESCRIPTION

Данная книга — продолжение предыдущей книги автора, "Delphi. Только практика".Также как и в "Delphi. Только практика", в данном издании подробно рассмотрены про-граммы для сетей, различные шуточные программы, простые игрушки, некоторые полез-ные приложения, разработка приложений в стиле Windows XP. В частности, здесь можнонайти такие примеры как бесплатная отправка SMS, FTP-клиент, простое шифрование,CGI-сценарии и многое другое. Описаны методы работы с системным реестром Windows иINI-файлами, а также некоторые важные аспекты программирования на системном уровнес применением функций Windows API. Для облегчения понимания программ каждый при-мер содержит комментарии сложных строк кода.Книга ориентирована как на тех, кто уже имеет опыт создания приложений в Delphi,так и на начинающих программистов. Для начинающих пользователей Delphi в конце книгидобавлено приложение с описанием синтаксиса языка программирования Object Pascal.

Citation preview

Page 1: Delphi. Учимся на примерах
Page 2: Delphi. Учимся на примерах

С. М. Парижский

чщ

УЧИМСЯ НА ПРИМЕРАХ

Под редакцией Ю. А. Шпака

"МК-Пресс"

Киев, 2005

Page 3: Delphi. Учимся на примерах

ББК 32.973.26-018.1УДК 681.3.06

П18

Парижский С. М.П18 Delphi. Учимся на примерах/Под ред. Ю. А. Шпака - К.: "МК-Пресс",

2005.-216с, ил.

ISBN 966-8806-02-6

Данная книга — продолжение предыдущей книги автора, "Delphi. Только практика".Также как и в "Delphi. Только практика", в данном издании подробно рассмотрены про-граммы для сетей, различные шуточные программы, простые игрушки, некоторые полез-ные приложения, разработка приложений в стиле Windows XP. В частности, здесь можнонайти такие примеры как бесплатная отправка SMS, FTP-клиент, простое шифрование,CGI-сценарии и многое другое. Описаны методы работы с системным реестром Windows иINI-файлами, а также некоторые важные аспекты программирования на системном уровнес применением функций Windows API. Для облегчения понимания программ каждый при-мер содержит комментарии сложных строк кода.

Книга ориентирована как на тех, кто уже имеет опыт создания приложений в Delphi,так и на начинающих программистов. Для начинающих пользователей Delphi в конце книгидобавлено приложение с описанием синтаксиса языка программирования Object Pascal.

ББК 32.973.26-018.1

Парижский Сергей Михайлович

DelphiУЧИМСЯ НА ПРИМЕРАХ

Главный редактор: Ю. А. ШпакКомпьютерная верстка: Ю. А. Шпак

© Парижский С. М., текст, иллюстрации, 2005I S B N 966—8806—02—6 © "МК-Пресс", оформление, дизайн обложки, 2005

Page 4: Delphi. Учимся на примерах

Содержание 3

Содержание

ВВЕДЕНИЕ..... 9

ГЛАВА 1. ИНТЕРФЕЙС В СТИЛЕ WINDOWS XP 10

ГЛАВА 2. РАБОТА с ФАЙЛАМИ 13

ПОСТАНОВКА ЗАДАЧИ 13

РАЗРАБОТКА ФОРМЫ 13

РАЗРАБОТКА ПРОГРАММНОГО КОДА 14

Полный исходный код МОДУЛЯ 18

ГЛАВА 3. РАБОТА С ТЕКСТОМ. СТАТИСТИКА ДОКУМЕНТА 22

ПОСТАНОВКА ЗАДАЧИ 22

РАЗРАБОТКА ФОРМЫ 22

РАЗРАБОТКА ПРОГРАММНОГО КОДА 24

Полный исходный код МОДУЛЯ 25

ГЛАВА 4. Снимок ЭКРАНА 29

ПОСТАНОВКА ЗАДАЧИ 29

РАЗРАБОТКА ФОРМЫ 29

РАЗРАБОТКА ПРОГРАММНОГО КОДА 30

ПОЛНЫЙ ИСХОДНЫЙ КОДМОДУЛЯ : 3 I

ГЛАВА 5. ХРАНИТЕЛЬ ЭКРАНА 35

ПОСТАНОВКА ЗАДАЧИ 35

РАЗРАБОТКА ФОРМЫ 35

РАЗРАБОТКА ПРОГРАММНОГО КОДА 37

Полный исходный код МОДУЛЯ 39

ГЛАВА 6. ПРОГРАММА ПРОСМОТРА РИСУНКОВ 43

ПОСТАНОВКА ЗАДАЧИ 43

РАЗРАБОТКА ФОРМЫ 43

РАЗРАБОТКА ПРОГРАММНОГО КОДА 45

Полный исходный код МОДУЛЯ 47

ГЛАВА?. БЛОКНОТ-ШИФРОВАЛЬЩИК 50

ПОСТАНОВКА ЗАДАЧИ 50

РАЗРАБОТКА ФОРМЫ .' 50

РАЗРАБОТКА ПРОГРАММНОГО КОДА 51

Полный исходный код МОДУЛЯ 55

Page 5: Delphi. Учимся на примерах

Интерфейс в стиле Windows XP

ГЛАВА 8. ИГРА " У С П Е Й ЩЕЛКНУТЬ" 59

ПОСТАНОВКА ЗАДАЧИ 59

РАЗРАБОТКА ФОРМЫ 59

РАЗРАБОТКА ПРОГРАММНОГО КОДА 61

Полный исходный код МОДУЛЯ 63

ГЛАВА 9. ИГРА "УГАДЫВАНИЕ ЧИСЕЛ" 66

ПОСТАНОВКА ЗАДАЧИ 66

РАЗРАБОТКА ФОРМЫ 66

РАЗРАБОТКА ПРОГРАММНОГО КОДА 68

Полный исходный КОДМОДУЛЯ 74

ГЛАВА 10. Вход в СИСТЕМУ 81

ПОСТАНОВКА ЗАДАЧИ 81

РАЗРАБОТКА ФОРМЫ 81

РАЗРАБОТКА ПРОГРАММНОГО КОДА 82

Полный исходный код МОДУЛЯ 86

ГЛАВА 11. ИНФОРМАЦИЯ О ПАМЯТИ 89

ПОСТАНОВКА ЗАДАЧИ 89

РАЗРАБОТКА ФОРМЫ 89

РАЗРАБОТКА ПРОГРАММНОГО КОДА 90

Полный исходный код МОДУЛЯ 91

ГЛАВА 12. ПРОГРАММА НАСТРОЙКИ WINDOWS 95

ПОСТАНОВКА ЗАДАЧИ 95

РАЗРАБОТКА ФОРМЫ 95

РАЗРАБОТКА ПРОГРАММНОГО КОДА 96

Полный исходный КОДМОДУЛЯ 99

ГЛАВА 13. ТЕСТ 103

ПОСТАНОВКА ЗАДАЧИ 103

Структуры базы вопросов и ответов 103

РАЗРАБОТКА ФОРМЫ 104

РАЗРАБОТКА ПРОГРАММНОГО КОДА 106

Полный исходный код МОДУЛЯ 115

ГЛАВА 14. ГЕНЕРАТОР ШУТОК 125

ПОСТАНОВКА ЗАДАЧИ 125

РАЗРАБОТКА ФОРМЫ 125

Page 6: Delphi. Учимся на примерах

Содержание 5

РАЗРАБОТКА ПРОГРАММНОГО КОДА 125

Шутка №1 — ограничение диапазона движения мыши 127Шутка №2 — отключение кнопок мыши 128Шутка №3 — отключение клавиатуры .....128Шутка №4 — очистка буфера обмена 128Шутка №5 — назначение фона для Рабочего стола 129

Шутка №6 — выбор фона случайным образом 130Шутка №7— выключение монитора 131Шутка №8 — сообщение об ошибке, содержащее "мусор" 131Шутка №9 — открытие браузера Internet Explorer 132Шутка №10 — сброс системной даты/времени 132

Полный исходный код МОДУЛЯ 132

ГЛАВА 15. ОТПРАВКА СООБЩЕНИЙ В ЛОКАЛЬНОЙ СЕТИ 138

ПОСТАНОВКА ЗАДАЧИ 138

РАЗРАБОТКА ФОРМЫ 138

РАЗРАБОТКА ПРОГРАММНОГО КОДА '. 139

Полный исходный код МОДУЛЯ 141

ГЛАВА 16. УДАЛЕННОЕ УПРАВЛЕНИЕ УКАЗАТЕЛЕМ МЫШИ 144

ПОСТАНОВКА ЗАДАЧИ 144

РАЗРАБОТКА КЛИЕНТСКОЙ ПРОГРАММЫ 144

Разработка формы 144Разработка программного кода 145

РАЗРАБОТКА СЕРВЕРНОЙ ПРОГРАММЫ 147

Полный исходный код МОДУЛЕЙ 148

ГЛАВА 17. БЕСПЛАТНАЯ ОТПРАВКА SMS ЧЕРЕЗ INTERNET 152

ПОСТАНОВКА ЗАДАЧИ 152

РАЗРАБОТКА ФОРМЫ 152

РАЗРАБОТКА ПРОГРАММНОГО КОДА 154

Полный исходный код МОДУЛЯ 156

ГЛАВА 18. FTP-КЛИЕНТ 158

ПОСТАНОВКА ЗАДАЧИ 158

РАЗРАБОТКА ФОРМЫ 158

РАЗРАБОТКА ПРОГРАММНОГО КОДА 161

Полный исходный код МОДУЛЯ 165

Page 7: Delphi. Учимся на примерах

Интерфейс в стиле Windows XP

ГЛАВА 19. НАПИСАНИЕ CGI-ПРИЛОЖЕНИЙ 171

ПОСТАНОВКА ЗАДАЧИ 171

РАЗРАБОТКА ПРОЕКТА 171

ПРИЛОЖЕНИЕ А. Коды КЛАВИШ И ИХ ЗНАЧЕНИЯ 174

ПРИЛОЖЕНИЕ Б. KYLIX — DELPHI ДЛЯ LINUX 177

ПРИЛОЖЕНИЕ В. СПРАВОЧНИК по РЕЕСТРУ WINDOWS 178

ОБЩАЯ НАСТРОЙКА ПК 178

Изменение разрешения экрана 178

Установка задержки перед появлением контекстного меню 178

Сокрытие изображение стрелки на ярлыках 178

Сокрытие приставки "Ярлык для... " 179

Запрет на редактирование реестра 179

Отключение динамика ПК 179

Включение динамика ПК 179

Отключение возможности автозапуска с CD-ROM. 179

Отключение всплывающих подсказок в Проводнике и

на Рабочем столе 180

Автоматическое наведение указателя мыши на активную кнопку. 180

Отключение возможности открывать диспетчер задач 180

Отключение возможности восстановления системы 180

Очистка swap при выключении компьютера. 180

ИЗМЕНЕНИЕ РАЗМЕЩЕНИЯ ПАПОК и КАТАЛОГОВ 181

Изменение размещения папки Избранное 181

Изменение каталога по умолчанию для программ 181

СОКРЫТИЕ ПУНКТОВ СИСТЕМНОГО МЕНЮ ПУСК 181

Сокрытие пункта Пуск —> Найти 181

Сокрытие пункта Пуск —» Программы —> Стандартные 181

С окры тие пункта Пуск —» Избранное 181

Сокрытие пункта Пуск —> Документы 182

Сокрытие пункта Пуск —> Панель управления 182

Сокрытие пункта Пуск—* Выполнить 182

Сокрытие пункта Пуск -> Настройка -» Принтеры 182

Сокрытие пункта Пуск—> Настройка —> Панель задач 182

Сокрытие пункта Пуск —> Завершение сеанса 183

Сокрытие пункта Пуск^> Выключить компьютер 183

Сокрытие всех дополнительных папок в меню Пуск 183

Page 8: Delphi. Учимся на примерах

Содержание 7

Сокрытие папки Мои документы в меню Пуск. 183

СОКРЫТИЕ РАЗЛИЧНЫХ ЭЛЕМЕНТОВ ИНТЕРФЕЙСА 183

Сокрытие дисков в папке Мой компьютер 183

Сокрытие пиктограммы Принтеры в панели управления 184

Сокрытие вкладок Общие и Сведения в окне свойств принтера 185

НАСТРОЙКА РАБОЧЕГО СТОЛА 185

Сокрытие всех элементов Рабочего стола /55

Сокрытие пиктограммы Internet на Рабочем столе „ 185

Сокрытие пиктограммы Сетевое окружение на Рабочем столе 185

Отключение возможности вызывать окно свойств экрана 185

Отключение контекстного меню панели задач 186

Отключение контекстного меню Рабочего стола 186

Сокрытие папки Мои документы на Рабочем столе 186

СОКРЫТИЕ ВКЛАДОК ОКНА свойств ЭКРАНА 186

Сокрытие вкладки Оформление 186

Сокрытие вкладки Фон 186

Сокрытие вкладки Заставка 187

Сокрытие вкладки Параметры 187

НАСТРОЙКА БРАУЗЕРА INTERNET EXPLORER : 187

Сокрытие команд меню, кнопок и панелей 187

Сокрытие элементов окна Свойства обозревателя 189

Общая настройка браузера 190

ПРИЛОЖЕНИЕ Г. Язык OBJECT PASCAL 195

КОММЕНТАРИИ 195

ИДЕНТИФИКАТОРЫ 195

ВСТРОЕННЫЕ типы ДАННЫХ 196

Числовые типы 196

Символьный тип 197

Строковые типы 197

Булев тип данных 197

Массивы 197

КОНСТАНТЫ 198

ПЕРЕМЕННЫЕ 198

ПОЛЬЗОВАТЕЛЬСКИЕ ТИПЫ ДАННЫХ 199

Множества 199

Перечислимые типы 200

Подтипы 201

Page 9: Delphi. Учимся на примерах

Интерфейс в стиле Windows XP

ЗАПИСИ 201

КЛАССЫ 202

Определение членов класса 202

Свойства класса 204

Методы класса 205

КОНСТРУКЦИЯ WITH-DO 205

СТРУКТУРА ПРОЕКТА DELPHI 206

Файл проекта . dpr 206

Файл программного модуля .pas 207

ПРОЦЕДУРЫ И ФУНКЦИИ 208

Параметры 208

Вызов процедур и функций 209

Досрочный выход из процедуры или функции 209

ОПЕРАТОРЫ 209

Оператор присваивания 210

Арифметические операторы 210

Булевы операторы 210

Операторы сравнения 210

Побитовые операторы 210

Строковые операторы 211

Операторы, применяемые к множествам 211

Операторы, применяемые с объектами 211

Группировка операторов 212

Порядок выполнения операторов 212

БЛОКИ ПРОГРАММНОГО КОДА 2 1 2

КОНСТРУКЦИИ ВЕТВЛЕНИЯ 212

Оператор if, 212

Оператор case 213

ЦИКЛИЧЕСКИЕ КОНСТРУКЦИИ 213

Конструкция for-do 213

Конструкция while-do 214

Конструкция repeat-until 214

Досрочный выход из циклов 214

ОБРАБОТКА ИСКЛЮЧЕНИЙ 214

Блок операторов finally 216

Page 10: Delphi. Учимся на примерах

Введение 9

ВведениеВ своей первой книге, "Delphi. Только практика", автор рассмат-

ривал примеры различных интересных программ. Эта книга являетсяпродолжением первой книги. Продолжением, поскольку исходные кодыпрограмм, которые рассматриваются в первой и второй книге, не повто-ряются. Также как и в "Delphi. Только практика", в данном изданииподробно рассмотрены программы для сетей, различные шуточные про-граммы, простые игрушки, некоторые полезные приложения, разработ-ка приложений в стиле Windows XP. В частности, здесь можно найтитакие примеры как бесплатная отправка SMS, FTP-клиент, простоешифрование, CGI-сценарии и многое другое.

Поскольку рассмотренные примеры достаточно просты, то даже на-чинающий программист сможет быстро освоить азы написания прило-жений в Delphi и перейти к разработке собственных проектов (описаниесинтаксиса языка программирования Object Pascal представлено в при-ложении Г). Само собой разумеется, что для изучения изложенногов книге материала желательно знать основы работы с Windows, по-скольку Delphi — средство разработки программ именно для этой опе-рационной системы.

Структура книги такова, что ее не обязательно читать от начала доконца, — можно просто открыть любую главу и разработать рассматри-ваемую программу. Все примеры подробно объясняются и содержаткомментарии сложных строк кода. Книга будет интересна как опытнымпрограммистам, так и тем, кто только начал изучать язык программиро-вания Delphi.

К книге прилагается компакт-диск, содержащий исходные и ис-полняемые файлы всех рассмотренных программ, а также цветные ко-пии рисунков.

Page 11: Delphi. Учимся на примерах

10 Интерфейс в стиле Windows XP

Глава 1

Интерфейс в стиле Windows XP

Как известно, интерфейс программ, написанных на Delphi и запус-каемых в операционной системе (ОС) Windows XP, при любом стилеоформления будет иметь одинаковый вид. В этой главе будет показанокак написать программу, которая будет отображаться в стиле ХР.

С помощью любого редактора создайте текстовый файл и введитев нем следующий текст:<?xml version="l.О" encoding="UTF-8" standalone="yes"?><assembly xmlns="urn:schemas-microsoft-com:asm.vl"manifestVersion="l.0"><assemblyldentity

name="Microsoft.Windows.ApplicationName"processorArchitecture="x8 6"version="l.0.0.0"type="win32"/>

<description>ApplicationDescription</description><dependency>

<dependentAssembly><assemblyldentity

type="win32"

name="Microsoft.Windows.Common-Controls"version="6.0.0.0"processorArchitecture="x8 6"publicKeyToken="6595b6414 4ccfldf"language="*"

</dependentAssemblу></dependency>

</assembly>

Сохраните этот файл под именем с: \xp_style . txt . Затем создай-те еще один текстовый файл следующего содержания:[Т~2Т~сТ\xp_style.txt

Сохраните этот файл под именем xp_style.rc в каталогеC:\Program file\Delphi\Bin.

Page 12: Delphi. Учимся на примерах

Введение 11

Файлы x p _ s t y l e . t x t и x p _ s t y l e . r e можно найти на прилагаемом к книгекомпакт-диске в папке C h a p t e r 0 1 .

ПримечаниеУказанный выше путь к папке B i n предполагает, что Delphi был установленв каталог, выбранный по умолчанию. Если при установке был выбран другой ката-лог, то используйте именно его. Далее в книге будет везде использован путь поумолчанию.

Теперь запустим программу C:\Program f i le\Delphi\Bin\brcc32 . ехе, передав ей в качестве параметра имя файла хр s t y l e . re.Для этого следует перейти в режим командной строки, выполнив ко-манду системного меню Пуск • Выполнить, а затем в диалоговом окнеЗапуск программы введя команду cmd и нажав клавишу <Enter>. В ре-жиме командной строки с помощью команды cd перейдем в каталогС: \Program f i le\Delphi\Bin и выполним следующую команду:brcc32.exe xp_style.rc

В результате в каталоге C:\Program f i l e\Delphi\Bin долженпоявиться ресурсный файл x p s t y l e . res , который следует подклю-чать к приложению в том случае, когда его требуется оформить в стилеWindows XP.

Проверим, так ли это, создав программу в стиле ХР. Откройте диа-логовое окно настройки свойств Рабочего стола и выберите тему Win-dows ХР (если она еще не выбрана).

Создайте в Delphi новый проект и разместите на форме компонентEdit категории Standard. Присвойте его свойству Text следующее зна-чение: Все компоненты и сама форма в стиле Windows ХР. Нижеразместите кнопку (компонент Button категории Standard), при нажа-тии которой будет появляться информационное окно (оно тоже должно

_Х1 :̂̂ Обработ^чик события ОпС 1 i с к для КНОПКИ:

procedure TForml.ButtonlClick(Sender: TObject);

begin

ShowMessage(Editl.Text);

end;

Теперь при нажатии КНОПКИ будет появляться окно, содержащеетекст, извлеченный из поля для ввода. Запустим программу на выпол-нение. Как видим, внешний вид интерфейса никак не изменился, несмотря на то, что выбрана тема Windows ХР.

Page 13: Delphi. Учимся на примерах

12 Интерфейс в стиле Windows XP

Для того чтобы решить эту проблему найдите в программном моду-

ле раздел i m p l e m e n t a t i o n (сейчас в нем указано только подключение

файла формы *.dfm при помощи директивы {$R *.dfm}). Для того

чтобы подключить наш файл ресурсов, следует в разделе i m p l e m e n t a -

t ion ^2^3^—^915.9Ш1 ; ____.($R x p _ s t y l e . r e s }

Теперь можно запустить программу и насладиться интерфейсом ХР

(рис. 1.1).

Все компоненты и сама форма в стиле ХР

Рис. 1.1. Элементы формы отображаются в стиле Windows ХР

Введите в поле какой-либо текст и нажмите кнопку — должно поя-

виться информационное окно, которое также будет отображаться в сти-

ле Windows ХР (рис. 1.2). При этом, размер ехе-файла увеличился всего

лишь на несколько сотен байт.

Все компоненты и сама форма в стиле ХР

Рис. 1.2. Информационное окно также отображается в стиле Windows ХР

Все файлы проекта и исполняемый файл рассмотренной программы находятсяна прилагаемом к книге компакт-диске в папке C h a p t e r 0 1 .

Page 14: Delphi. Учимся на примерах

Постановка задачи 13

Глава 2

Работа с файлами

Постановка задачиРазработать программу для работы с файлами. Программа должна

предоставлять стандартные функции, используемые при работе с фай-лами: копирование, перенос, удаление.

Разработка формыСоздайте новый проект Delphi. Первым делом разработаем интер-

фейс программы. Изменим некоторые свойства главной формы. Преждевсего, присвойте соответствующее значение свойству Caption (заголо-вок формы) — например, Работа с файлами. Поскольку окно нашейпрограммы должно всегда находиться поверх всех остальных окон, сле-дует присвоить свойству FormStyle значение fsStayOnTop. Большеникаких свойств формы изменять не будем.

Разместите в левом верхнем углу формы, один над другим два ком-понента Label (метка) категории Standard. Для верхней метки присвой-те свойству Caption значение Что:, а для второй - - Куда:. Рядом сметками разместите по одному компоненту Edit (поле ввода) категорииStandard. Присвойте свойству Name (имя) верхнего поля значение from,а свойству Name нижнего — значение where. Свойствам from.Text иwhere. Text присвойте пути по умолчанию, например: c : \ L t x t иd i \ 2 . t x t .

Для того чтобы не утруждать пользователя копированием или руч-ным вводом путей размещения файлов, воспользуемся стандартнымидиалоговыми окнами открытия и сохранения файлов. Диалоговом окнуоткрытия файла соответствует компонент OpenDialog категории Dia-logs, а диалоговому окну сохранения — компонент SaveDialog той жекатегории. Разместим эти компоненты на форме. Для удобства изменимзначение свойства OpenDialogl.Name на Openl, а значение свойстваSaveDialogl,Name на Savel.

Page 15: Delphi. Учимся на примерах

14 Работа с файлами

Справа от полей from и where разместим кнопки вызова диалого-вого окна обзора (компоненты Button категории Standard). СвойствуCaption этих кнопок присвойте значение Обзор или просто поставьтеточки. При желании, можете изменить размеры кнопок.

Разместите на форме под полем where компонент Label категорииStandard и присвойте его свойству Caption значение Размер файла:.Справа от этой метки разместите еще один компонент Label, очистивдля нее свойство Caption — эта метка будет отображать размер обра-батываемого файла.

Ниже разместим две кнопки (компоненты Button), присвоим ихсвойствам Caption значения Копировать и Вырезать. Под этимикнопками разместим компоненты, которые будут использоваться длявыбора и удаления файлов: компонент Edit для ввода пути к файлу,кнопка вызова диалогового окна обзора и кнопка для удаления файла.

Свойству Editl.Name присвоим значение Del, а свойству Text -путь по умолчанию. Кнопку Обзор разместим справа, а кнопку Удалитьфайл — под полем Del.

Полученная форма должна соответствовать рис. 2.1.

р•Работа с файлами

Что: • ICA1.txt

Куда: • D: V2.txt

Размер файла:

Копировать Вырезать

D:\1.txt

Удалить Файл

Рис. 2.1. Форма Работа с файлами

Разработка программного кодаРазработаем процедуру копирования файла. Это можно было бы

реализовать средствами WinAPI, однако в этом случае процедура, хотя

Page 16: Delphi. Учимся на примерах

Разработка программного кода 15

и была бы менее громоздкой, оказалась бы "привязанной" к системе,что для программ нежелательно, поэтому лучше воспользоваться биб-лиотеками Delphi.

Для начала объявим нашу процедуру (назовем ее doit) как закрытыйчлен класса формы:

typeTFormi = class(TForm)

private{ Private declarations }procedure doit;

public{ Public declarations }

end;

Реализацию процедуры создадим в разделе implementation:

ПримечаниеЗдесь и далее при разработке описанных в книге программ комментарии, при же-лании, можно не вводить. Текст, обязательный для ввода, выделен в листингахполужирным шрифтом.

i

procedure TFormi.doit();var

f1, f 2 : file of Byte; //Работа с первым и вторым файломсор: Byte; //Для побайтового копированияsizez: Longlnt; //Хранит размер файла

begin{$1-} //Отключаем директиву, которая отслеживает ошибки

//ввода/выводаtry //Начало блока обработки исключений

//Связываем файловую переменную fl с первым файломAssignFile(fl, from.Text);//Связываем файловую переменную f2 со вторым файломAssignFile(f2, where.Text);

Reset(fl); //Открываем первый файл на чтениеsizez := Trunc(FileSize(f1)); //Определяем размер файла//Отображаем размер файл для пользователяLabel4.Caption := IntToStr(sizez div 1024) + 'Кб

1;

(Создаем второй файл или перезаписываем его, если он ужесуществует}

Rewrite(£2);while not Eof (fl) dobegin //Пока не достигнут конец первого файла

//Считываем один байт из первого файлаBlockRead(fl, cop, 1);//Записываем один байт во второй файл

Page 17: Delphi. Учимся на примерах

16 Работа с файлами

BlockWrite(f2,cop,1);

end;

CloseFile(fl); //Закрываем первый файлCloseFile(f2); //Закрываем второй файл

finally;

end; //Конец блока обработки исключенийif IOResult <> 0 //Если возникла ошибка ввода-вывода

then MessageDlg('Ошибка при копировании файла!',

mtError, [mbOk],0) //сообщение об ошибкеelse begin

{Если ошибок не было, то выводим окно об успешномокончании копирования)

ShowMessage('Успешно скопировано!');

L end;

end;

Различные конструкции языка Object Pascal (комментарии, операторы ветвления,обработка исключений и др.) рассматриваются в приложении Г.

Эта процедура будет использоваться при копировании и переносефайлов. Сначала мы открываем файлы, которые выбрал пользователь, азатем проверяем, не было ли ошибок при их открытии. Если ошибок небыло, то отображаем пользователю размер исходного файла и начинаемсчитывать байты из первого файла, записывая их во второй. Если копи-рование завершено и ошибок при этом не произошло, то отображаемсообщение об успешном окончании копирования.

Процедура d o i t вызывается при нажатии кнопки Копировать:procedure TForml.ButtonlClick{Sender: TObiect);

По нажатию кнопки Вырезать должно происходить обычное копи-ювание с последующим удалением скопированного файла:procedure TForml.Button5Click(Sender: TObject);begin

doit; //копируемDeleteFile(from.Text); //удаляем исходный файл

end;

Теперь создадим процедуры выбора и сохранения файла с помощьюстандартных диалоговых окон. Для выбора первого (исходного) файласледует создать следующий обработчик события OnClick (кнопке But-ton2 соответствует поле from):[procedure TForml. Button2Click (Sender: TObjectTl •—•••••••••••••• ~ ~ j

Page 18: Delphi. Учимся на примерах

Разработка программного кода 17

beginif Openl.Execute

then from.Text :=

else ShowMessage(

end;

Openl

'Файл.FileName

не был открыт');

При нажатии кнопки Обзор открывается диалоговое окно выборафайла (Openl. Execute). Если в этом окне пользователь нажал кнопкуОтмена (Openl. Execute = False), то сообщаем ему об этом и не вы-полняем никаких действий. Если пользователь выбрал файл, то копиру-ем путь к нему в соответствующее поле ввода.

Создадим аналогичный обработчик события для выбора пути на-значения при копировании первого файла (кнопке Button3 соответст-вует поле where):procedure TForml.Button3Click(Sender:begin

if Savel.Executethen where.Text :=

else ShowMessage('

end;

Savel.FileName

TObject);

Вы не выбрали место для сохранения файла! ') ;

Здесь выполняется та же проверка, что и в предыдущем случае. За-тем выбранный путь заносится в соответствующее поле ввода, чтобыего, при желании, можно было откорректировать.

Теперь создадим аналогичный обработчик события OnClick для

[procedure TForml.Button4Click(Sender: TObject);I begin

if Openl.Execute

then Del.Text := Openl.FileName

else ShowMessage('Файл не был открыт!');

procedure TForml.Button6Click(Sender: TObject);begin

DeleteFile(Del.Text); //удаляем файлif not FileExists(Del.Text) //проверяем существование файла

then ShowMessage('Файл удален!'); //выводим сообщениеend;

Сначала мы удаляем файл, а затем проверяем, существует ли он надиске после выполнения операции удаления. Если его не существует, товыводим сообщение об успешном удалении файла. Теперь можно от-

2 — 5-1212

Page 19: Delphi. Учимся на примерах

18 Работа с файлами

компилировать и запустить программу на выполнение. Внешний вид

окна Работа с файлами в действии показан на рис. 2.2.

i f Работа с файлами ш1Р\ X

Что: JCADocuments and Settings'1^ее1\Рабоч

Куда: |5лРго1ес(.еке

Размер файла: 389Кб

Копировать Вырезать

I D:\Projectexej

Удалить файл

Рис. 2.2. Программа Работа с файлами в действии

Полный исходный код модуляПолный код модуля программы Работа с файлами представлен

в листинге 2.1.

Листинг 2.1. Модуль программы Работа с файлами

unit Unitl;

interface

usesWindows,Controls,

typeTForml =

Messages, SysUtils, Variants, Classes, Graphics,Forms, Dialogs, StdCtrls, ShellAPI, Gauges;

class(TForm)from: TEdit;where:ButtonlLabell:Label2:Label3:Label4:

TEdit;: TButton;TLabel;TLabel;TLabel;:TLabel;

Page 20: Delphi. Учимся на примерах

Полный исходный код модуля 19

Листинг 2.1. Продолжение

Button2: TButton;Button3: TButton;Openl: TOpenDialog;Savel: TSaveDialog;Button4: TButton;del: TEdit;Button5: TButton;Button6: TButton;procedure ButtonlClick(Sender: TObject)procedure Button2Click(Sender: TObject)procedure Button3Click(Sender: TObject)procedure Button5Click(Sender: TObject)procedure Button4Click(Sender: TObject)procedure Button6Click(Sender: TObjent)

private( Private declarations }procedure doit; //объявление процедуры doit

public{ Public declarations }

end ;

var Forml: TForml;

implementation

{$R *.dfm}

procedure Tforml.doit() ;var

fl,f2: file of byte; //работа с первым и вторым файломсор: byte; //для побайтового копированияsizez: longint; //хранит размер файла

begin{$1-} {отключаем директиву, которая следит за ошибками

ввода/вывода}try

//связываем Файловую переменную fl с первым файломAssignFile(fI, from.Text);//связываем файловую переменную f2 со вторым файломAssignFile(f2, where.Text);Reset(fl); //открываем первый файл на чтениеsizez := Trunc(FileSize(f1)); //узнаем размер файла//Отображаем размер файл для пользователя}Label4.Caption := IntToStr(sizez div 1024) + 'Кб

1;

{Создаем второй файл или перезаписываем его, если онуже существует}

2* ~~~ " ~™~

Page 21: Delphi. Учимся на примерах

20 Работа с файлами

Листинг 2,1. Продолжение

Rewrite(f2);while not Eof(fl) dobegin //пока не достигнут конец первого файла

//считываем один байт с первого файлаBlockRead(fl, cop, 1);//записываем один байт во второй файлBlockWrite(f2, cop, 1);

end;

CloseFile(f1); //закрываем первый файлCloseFile(f2);// закрываем второй файл

finally;end;

if IOResult <> 0 //Если возникла ошибка ввода-выводаthen MessageDlg('Ошибка при копировании файла! ',

mtError, [mbOk],0) //сообщение об ошибкеelse begin

[если ошибок не было, то выводим окно об успешномокончании копирования}ShowMessage('Успешно скопировано!');

end;end;

procedure TForml.ButtonlClick(Sender: TObject);begin

doit;end;

procedure TForml.Button2Click(Sender: TObject);begin

if Openl.Execute then from.Text := Openl.FileName

else ShowMessage('Файл не был открыт');end;

procedure TForml.Button3Click(Sender: TObject);begin

if Savel.Execute then where.Text := Savel.FileNameelse

ShowMessage(''Вы не выбрали место для сохранения файла!1;

end;

procedure TForml.Button5Click(Sender: TObject);begin

doit;DeleteFile(from.Text); //удаляем исходный файл

end;

Page 22: Delphi. Учимся на примерах

Полный исходный код модуля 21

Листинг 2.1. Окончание

procedure TForml.Button4Click(Sender: TObject);begin

if Openl.Execute then del.Text := Openl.FileNameelse ShowMessage('Файл не был выбран

1);

end;

procedure TForml.Button6Click(Sender: TObject);begin

DeleteFile(del.Text); //удаляем файлif not FileExists(del.Text)

then //проверяем существование файла-//выводим сообщение об,успешном удаленииShowMessage('Файл удален!') ;

end;

end.

Все файлы проекта и исполняемый файл рассмотренной программы находятсяна прилагаемом к книге компакт-диске в папке C h a p t e r _ 0 2 .

Page 23: Delphi. Учимся на примерах

22 Работа с текстом. Статистика документа

Глава 3 ____

Работа с текстом. Статистикадокумента

Постановка задачиРазработать программу, которая выводит статистику выбранного

пользователем документа. Статистические данные включают в себя ко-личество слов, символов, пробелов и строк.

Разработка формыСоздадим новый проект Delphi и разработаем интерфейс програм-

мы. Измените значение свойства Caption главной формы на Стати-стика. Разместите на форме компонент Label категории Standard, иприсвойте его свойствам значения согласно табл. 3.1.

Таблица 3.1. Свойства компонента L a b e l , размещенного на форме Статистика

Свойство

Capt ion

Font .Color

Font.Name

F o n t . S i z e

F o n t . S t y l e

L e f t

Top

Значение

Статистика

clRed

Cour ier New

16

[ f s B o l d ]

128

8

Пояснение

Надпись метки

Цвет надписи — красный

Шрифт надписи

Размер шрифта надписи

Стиль шрифта — полужирный

Отступ слева

Отступ сверху

Ниже разместите компонент Edit категории Standard (поле ввода),в котором будет храниться путь к обрабатываемому файлу. Справа отнего разместим кнопку (компонент Button категории Standard), котораябудет открывать окно обзора для выбора файла. Присвойте свойствуB u t t o n l . C a p t i o n значение Обзор.

Для реализации выбора файла разместите на форме компонентOpenDialog категории Dialogs. Измените значение свойства Name этогокомпонента на Openl.

Page 24: Delphi. Учимся на примерах

Разработка формы 23

Разместите на форме четыре компонента Label и присвойте ихсвойству Caption значения Слов, Символов, Пробелов и Строк. Рас-положите эти метки одну над другой вдоль левого края формы и уста-новите свойства шрифта согласно табл. 3.2.

Таблица 3.2. Свойства шрифта компонентов L a b e l

Свойство

Font.Name

Font.S ize

F o n t . S t y l e

Значение

Cour ier New

12

[ f s B o l d ]

Пояснение

Шрифт надписи

Размер шрифта надписи

Стиль шрифта — полужирный

Разместите на форме справа от каждого предыдущих четырех метокеще четыре компонента Label и присвойте им имена (свойство Name)words, symbols, spaces и l i n e s . Присвойте значения свойствам этихметок согласно табл. 3.3.

Таблица 3.3. Свойства компонентов w o r d s , s y m b o l s , s p a c e s и l i n e s

Свойство

Caption

Font .Color

Font.Name

Font.S ize

F o n t . S t y l e

L e f t

Значение

0

clRed

Courier New

12

[fsBold]

112

Пояснение

Надпись метки

Цвет надписи — красный

Шрифт надписи

Размер шрифта надписи

Стиль шрифта — полужирный

Отступ слева

В првом нижнем углу формы разметим кнопку (компонент Button),по нажатию которой будут выполняться рассчеты и выводиться все дан-ные. Свойству Caption этой кнопки присвоим значение Статистика.На этом разработка формы завершена. Полученный результат долженпримерно соответствовать рис. 3.1.

I B Статистика

: Щ:Слов:

Символов:

• Пробелов:

Строк:

•' 0

: 0

: Р.

С т а т и с т и к а : . : : : : : : : : : : . : : • :

; ; 1 cAautoeKec.bat Обзор...

Статистика

Рис. 3.1. Форма Статистика

Page 25: Delphi. Учимся на примерах

24 Работа с текстом. Статистика документа

Разработка программного кодаВ этой программе следует обработать только два события: нажатие

кнопки Обзор и нажатие кнопки Статистика. Сначала — о кнопке Обзор:procedure TForml.ButtonlClick(Sender: TObject);begin

//начинаем обзор с текущей папкиOpenl.InitialDir := GetCurrentDir;

if Openl.Execute

then Editl.Text : = Openl.FileName //открываем диалоговое//окно выбора файла

else ShowMessage('Файл не выбран!');[end;

Начинаем обзор с каталога, в котором в данный момент находитсяпрограмма. Затем следует стандартная проверка: если файл не был вы-бран, то сообщаем об этом пользователю, иначе отображаем путь к фай-лу в поле E d i t l .

При нажатии кнопки Статистика выполняется подсчет и отображе-

jprocedure TForml.Button2Click(Sender: TObject);j var

f: file of byte; //Переменная для работы с файломstr: byte; //Содержит считанный байтoldstr, symbol, word, line, space: Integer; //Стат. данные

begin

symbol := 0; //обнуляем предыдущие результатыword := 0;

space := 0;

line := 0;if FileExists(Editl.Text) //проверяем, существует ли файлthen begin

AssignFile(f,Editl.Text); //связываем файл с переменной fReset (f) ; //открываем файл на чтениеwhile not Eof (f) dobegin //читаем файл до достижения конца файла

oldstr := str;

Read(f, str); //считываем символ в переменную strif ((str <> 32) and (str <> 13) and (str <> 10))

then symbol := symbol + 1; {пополняем количествосимволов, если он не является переводомстроки, кодом новой строки или пробелом}

//если считан пробел, пополним счетчик пробеловif str = 32 then space := space + 1;

if str = 13 then line := line + 1; //счетчик строкif ((str = 32) or (str = 13) or (str = 10)) then

Page 26: Delphi. Учимся на примерах

Полный исходный код модуля 25

if <(oldstr<>32) and (oldstrOlO) and (oldstr<>13) )then word := word + 1; //счетчик слов

end;

CloseFile(f); //закрываем файлend

else ShowMessage('Ошибка: Файл не найден!'); {если файл ненайден, то выводим сообщение об ошибке}

//Выводим всю полученную информацию о файлеsymbols.Caption :• IntToStr(symbol);spaces.Caption := IntToStr(space);lines.Caption := IntToStr(line);words.Caption := IntToStr (word) ;

end;

Сначала мы проверяем, существует ли файл, статистику которогобудем определять. Если все нормально, то начинаем считывать из этогофайла по одному символу и проверять по коду, что это за символ. Есликод символа равен 32, то это — пробел, и мы пополняем счетчик пробе-лов. Если код считанного символа равен 13, то это •— символ переводастроки, и мы пополняем счетчик строк. Если считанный символ не яв-ляется пробелом или символом перевода строки, то это - - обычныйсимвол и следует пополнить счетчик символов. Для того чтобы подсчи-тать количество слов, мы выполняем следующую проверку: если считанпробел или символ перевода строки, то проверяем, является ли преды-дущий символ пробелом или символом перевода строки, и если это так,пополняем счетчик слов.

Результат выполнения программы представлен на рис. 3.2.

Статистика

СтатистикаСлов: 161

Символов: 1317

Пробелов: 173

Строк: 79

DADocsVrexl\Delphi\Unit1.pa

Статистика

Рис. 3.2. Программа Статистика в действии

Полный исходный код модуляКод модуля программы Статистика представлен в листинге 3.1.

Page 27: Delphi. Учимся на примерах

26 Работа с текстом. Статистика документа

Листинг 3.1. Модуль программы СтатистикаГ unit Unitl;

interface

usesWindows, Messages, SysUtils, Variants, Classes, Graphics,Controls, Forms, Dialogs, StdCtrls;

typeTForml -

LabellLabei2

Label3Label4

Label5words:

class(TFormTLabel;TLabel;TLabel;

TLabel;TLabel;

TLabel;

spaces

symbols: TLabel;

TLabel;lines: TLabel;Buttonl: TButton;Editl: TEdit;Button2: TButton;Openl: TOpenDialog;procedure ButtonlClick(Sender: TObject);procedure Button2Click(Sender: TObject);

private

{ Private declarations }public

{ Public .declarations }end;

var Forml: TForml;

[ implementation

{$R *.dfm}

procedure TForml.ButtonlClick(Sender: TObject);begin

//начинаем обзор с текущей папкиOpenl.InitialDir := GetCurrentDir;if Openl.Execute // открываем диалоговое окно выбора файла

then Editl.Text := Openl.FileNameelse ShowMessage('Файл не выбран!');

end;

Page 28: Delphi. Учимся на примерах

Полный исходный код модуля 27

Листинг 3.1. Окончание

procedure TForml.Button2Click(Sender: TObject);var

f: file of byte; //Переменная для работы с файломstr: byte; //Содержит считанный байтoldstr, symbol, word, line, space: Integer;

beginsymbol := 0; //обнуляем предыдущие результатыword := 0;space := 0;line := 0;if FileExists(Editl.Text) //проверяем, существует ли файлthen beginAssignFile(f,Editl.Text); //связываем файл с переменной fReset (f); //открываем файл на чтениеwhile not Eof(f) dobegin //читаем файл до достижения конца файла

oldstr := str;Read(f, str); //считываем символ в переменную strif ((str <> 32) and (str о 13) and (str <> 10))

then symbol := symbol + 1; (пополняем количествосимволов, если он не является переводомстроки, кодом новой строки или пробелом}

//если считан пробел, пополним счетчик пробеловif str = 32 then space := space + 1;if str = 13 then line := line + 1; //счетчик строкif ((str = 32) or (str = 13) or (str = 10)) then

if ((oldstr<>32) and (oldstrOlO) and (oldstr<>13))then word := word + 1; //счетчик слов

end;CloseFile(f); //закрываем файл

endelse ShowMessage('Ошибка: Файл не найден!'); {если файл не

найден, то выводим сообщение об ошибке}symbols.Caption := IntToStr(symbol); //Выводим всюspaces.Caption := IntToStr(space); //полученнуюlines.Caption := IntToStr(line); //информацию о файлеwords.Caption := IntToStr(word);

end;

end.

Все файлы проекта и исполняемый файл рассмотренной программы находятсяна прилагаемом к книге компакт-диске в папке C h a p t e r _ 0 3 .

Page 29: Delphi. Учимся на примерах

28 Снимок экрана

Глава 4

Снимок экрана

Постановка задачиРазработать программу, которая будет снимать и сохранять копию

экрана.

Разработка формыСоздайте новый проект Delphi и измените заголовок формы (свой-

ство Caption) на Screenshot. Чтобы пользователь не мог изменятьразмеры окна при работе с программой, следует присвоить свойствуBorderStyle значение bsDialog. Для удобства создания копий экранаокно программы должно быть всегда размещено поверх остальныхокон. Для этого присвоим свойству FormStyle значение f sStayOnTop.Мы можем себе это позволить: на самой копии экрана окно нашей про-граммы отображено не будет, поскольку в момент создания копии онобудет временно сокрыто.

Для сохранения копии экрана нам понадобится компонентSaveDialog категории Dialogs. Разместите этот компонент на форме.Поскольку мы заранее знаем, что будем сохранять рисунок, то свойствуSaveDialogl . F i l t e r присвойте значение Рисунок | * . bmp | Все фай-лы! * .*. При сохранении файла у пользователя будет выбор: сохранятьфайл как рисунок (.* . bmp) или как любой другой файл (***).

Разместите вдоль правого края формы четыре кнопки (компонентыButton категории Standard) со следующими заголовками (свойствоCaption): Сделать снимок экрана, Показать снимок, Очистить иСохранить. Также нам потребуется компонент, который будет отобра-жать полученную копию экрана. Для этих целей мы будем использоватькомпонент Image категории Additional. Измените его имя (свойствоName) на Screenl , а свойству P r o p o r t i o n a l присвоим значение True.

На этом разработка формы завершена. Полученный результат дол-жен примерно соответствовать рис. 4.1.

Page 30: Delphi. Учимся на примерах

Разработка программного кода 29

• ScreenShot*

Показать снимок

Очистить

СохранитьJ

Рис. 4.1. Форма для создания копий экрана

Разработка программного кодаДля начала объявим все переменные, которыми будем пользоваться

в nE°£P?Mi^£L_ _____ _гагForml: TForml; //главная формаВМР1: Graphics.TBitmap; //для работы с рисунками (*.bmp)DC1: HDC; //простое поле для графикиImagel: TImage;

Самое главное событие в программе это нажатие кнопки Сделать

procedure TForml.ButtonlClick(Sender: TObject);beginForml.Visible := False; //прячем формуSleep(15); //пауза 15 мсBMP1 := Graphics.TBitmap.Create;//задаем размеры рисунка такие же как размеры экранаВМР1.Height := Screen.Height;ВМР1.Width := Screen.Width;DC1 := GetDC(O);

//Делаем копию экранаBitBlt(BMPl.Canvas.Handle, 0, 0, Screen.Width,

Screen.Height, DC1, 0, 0, SRCCOPY);

Forml.Visible := True; //восстанавливаем окно программыImagel := TImage.Create(nil);BMP1.IgnorePalette := True;

Imagel.Picture.Assign(BMP1);

Page 31: Delphi. Учимся на примерах

30 Снимок экрана

ВМР1.SaveToFile('с:\1.bmp1); //сохраняем снимок в файл

//l.bmp на диске С:\

end;

Перед тем как сделать снимок экрана, мы прячем окно программы,делаем паузу в 15 мс и задаем размеры будущего рисунка. После этогоделаем снимок экрана и сохраняем его в файл 1. bmp, который находит-ся на диске С: \.

^ к о д :

procedure TForml.Button4Click(Sender: TObject);begin

Screenl.Show; // делаем рисунок видимымif FileExists('с:\1.bmp

1) then //если рисунок существует,

Screenl.Picture.LoadFromFile('c:\1.bmp'); //загружаем егоend;

По нажатию кнопки Очистить мы должны скрывать рисунок и уда-лять его с диска:procedure TForml.Button3Click(Sender: TObject);begin

//удаляем рисунок с дискаif FileExists('с:\1.bmp

1) then DeleteFile('С:\1.bmp');

Screenl.Hide; //скрываем рисунокend;

Для сохранения рисунка будем использовать диалоговое окно. Код

нажатия кнопки Сохранить:

procedure TForml.Button2Click(Sender: TObject);begin

if SaveDialogl.Execute then

BMP1.SaveToFile(SaveDialogl.FileName) //сохраняем рисунокelse ShowMessage('Файл не был сохранен!

1);

end;

Здесь мы проверяем, выбрал ли пользователь место сохраненияфайла. Если да, то сохраняем рисунок по указанному расположению.

Откомпилируем и запустим программу на выполнение (резуль-тат — на рис. 4.2).

Полный исходный код модуляПолный исходный код модуля программы ScreenShot представлен

в листинге 4.1.

Page 32: Delphi. Учимся на примерах

Полный исходный код модуля 31

Э5ЭЗВЗЯИ

ИГ— ^•

xj

Сделать снимок экрана

Показать снимок

Очистить

Сохранить

Рис. 4.2. Программа ScreenShot в действии

Листинг 4.1. Модуль программы ScreenShot

unit Unitl;

interface

usesWindows, Messages, SysUtils, Variants, Classes, Graphics,Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Registry,WinProcs, jpeg;

typeTForml = class(TForm)

Buttonl: TButton;Button2: TButton;Screenl: TImage;SaveDialogl: TSaveDialog;Button3: TButton;Button4: TButton;procedure ButtonlClick(Sender:procedure Button2Click(Sender:procedure Button3Click(Sender:procedure Button4Click(Sender:

private{ Private declarations }

public{ Public declarations }

end;

var

TObject);TObject);TObject);TObject);

Page 33: Delphi. Учимся на примерах

32 Снимок экрана

Листинг 4.1. Продолжение

Forml: TForml; //главная формаВМР1: Graphics.TBitmap; //для работы с рисунками (*.bmp)DC1: HDC; //простое поле для графики

Imagel:. TImage;

implementation

{$R *.dfm}

procedure TForml.ButtonlClick(Sender: TObject);begin

Forml.Visible : = False; //прячем формуSleep(15);//пауза 15 мсBMP1 := Graphics.TBitmap.Create;//задаем размеры рисунка такие же как размеры экранаВМР1.Height := Screen.Height;ВМР1.Width := Screen.Width;DCl:=GetDC(O);//Делаем снимок экранаBitBlt(BMP1.Canvas.Handle,

Screen.Height, DC1,0, 0, Screen.Width,

0, 0, SRCCOPY);Forml.Visible := True; //восстанавливаем окно программыImagel := TImage.Create(nil) ;BMP1.IgnorePalette := True;Imagel.Picture.Assign(BMP1) ;BMP1.SaveToFile('с:\1.bmp'); //сохраняем снимок в файл

//l.bmp на диске С:\end;

procedure TForml.Button2Click(Sender: TObject);begin

if SaveDialogl.Execute thenBMP1.SaveToFile(SaveDialogl.FileName) //сохраняем рисунок

else ShowMessage('Файл не был сохранен!');end;

procedure TForml.Button3Click(Sender: TObject);begin

//удаляем рисунок с дискаif FileExists('с:M.bmp') then DeleteFile('С:\1.bmp');

Screenl.Hide; //скрываем рисунокend;

procedure TForml.Button4Click(Sender: TObject);begin

Page 34: Delphi. Учимся на примерах

Полный исходный код модуля 33

Листинг 4.1. Окончание

Screenl.Show; // делаем рисунок видимымif FileExists('с:\1.bmp') then //если рисунок существует,

Screenl.Picture.LoadFromFile('с:\1.bmp');//загружаем егоend;

end.

Все файлы проекта и исполняемый файл рассмотренной программы находятсяна прилагаемом к книге компакт-диске в папке C h a p t e r 04.

3 — 5-1212

Page 35: Delphi. Учимся на примерах

34 Хранитель экрана

Глава 5

Хранитель экрана

Постановка задачиРазработать хранитель экрана для Windows (файл с расширением

*-. scr). Форма масштабируется на весь экран, заголовок скрывается,а любые действия пользователя должны прекращать работу программы.Случайным образом выбирается цвет формы, затем происходит ее плав-ное насыщение случайно выбранным цветом. Первоначально формаполностью прозрачная. Когда она станет полностью непрозрачной, сле-дует медленно убирать насыщенность цвета, пока она опять не станетпрозрачной. После этого вновь выбирается случайный цвет для насы-щения, и описанный процесс повторяется сначала.

Разработка формы

Создадим новый проект Delphi. Как известно, экранные заставкихранятся в файлах с расширением . scr, а по умолчанию проект Delphiкомпилируется как выполняемый файл . ехе. Для того чтобы наша про-грамма имела расширение . scr, выполним команду меню Project —> Op-tions, на вкладке Application диалогового окна Project Options введемв поле Target file extension значение scr (рис. 5.1) и нажмем кнопку ОК.

Все что нам понадобится на форме, — это два компонента Timerкатегории System. Первый будет служить для реализации постепенногонасыщения формы цветом — для этого таймера следует изменить зна-чение свойства I n t e r v a l на 100. Второй таймер потребуется при по-степенном уменьшении насыщенности цвета вплоть до того момента,когда форма вновь станет полностью прозрачной. Для этого таймерасвойству i n t e r v a l следует также присвоить значение 100, а значениесвойства Enabled изменить на False, поскольку изначально "затуха-ния" происходить не будет.

Page 36: Delphi. Учимся на примерах

Разработка формы 35

Project Options

Directories/Conditionals : Version Info PackagesForms Application Compiler j Linker

Application settings

litle: f

Help file: Г

[con: j ш^.

r̂owse...

Load Icon... j

' Output settings — "T arget file extension: I scr

Г JDefai! OK Cancel Help

Рис. 5.1. Выбор расширения для откомпилированной программы

Изменим свойства формы согласно табл. 5.1.

Таблица 5.1. Свойства формы хранителя экрана

Свойство

B o r d e r S t y l e

A l i g n

F o r r u S t y l e

A l p h a B l e n d

A l p h a B l e n d V a l u e

Значение

bsNone

a l C l i e n t

f s S t a y O n T o p

T r u e

1

Пояснение

Окно программы будет отображаться

без границы и заголовка

Окно программы будет заполнять весь

экран

Окно программы будет располагаться

поверх всех остальных окон

Разрешаем изменение степени про-

зрачности формы

Изначально окно программы полно-

стью непрозрачное

Page 37: Delphi. Учимся на примерах

36 Хранитель экрана

Разработка программного кодаОбъявите в разделе var переменную mouse типа TPoint. В этой

переменой будут храниться координаты указателя мыши, при измене-ниикоторых программа должна закрываться:

varForml: TForml;mouse: TPoint;

Программа экранной заставки должна закрываться не только подвижению мыши, но при любой активности пользователя. Для этогосоздадим обработчики некоторых событий главной формы. Созданиеформы (событие OnCreate):

procedure TForml.FormCreate(Sender: TObject);begin

GetCursorPos(mouse); //сохраняем координаты курсора мышиShowCursor(False); //прячем курсор

end;

Форма должна закрываться по нажатию любой клавиши (событиеOnKeyPress) и при движении мышью (событие OnMouseMove). Код об-работчика события OnKeyPress:procedure TForml.FormKeyPress(Sender: TObject; var Key:Char);begin

Halt; //завершение работы программыend;

Для события OnMouseMove программный код будет несколькоиным:procedure

beginif (X О

end;

TForml

mouse

.FormMouseMoveShift

(Sender: TObject;: TShiftState; X, Y:

.X) or (У О mouse.Y) then Halt;

Integer);

Здесь сначала выполняется проверка: были ли изменены координа-ты курсора. Если координаты курсора изменились, то, соответственно,мышь была сдвинута и следует закрыть программу.

Напишем собственную процедуру для выбора случайного цвета:color_check. Объявите ее как закрытый член класса формы:

Page 38: Delphi. Учимся на примерах

Разработка программного кода 37

typeTForml class(TForm)

private{ Private declarations }procedure color_check();

public{ Public declarations }

end;

В разделе implementation создадим реализацию процедурыcolor check:procedure TForml.colorvar

ran:

begin

check();

integer; //случайное число, соответствующее//определенному цвету

Randomize; //включаем генератор случайных чиселran := random(6) + 1 ; //выбираем случайное число от 1 до 6

//назначаем форме цвет, соответствующий выбранному числу

case1:2:

3:

4:

5:6:

end;

end;

ran ofForml.Color : =

Forml.Color :=

Forml.Color :=

Forml.Color :=

Forml.Color :=

Forml.Color :=

clBlack;

clWhite;clBlue;

clGray;

clYellow;

clGreen;

Здесь случайным образом выбирается число от 1 до 6, в зависимо-сти от того которого определяем цвет формы. Процедура c o l o r c h e c kбудет вызываться при каждом новом насыщении формы.

Обработчик события OnTimer первого таймера должен иметь сле-дующий вид:procedure TForml.TimerlTimer(Sender: TObject);begin

if Forml.AlphaBlendValue > 250then {проверяем: не полностью ли мы закрасили форму}begin

Timerl.Enabled := False; //выключаем насыщение формыTimer2.Enabled := True; //включаем обратный процесс

end;

//постепенное насыщение формыForml.AlphaBlendValue := Forml.AlphaBlendValue + 1;

end;

Page 39: Delphi. Учимся на примерах

38 Хранитель экрана

Насыщенность постепенно увеличивается на 1, и выполняется про-верка: не стала ли форма уже полностью закрашенной выбранным цве-том. Если нет, то продолжаем увеличивать насыщенность цвета черезкаждые 100 мс. Когда форма будет полностью насыщенной, начинаемобратный процесс, который будет происходить под управлением второ-го таймера (событие Time г 2 . OnTimer): ___procedure TForml.Timer2Timer(Sender: TObject);begin

if Forml.AlphaBlendValue < 5then //если форма уже полностью прозрачнаяbegin

color_check(); //выбираем случайный цвет для формыTimer2.Enabled := False; //выключаем второй таймерTimerl.Enabled := True; //включаем первый таймер

end;

//Уменьшаем прозрачность на 1Forml.AlphaBlendValue := Forml.AlphaBlendValue - 1;

Здесь через каждые 100 мс прозрачность формы уменьшается на 1.Когда форма становится полностью прозрачной, мы случайным образомвыбираем другой цвет, выключаем таймер, по которому происходитуменьшение насыщенности цвета, и включаем первый таймер, которыйплавно увеличивает насыщенность цвета.

Теперь программу можно откомпилировать, скопировать файл . scrв папку с хранителями экрана (для Windows ХР это папка Win-dows \System32), открыть окно параметров Рабочего стола и выбратьхранитель экрана, соответствующий нашей программе.

Разработанный нами хранитель экрана в действии показан нарис. 5.2. В данном случае был случайным образом выбран желтый цветзаполнения и происходит медленное насыщение этим цветом. Можноразглядеть папки, которые видны сквозь полупрозрачную форму.

Полный исходный код модуляПолный исходный код модуля программы Хранитель экрана пред-

ставлен в листинге 5.1.

Page 40: Delphi. Учимся на примерах

Полный исходный код модуля 39

Рис. 5.2. Хранитель экрана в действии

Листинг 5.1. Модуль программы Хранитель экрана

unit Unitl;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics,Controls, Forms, Dialogs, ExtCtrls;

typeTForml = class(TForm)

Timerl: TTimer;Timer2: TTimer;procedure FormCreate(Sender: TObject);procedure FormKeyPress(Sender: TObject; var Key: Char);procedure FormMouseMove(Sender: TObject;

Shift: TShiftState; X, Y: Integer)procedure TimerlTimer(Sender: TObject);procedure Timer2Timer(Sender: TObject);

Page 41: Delphi. Учимся на примерах

40 Хранитель экрана

Листинг 5.1. Продолжение

private{ Private declarations }procedure color_check();

publicf Public declarations }

end;

varForml: TForml;mouse: TPoint;

implementation

{$R *.dfm)

procedure TForml.color_check(} ;var

ran: integer; //случайное число, соответствующее//определенному цвету

beginRandomize; //включаем генератор случайных чиселran : = Random(6) + 1; //выбираем случайное число от 1 до б//Назначаем форме цвет, соответствующий выбранному числуcase ran of

1: Forml.Color2: Forml.Color3: Forml.Color4: Forml.Color5: Forml.Color6: Forml.Color

clBlack;clWhite;clBlue;dGray;clYellow;clGreen;

end;end;

procedure TForml.FormCreate(Sender: TObject);begin

GetCursorPos(mouse); //получаем координаты курсора мышиShowCursor(False); //прячем курсор

end;

procedure TForml.FormKeyPress(Sender: TObject; var Key:Char)begin

Halt; //завершение работы программыend;

Page 42: Delphi. Учимся на примерах

Полный исходный код модуля 41

Листинг 5.1. Окончание

procedure TForml.FormMouseMove(Sender: TObject;Shift: TShiftState; X, Y: Integer);

beginif (X <> mouse.X) or (Y <> mouse.Y) then Halt;

end;

procedure TForml.TimerlTiraer(Sender: TObject);begin

if Forml.AlphaBlendValue > 250then //проверяем: не полностью ли мы закрасили формуbegin

TimerI.Enabled := False; //выключаем насыщение формыTimer2.Enabled := True; //включаем обратный процесс

end;//постепенное насыщение формыForml.AlphaBlendValue := Forml.AlphaBlendValue + 1;

end;

procedure TForml.Timer2Timer(Sender: TObject);begin

if Forml.AlphaBlendValue < 5then //если форма уже полностью прозрачнаяbegin

color_check(); //выбираем случайный цвет для формыTimer2.Enabled := False; //выключаем второй таймерTimerI.Enabled := True; //включаем первый таймер

end;

//Уменьшаем прозрачность на 1Forml.AlphaBlendValue := Forml.AlphaBlendValue - 1;

end;

end.

Все файлы проекта и исполняемый файл рассмотренной программы находятсяна прилагаемом к книге компакт-диске в папке C h a p t e r 05.

Page 43: Delphi. Учимся на примерах

42 Программа просмотра рисунков

Глава 6

Программа просмотра рисунков

Постановка задачиРазработать программу для просмотра рисунков. Программа долж-

на отображать рисунок, загруженный с помощью стандартного диалого-вого окна обзора. Кроме того, любой рисунок должен быть связан сданной программой и открываться ею по двойному щелчку мышью илинажатию клавиши <Enter> в Проводнике или любом другом файл-менеджере.

Разработка формыСоздайте новый проект Delphi. Разместите на форме компонент Im-

age категории Additional, который будет служить для отображения ри-сунка. Для того чтобы при любых размерах окна рисунок всегда запол-нял всю форму, следует изменить значение свойства Align на a l C l i -ent.

Для вызова диалоговых окон открытия и сохранения рисунка вос-пользуемся компонентами OpenDialog и SaveDialog категории Dia-logs. Присвоим свойству Name этих компонентов значения Openl иSavel соответственно. Для обоих компонентов присвойте свойствуF i l t e r значение Все файлы|*.*.

Для доступа к функциям программы будем использовать командыменю. Разместите на форме компонент MainMenu категории Standard.Для того чтобы создать пункты меню, следует дважды щелкнуть мы-шью на компоненте MainMenul, в результате чего откроется редакторменю, изображенный на рис. 6.1.

Для того чтобы добавить новый пункт, следует щелкнуть мышьюв этом окне на пустом элементе меню и изменить в инспекторе объектовзначение свойства Caption. Вначале создаются пункты меню, а затеманалогичным образом — подпункты (команды). Для создания раздели-телей свойству Caption следует присвоить значение - (дефис).

Page 44: Delphi. Учимся на примерах

Разработка формы 43

Irrl Forml.MainMenul

Рис. 6.1. Редактор меню

Создайте меню, соответствующее рис. 6.2.

Файл Правка

Открыть

Сохранить

Выход

Файл Правка ;

Очистить

Рис. 6.2. Меню для программы просмотра рисунков

Вид готовой формы представлен на рис. 6.3.

• : • • : _ _ : _ _ : • • ; • • : • ' : „ • • : • ' : _ : J

Рис. 6.3. Форма программы просмотра рисунков

Page 45: Delphi. Учимся на примерах

44 Программа просмотра рисунков

Разработка программного кодаТеперь создадим обработчики события OnClick для пунктов меню.

Для команды Файл -> Открыть: 'I procedure TForml.N2Click(Sender: TObject);begin

//начинаем обзор с текущей папкиOpenl.InitialDir := GetCurrentDir;//открываем диалоговое окно выбора файлаif Openl.Execute then begin

//загружаем выбранный рисунокImagel.Picture.LoadFromFile(Openl.FileName);Imagel.Show; //отображаем рисунок на форме

endelse //Если рисунок не был выбран

ShowMessage('Вы не выбрали рисунок!');Imagel.Show;

end;

Здесь мы просто открываем диалоговое окно выбора рисунка, и, ес-ли пользователь выбрал рисунок, то загружаем его в компонент Imagelи отображаем на форме.

procedure TForml.N3Click(Sender: TObject);begin

if Savel.Execute then //сохранение рисункаImagel.Picture.SaveToFile(Savel.FileName)

else ShowMessage('Рисунок не был сохранен!');

end;

Здесь мы открываем диалоговое окно сохранения рисунка, и, еслипользователь выбрал место сохранения файла, извлекаем этот путь(свойство Savel . FileName) и сохраняем отображаемый в данный мо-мент рисунок.

procedure TForml.N5Click(Sender: TObject);begin

Halt; //завершение работы программыend;

_ _ 9JEE!E2Ji!iISi5£^l!i Q" С Иск для пункта меню Правка —> Очистить:'"procedure TForml.N7Click(Sender: TObject);begin

Imagel.Hide; //прячем рисунокend;

Page 46: Delphi. Учимся на примерах

Разработка программного кода 45

Единственное, чего не достает этой программе, — это возможностьоткрывать с ее помощью рисунки в файл-менеджерах. Реализуем этувозможность, добавив следующий код в обработчик события OnCreateглавной фoJElJ!l!di___-_procedure TForml.FormCreate(Sender: TObject);var

Str:String; //путь к файлу, который поступил как параметрi:Integer;

beginif (ParamCount > 0)then //если на вход программы поступил параметрbegin

//составляем путь к файлу по символамStr := ParamStr(l);for i:=2 to ParamCount do

Str := Str + ' ' + ParamStr(i);

Imagel.Picture.LoadFromFile(str); //загружаем рисунокImagel.Show; //показываем рисунок

end;end;

При создании формы выполняется проверка: запускается ли про-грамма с параметрами. Если на вход поступили параметры, то опреде-ляем путь к рисунку и отображаем его на форме. Программа просмотрарисунков в действии представлена на рис. 6.4.

Рис. 6.4. Программа просмотра рисунков в действии

Page 47: Delphi. Учимся на примерах

46 Программа просмотра рисунков

Полный исходный код модуляПолный исходный код модуля программы просмотра рисунков

представлен в листинге 6.1.

Листинг 6.1. Модуль программы просмотра рисунков

ГипТГ Uniti;

i interface

usesWindows, Messages, SysUtils, Variants, Classes, Graphics,Controls, Forms, Dialogs, Menus, ExtCtrls;

typeTForml = class(TForm)

Imagel: TImage;MainMenul: TMainMenu;N1: TMenuItem;N2: TMenuItem;N3: TMenuItem;N4: TMenuItem;N5: TMenuItem;N6: TMenuItem;N7: TMenuItem;Openl: TOpenDialog;Savel: TSaveDialog;procedure FormCreate(Sender: TObject);procedure N2Click(Sender: TObject);procedure N3Click(Sender: TObject);procedure N5Click(Sender: TObject);procedure N7Click(Sender: TObject);

private{ Private declarations }

public{ Public declarations }

end;

var

Forml: TForml;

implementation

{$R *.dfm}

Page 48: Delphi. Учимся на примерах

Полный исходный код модуля 47

Листинг 6.1. Продолжение

procedure TForml.FormCreate(Sender: TObject);var

Str: String; //путь к файлу, который поступил как параметрi:Integer;

beginif (ParamCount > 0)then //если на вход программы поступил параметрbegin

//составляем путь к файлу по символамStr := ParamStr(1);for i:=2 to ParamCount doStr := Str +'.*•+ ParamStr(i);

end;Imagel.Picture.LoadFromFile(str); //загружаем рисунокImage1.Show; //показываем рисунок

end;end;

procedure TForml.N2Click(Sender: TObject);begin

//начинаем обзор с текущей папкиOpenl.InitialDir := GetCurrentDir ;//открываем диалоговое окно выбора файлаif Openl.Execute thenbegin

//загружаем выбранный рисунокImagel.Picture.LoadFromFile(Openl.FileName);Imagel.Show; //показываем рисунок на форме

endelse //Если рисунок не был выбран

ShowMessage('Вы не выбрали рисунок!');Imagel.Show;

end;

procedure TForml.N3Click(Sender: TObject);begin

if Savel.Execute then //сохранение- рисункаImagel.Picture.SaveToFile(Savel.FileName)

else ShowMessage('Рисунок не был сохранен!');end;

procedure TForml.N5Click(Sender: TObject);begin

Halt; //выход из программы

I end;

_ _ _ _ _ _ _

Page 49: Delphi. Учимся на примерах

48 Программа просмотра рисунков

Листинг 6.1. Окончание

L

procedure TForml.N7Click(Sender: TObject);begin

Image1.Hide; //прячем рисунокend;

end.

Все файлы проекта и исполняемый файл рассмотренной программы находятсяна прилагаемом к книге компакт-диске в папке C h a p t e r _ 0 6.

Page 50: Delphi. Учимся на примерах

Постановка задачи 49

Глава 7

Блокнот-шифровальщик

Постановка задачиРазработать программу, повторяющую функции стандартного

блокнота с дополнительной возможностью шифрования и дешифрова-ния данных.

Разработка формыСоздадим новый проект Delphi. Интерфейс программы сделаем по-

хожим на интерфейс стандартного блокнота. Разместите на форме ком-понент Memo (многострочное текстовое поле) категории Standard. Длятого чтобы при любых размерах окна этот компонент заполнял всюформу, измените значение свойства Memol.Al-ign на a l C l i e n t . Длятекстового поля должна отображаться только вертикальная полоса про-крутки (то есть, будет выполняться автоматический перенос слов но но-вую строку). Для этого следует изменить значение свойства S c r o l l -Bars на s s V e r t i c a l .

Разместите на форме компонент MainMenu категории Standard исоздайте меню, представленное на рис. 7.1.

Файл Правка Формат |

Открыть

Сохранить

Закрыть

ншавш;Файл Правка Формат ;...,..

Число XOR

Зашифровать/РасшифроватОчистить

Файл Праака Формат

*/ Перенос по словам

Шрифт

Рис. 7.1. Меню программы Блокнот-шифровальщик

Разработка меню рассматривается в предыдущей главе.

Для пункта меню Формат —> Перенос по словам следует установитьсвойство Checked равным True, поскольку этот пункт меню будет вы-полнять роль переключателя.

4 — 5-1212

Page 51: Delphi. Учимся на примерах

50 Блокнот-шифровальщик

Для вызова диалогового окна открытия файла будем использоватькомпонент OpenDialog категории Dialogs, а для сохранения файла —компонент SaveDialog той же категории. Для обоих компонентов из-мените значение свойства F i l t e r на Блокнот | * . t x t | Все файлы | * . *.Также разместите на форме еще один компонент категории Dialogs:Font Dialog. Он будет служить для изменения шрифта.

Больше ничего добавлять на форму не нужно, и результат оформле-ния должен соответствовать рис. 7.2.

Рис. 7.2. Форма блокнота-шифровальщика

Разработка программного кодаШифровать текст будем с помощью функции хог или обычного

смещения. Для того чтобы зашифрованные тексты нельзя было рас-шифровывать по шаблону, будем предлагать пользователю самому вы-бирать число хог, на которое надо смещать символ.

Прежде всего объявите глобальную переменную xr_num типаstring:

varForml: TForml;xr_num: s tring;

Page 52: Delphi. Учимся на примерах

Разработка программного кода 51

Теперь займемся командами меню. Обработчик события OnClickдля пункта Файл —> Открыть:procedure TForml.NIClick(Sender: TObject);begin

//начинаем обзор с текущей папкиOpenDialogl.InitialDir := GetCurrentDir;if not OpenDialogl.Executethen ShowMessage('File not selected!')else //загружаем выбранный файл в MemoMemol.Lines.LoadFromFile(OpenDialogl.FileName);

end;

Здесь мы открываем стандартное диалоговое окно обзора и просимпользователя выбрать текстовый или любой другой файл. После тогокак пользователь выбрал файл, загружаем его в нашу программу.

Обработчик события OnClick для пункта Файл —> Сохранить:procedure TForml.N2Click(Sender: TObject);begin

Savedialogl.InitialDir := GetCurrentDir;if not SaveDialogl.Executethen ShowMessage('File not saved!

1)

else //сохраняем в файл

Memol.Lines.SaveToFile(SaveDialogl.FileName);

end;

Открываем диалоговое окно сохранения файла. После того какпользователь выбрал место сохранения файла, извлекаем текст из Memoи сохраняем его в выбранной папке.

Обработчик события OnClick для пункта Файл —> Выход:procedure TForml.N4Click(Sender: TObject);begin

Close; //закрыть программуend;

Обработчик события OnClick для пункта Правка -> Число XOR:procedure TForml.XoRlClick(Sender: TObject);begin

if not InputQuery('XOR', 'Введите число xor:', xr_num)

then Exit;

end;

Здесь мы отображает окно для выбора числа хог. Указанное пользо-вателем число будет занесено в переменную xr_num.

Обработчик события OnClick для пункта Правка -» Зашифро-вать/Расшифровать:

4*

Page 53: Delphi. Учимся на примерах

52 Блокнот-шифровальщик

[procedure TForml.N5Click(Sender: TObject);j var

xr: string; //зашифрованный текстi: integer; //счетчик цикла

1 beginfor i:=1 to Length(Memol.Text) dobegin //перебираем каждый символ в тексте

//выполняем указанное пользователем смещениеxr := xr + Chr(Ord(Memol.Text[i]) xor StrToInt(xr_num));

end;

//заменяем оригинальный текст на зашифрованныйMemol.Text := xr;

end;

По этой команде меню выполняется шифрование текста, которыйсейчас находится в поле Memo. В цикле перебираются все символы, икаждый из них шифруется отдельно.

Обработчик события OnClick для пункта Правка —* Очистить:procedure TForml.N8Click(Sender: TObject);begin

Memol.lines.Clear; //очистка Memo

end;

Очищаем поле Memo от содержащегося в нем текста.Обработчик события OnClick для пункта Формат -» Перенос по

словам: _____[procedure TForml.N9Click(Sender: TObject);

begini f N9.Checked then //если флажок установленbegin• N9.Checked := False; //сбрасываем флажок

//Отображаем горизонтальную полосу прокруткиMemol.ScrollBars := ssBoth;

endelse begin //если флажок не установлен

N9.Checked := True; //устанавливаем флажок//убираем горизонтальную полосу прокруткиMemol.ScrollBars := ssVertical;

end;end;

По этой команде меню мы проверяем, какое состояние сейчас упункта Формат -» Перенос по словам. Если флажок установлен, то мысбрасываем его и отображаем горизонтальную полосу прокрутки. Впротивном случае, устанавливаем флажок и убираем горизонтальнуюполосу прокрутки.

Page 54: Delphi. Учимся на примерах

Разработка программного кода 53

procedure TForml.NIOClick(Sender: TObject);begin

//Определяем все настройки шрифта и отображаем их//в диалоговом окнеFontDialogl.Font.Color := Memol.Font.Color; //цвет шрифтаFontDialogl.Font.Style := Memol.Font.Style; //стильFontDialogl.Font.Size := Memol.Font.Size; //размерFontDialogl.Font.Charset := Memol.Font.Charset; //кодировкаFontDialogl.Font.Name := Memol.Font.Name; //название шрифтаif FontDialogl.Execute thenbegin //применяем все выбранные настройкиMemol.Font.Color := FontDialogl.Font.Color;Memol.Font.Style := FontDialogl.Font.Style;Memol.Font.Size := FontDialogl.Font.Size;

Memol.Font.Charset := FontDialogl.Font.Charset;:Memol.Font.Name := FontDialogl.Font.Name;

end;end;

Перед тем как открыть диалоговое окно выбора шрифта, мы опре-деляем все текущие настройки шрифта, чтобы затем отобразить их вдиалоговом окне. После того как пользователь нажал в этом окне кноп-ку ОК, все выбранные настройки шрифта применяются к полю Memo.

Теперь осталось только реализовать автоматическую загрузку фай-лов, связанных с нашим блокнотом в файл-менеджерах. Для этого соз-дадим обработчик события OnCreate главной формы:procedure TForml.FormCreate(Sender: TObject);var

Str: String; //путь к параметруi: Integer;

beginxr num := '2'; //по умолчанию смещение « 2if (ParamCount > 0) thenbegin

Str := ParamStr(l);//Формируем путь к аргументуfor i:=2 to ParamCount do Str := Str +•__*.+ ParamStr(i) ;

end;{Если на вход программы поступили параметры, то отображаем

содержимое соответствующего файла в поле Memo }if Str О " then Memol.Lines.LoadFromFile(str);

end;

Здесь мы задаем начальное значение для смещения и проверяем,поступили ли на вход программы какие-либо параметры. Если да, то уз-

Page 55: Delphi. Учимся на примерах

54 Блокнот-шифровальщик

наем путь к файлу и отображаем его содержимое в поле Memo. Примершифрования со смещением 10 представлен на рис. 7.3.

Файл Правка Формат

* (Длъкньдисг*еъвлдъЬ*исед6зхфувг*едипъащ*оъ1цйдйд*е1ьЕл [

дък*одбмпэ*лсшц*ед*аъкгэпг*жпъп*эк*шъв*абкыык*шдээдыш

вС

Рис. 7.3. Пример шифрования со смещением 10

Полный исходный код модуляПолный исходный код модуля программы Блокнот-шифровальщик

представлен в листинге 7.1.

Листинг 7.1. Модуль программы Блокнот-шифровальщик

unit Unitl

interface

uses

Windows,

Controls

typeTForml =

Memol:

menul:

Filel:

Editl:

Messages, SysUtils, Variants, Classes, Graphics,

Forms, Dialogs, StdCtrls, Menus;

class(TForm)TMemo;

TMainMenu;TMenuItem;TMenuItem;

N1: TMenuItem;N2: TMenuItem;

N3: TMenuItem;

Page 56: Delphi. Учимся на примерах

Полный исходный код модуля 55

Листинг 7.1. Продолжение

N4: TMenuItem;N5: TMenuItem;N7: TMenuItem;N8: TMenuItem;OpenDialogl: TOpenDialog;SaveDialogl: TSaveDialog;FontDialogl: TFontDialog;N6: TMenuItem;N9: TMenuItem;N10: TMenuItem;XoRl: TMenuItem;procedure NIClick(Sender: TObject);procedure N2Click(Sender: TObject);procedure N4Click(Sender: TObject);procedure N8Click(Sender: TObject);procedure N5Click(Sender: TObject);procedure N9Click(Sender: TObject);procedure NIOClick(Sender: TObject);procedure FormCreate(Sender: TObject);procedure XoRlClick(Sender: TObject);

private{ Private declarations }

public

{ Public declarations }end;

var

Forml: TForml;xr_num: string;

implementation($R *.dfm)

procedure TForml.NIClick(Sender : TObject);beginOpenDialogl.InitialDir := GetCurrentDir;if not OpenDialogl.Executethen ShowMessage('File not selected!')else //загружаем выбранный файл в Memo

Memol.Lines.LoadFromFile(OpenDialogl.FileName);end;

procedure TForml.N2Click(Sender: TObject);begin

SaveDialogl.InitialDir := GetCurrentDir;

Page 57: Delphi. Учимся на примерах

56 Блокнот-шифровальщик

Листинг 7.1. Продолжение

if not SaveDialogl.Executethen ShowMessage('File not saved!')else //сохраняем в файлMemol.Lines.SaveToFile(SaveDialogl.FileName);

end;

procedure TForml.N4Click(Sender: TObject);begin

Close; //выход из программыend;

procedure TForml.N8Click(Sender: TObject);begin

Memol.lines.Clear; //очищаем Memoend;

procedure TForml.N5Click(Sender: TObject);var

xr: string; //зашифрованный текстi: integer; //счетчик цикла

beginfor i:=l to Length(Memol.Text) dobegin //перебираем каждый символ в тексте

//Выполняем указанное пользователем смещениеxr := xr + Chr(Ord(Memol.Text[i]) xor StrToInt(xr_num)

end;//заменяем оригинальный текст на зашифрованныйMemol.Text := xr;

end;

procedure TForml.N9Click(Sender: TObject);begin

if N9.Checked then //если флажок установленbeginN9.Checked := False; //сбрасываем флажок//Отображаем горизонтальную полосу прокруткиMemol.ScrollBars := ssBoth;

endelse begin //если флажок не установлен

N9.Checked := True; //устанавливаем флажок//убираем горизонтальную полосу прокруткиMemol.ScrollBars := ssVertical;

end;end;

Page 58: Delphi. Учимся на примерах

Полный исходный код модуля 57

Листинг 7.1. Продолжение

procedure TForml.NIOClick(Sender: TObject);begin

//Определяем все настройки шрифта и отображаем их в окнеFontDialogl.Font.Color := Memol.Font.Color; //цвет шрифтаFontDialogl.Font.Style : = Memol.Font.Style; //стильFontDialogl.Font.Size := Memol.Font.Size; //размерFontDialogl.Font.Charset : = Memol.Font.Charset; //кодировкаFontDialogl.Font.Name := Memol.Font.Name; //название шрифтаif FontDialogl.Execute then begin

//применяем все выбранные настройкиMemol.Font.Color : = FontDialogl.Font.Color;Memol.Font.Style := FontDialogl.Font.Style;Memol.Font.Size := FontDialogl.Font.Size;Memol.Font.Charset := FontDialogl.Font.Charset;Memol.Font.Name : = FontDialogl.Font.Name;

endend;

procedure TForml.FormCreate(Sender: TObject);

var

Str:String; //путь к параметруi:Integer;

beginxr_num := '2'; //по умолчанию смещение = 2if (ParamCount > 0) thenbegin

Str := ParamStr(1);//Формируем путь к параметруfor i:=2 to ParamCount do Str := Str + ' ' + ParamStr(i);

end;

{Если на вход программы поступили параметры, то отображаемсодержимое соответствующего файла в поле Memo }if str о " then Memol.Lines.LoadFromFile(str);

end;

procedure TForml.XoRlClick(Sender: TObject);begin

if not InputQuery('XOR', 'Введите число xor:', xr_num)then exit;

end;

end.

Все файлы проекта и исполняемый файл рассмотренной программы находятсяна прилагаемом к книге компакт-диске в папке C h a p t e r _ 0 7 .

Page 59: Delphi. Учимся на примерах

58 Игра "Успей щелкнуть"

Глава 8

Игра "Успей щелкнуть"

Постановка задачиПо всему экрану мелькает форма, и цель игры — успеть щелкнуть

мышью на появившемся окне. Для победы необходимо "попасть" поокну десять раз. Следует учитывать, что при каждом "попадании" ско-рость перемещения окна увеличивается.

Разработка формыСоздадим новый проект Delphi. Мелькающее окно у нас будет не-

обычным: оно будет без заголовка и не прямоугольным, а эллиптиче-ской формы. Измените свойства формы согласно табл. 8.1.

Таблица 8.1. Свойства формы игры "Успей щелкнуть"

Свойство

B o r d e r S t y l e

F o r m S t y l e

C o l o r

H e i g h t

W i d t h

Значение

bsNone

f s S t a y O n T o p

c l W i n d o w T e x t

72

208

Пояснение

Окно программы будет отображаться без

границы и заголовка

Окно программы должно располагаться

поверх всех остальных окон, поскольку

игрок не всегда будет "попадать" по на-

шему окну, а значит своими "промахами"

будет активизировать другие окна

Цвет формы — черный

Высота

Ширина

Разместитете его свойства

на форме компонент Label категории Standard. Измени-согласно табл. 8.2.

Таблица 8.2. Свойства первого компонента L a b e l

Свойство

C a p t i o n

F o n t . C o l o r

Значение

П о п а д а н и я :

c l L i m e

Пояснение

Надпись метки

Цвет шрифта — светло-зеленый

Page 60: Delphi. Учимся на примерах

Разработка формы 59

Таблица 8.2. Окончание

Свойство

Font.Name

Font.S ize

F o n t . S t y l e

L e f t

Top

Значение ,

C o u r i e r New

12

[ f s B o l d ]

16

16

Пояснение

Название шрифта

Размер шрифта

Начертание шрифта — полужирное

Отступ слева

Отступ сверху

Разместите на форме еще один компонент Label и измените егосвойства согласно табл. 8.3.

Таблица 8.3. Свойства второго компонента L a b e l

Свойство

Name

C a p t i o n

F o n t . C o l o r

Font.Name

F o n t . S i z e

F o n t . S t y l e

L e f t

Top

Значение

p o p a d

0

c l R e d

C o u r i e r New

16

[ f s B o l d ]

120

16

Пояснение

Новое имя компонента

Надпись метки

Цвет шрифта — красный

Название шрифта

Размер шрифта

Начертание шрифта — полужирное

Отступ слева

Отступ сверху

Разместите на форме третий компонент Label, который будет ото-бражать предельное число "попаданий", и измените его свойства со-гласно табл. 8.4.

Таблица 8.4. Свойства третьего компонента L a b e l

Свойство

C a p t i o n

F o n t . C o l o r

Font.Name

F o n t . S i z e

F o n t . S t y l e

L e f t

Top

Значение

/ 1 0

c l R e d

C o u r i e r New

16

[ f s B o l d ]

144

16

Пояснение

Надпись метки

Цвет шрифта — красный

Название шрифта

Размер шрифта

Начертание шрифта — полужирное

Отступ слева

Отступ сверху

Напоследок разместите на форме компонент Timer категории Sys-tem. Результат оформления формы должен соответствовать рис. 8.1.

Page 61: Delphi. Учимся на примерах

60 Игра "Успей щелкнуть"

Рис. 8.1. Форма для игры "Успей щелкнуть"

Разработка программного кодаИзменение формы окна на эллиптическую реализуется в обработ-

чике события OnCreate формы. Для этого необходимо объявить гло-бальную переменную forma типа HRGN, которая будет содержать разме-ры окна:

varForml: TForml;forma: HRGN;

В обработчик события OnCreate добавьте следующий код:procedure TForml.FormCreate(Sender:begin

Randomize; //включаем генераторforma := CreateEllipticRgn(0, 0,

Forml.//применяем новый вид окнаSetWindowRgn(Handle, forma, True)

end;

TObject)

случайных

" "1

чиселForml.Width,

Height);

;

//вид окна

Здесь мы задаем окно в виде эллипса и применяем новый вид окна.Каждую секунду форма должна случайным образом менять свои

координаты в пределах экрана. Это будет реализовано в обработчикесобытия Timer 1. OnTimer:procedure TForml.TimerlTimer(Sender: TObject);

beginForml.Top := Random(Screen.Height) + 1; //случайная высотаForml.Left := Random(Screen.Width) + 1; //случайная ширина

end;

Здесь мы определяем высоту и ширину экрана, выбираем случай-ные координаты, не выходящее за пределы экрана, и перемещаем в нихокно программы.

Теперь выделите все компоненты и саму форму и создайте для нихобщий обработчик события OnMouseDown:procedure TForml.popadMouseDown(Sender: TObject;

Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

Page 62: Delphi. Учимся на примерах

Разработка программного кода 61

beginif StrToInt(popad.Caption) < 10 thenbegin //если попаданий меньше 10

//Перемещаем окно в случайную позицию по вертикалиForml.Top := Random(Screen.Height) + 1;//Изменяем положение по горизонталиForml.Left := Random(Screen.Width) + 1;//Увеличиваем счетчик "попаданий" на единицуpopad.Caption := IntToStr(StrToInt(popad.Caption) + 1) ;//Увеличиваем скорость перемещения окна на 100 мсTimerl.Interval := Timerl.Interval - 100;

end;

if popad.Caption = 40' thenbegin //если игрок попал 10 раз

Timerl.Enabled := False; //останавливаем игруForml.Position := poDesktopCenter; //окно- в центр экрана//сообщаем о победеShowMessage('Вы попали по окну 10 раз!');if Application.MessageBox('Игра', 'Играть еще раз?',

mb_yesno + mb taskmodal +mb_iconQuestion) = idYes

then {предлагаем сыграть еще раз}begin

popad.Caption := 'О1; //сброс результатов

//Придаем окну эллиптическую формуforma := CreateEllipticRgn(0, 0,

Forml.Width, Forml.Height);SetWindowRgn(Handle, forma, True);

//Устанавливаем начальную скорость перемещения окнаTimerl.Interval := 1000;Timerl.Enabled := True; //начинаем игру-

end

else Halt; //выход из игрыend;

end;

При .каждом "попадании" выполняется проверка: было ли это "по-падание" последним. Если да, то просто пополняем счетчик попаданийи увеличиваем скорость перемещения формы на 100 мс. Если игрок сде-лал последнее "попадание", то останавливаем игру, выводим окно вцентр экрана и показываем сообщение о том, что игра успешно оконче-на. После этого отображаем окно с вопросом: следует ли начинать игрузаново. Если пользователь отказывается играть, то просто выходим изпрограммы. Если пользователь хочет сыграть сначала, то обнуляем всерезультаты и начинаем игру заново.

Page 63: Delphi. Учимся на примерах

62 Игра "Успей щелкнуть"

Окно программы в процессе игры представлено на рис. 8.2.

Рис. 8.2. Игра "Успей щелкнуть" в действии

Полный исходный код модуляПолный исходный код программного модуля игры "Успей щелк-

нуть" представлен в листинге 8.1.

Листинг 8.1. Программный модуль игры "Успей щелкнуть"

unit Unitl;

interface

Windows, Messages, SysUtils, Variants, Classes, Graphics,Controls, Forms, Dialogs, StdCtrls, ExtCtrls;

typeTForml = class(TForm)

Label2: TLabel;popad: TLabel;Label3: TLabel;Timerl: TTimer;procedure FormCreate(Sender: TObject);procedure TimerITimer(Sender: TObject);procedure popadMouseDown(Sender: TObject;Button: TMouseButton; Shift: TShiftState; X, Y: Integer)

private( Private declarations }

public{ Public declarations }

end;

varForml: TForml;forma: HRGN;

implementation

{$R *.dfm}

Page 64: Delphi. Учимся на примерах

Полный исходный код модуля 63

Листинг 8.1. Продолжение

procedure TForml.FormCreate(Sender: TObject);begin

Randomize; //включаем генератор случайных чиселforma := CreateEllipticRgn(0, 0, Forml.Width,

Forml.Height);//форма окна

//применяем новый вид окнаSetWindowRgn(Handle, forma, True);

end;

procedure TForml.TimerITimer(Sender: TObject);begin

forml.Top := Random(Screen.Height) + 1; //случайная высотаforml.Left := Random(Screen.Width) + 1; //случайная ширина

end;

procedure TForml.popadMouseDown(Sender: TObject;

Button: TMouseButton; Shift: TShiftState; X, Y: Integer);begin

if StrToInt(popad.Caption) < 10 thenbegin //если попаданий меньше 10

//Перемещаем окно в случайную позицию по вертикалиForml.Top := Random(Screen.Height) + 1;//Изменяем положение по горизонталиForml.Left : = Random(Screen.Width) + 1;//Увеличиваем счетчик "попаданий" на единицуpopad.Caption := IntToStr(StrToInt(popad.Caption) + 1);//Увеличиваем скорость перемещения окна на 100 мсTimerI.Interval := Timerl.Interval - 100;

end;

if popad.Caption = '10' thenbegin //если игрок попал 10 раз

Timerl.Enabled := False; //останавливаем игруForml.Position := poDesktopCenter; //окно- в центр экрана//сообщаем о победе

ShowMessage('Вы попали по окну 10 раз!');if Application.MessageBox('Игра', 'Играть еще раз?',

mb_yesno + mb_taskmodal +mb_iconQuestion) = idYes

then {предлагаем сыграть еще раз}begin

popad.Caption := '0'; //сброс результатов//Придаем окну эллиптическую формуforma := CreateEllipticRgn(0, 0,

Forml.Width, Forml.Height);SetWindowRgn(Handle, forma, True);//Устанавливаем начальную скорость перемещения окна

Page 65: Delphi. Учимся на примерах

64 Игра "Успей щелкнуть"

•. • • . • . - ; . . : • • • • . • : , • • . .

Листинг 8.1. ОкончаниеTimerl

Timerl

end

Interval :

Enabled : =

else Halt; //выход

end;

end;

end.

- 1000;

True; //начинаем игру

из игры

Все файлы проекта и исполняемый файл рассмотренной программы находятсяна прилагаемом к книге компакт-диске в папке C h a p t e r 08.

Page 66: Delphi. Учимся на примерах

Постановка задачи 65

Глава 9

"Угадывание чисел"

Постановка задачиРазработать игру, цель которой заключается в угадывании случай-

ного числа из заданного диапазона чисел. Дать возможность играть ссоперником или против компьютера.

Разработка формыСоздайте новый проект Delphi и присвойте свойству Caption (за-

головок) формы значение Игра. Угадывание чисел. Вверху формыбудут расположены элементы управления для настройки диапазона уга-дываемых чисел. Разместим на форме три компонента Label (метки)категории Standard и два компонента Edit (поле ввода) той же катего-рии. Изменим их свойства согласно табл. 9.1.

Таблица 9.1. Свойства компонентов для настройки диапазона угадываемых чисел

Компонент

L a b e l l

Label2

Label3

Свойство

Caption

Font.Style

L e f t

Top

Capt ion

F o n t . S t y l e

L e f t

Top

Capt ion

F o n t . S t y l e

L e f t

Top

Значение

Диапазон чисел:

[ f s B o l d ]

8

16

от

[ f s B o l d ]

104

16

до

[ f s B o l d ]

216

16

Пояснение

Надпись метки

Начертание шрифта —

полужирное

Отступ слева

Отступ сверху

Надпись метки

Начертание шрифта —

полужирное

Отступ слева

Отступ сверху

Надпись метки

Начертание шрифта —полужирное

Отступ слева

Отступ сверху

5 — 5-1212

Page 67: Delphi. Учимся на примерах

66 Игра "Угадывание чисел"

Таблица 9.1. Окончание

Компонент

E d i t l

E d i t 2

Свойство

Name

T e x t

L e f t

Top

W i d t h

Name

T e x t

L e f t

Top

W i d t h

Значение

s t a r t

1

128

8

57

f i n i s h

1000

256

8

57

Пояснение

Новое имя поля, предназначенного для

ввода начального числа диапазона

Содержимое поля

Отступ слева

Отступ сверху

Ширина

Новое имя поля, предназначенного для

ввода конечного числа диапазона

Содержимое поля

Отступ слева

Отступ сверху

Ширина

Разместите на форме под этими компонентами еще один компонентLabel, назовите его p l l (свойство Name), а свойству Caption присвой-те значение Первый игрок:. Справа от метки pi 1 разместите компонентEdit, свойству Name которого присвойте значение chl , а свойствуT e x t — значение 0. Справа от поля chl разместите еще один компо-нент Label. Присвойте ему имя znakl и очистите свойство Caption.

Под компонентами p l l , chl и znakl разместите аналогичные ком-поненты для второго игрока, присвоив им имена р12, ch2 и znak2 со-ответственно. Свойству р12 .Caption присвойте значение Второй иг-рок:, свойству ch2.Text — значение 0, а свойство znak2 .Captionочистите. Поскольку по умолчанию игру будет начинать первый игрок,мы должны заблокировать ввод для второго игрока. Для этого изменитезначение свойства Enabled для компонентов сп2 и р12 на False.

Разместите на форме справа от компонентов znakl и znak2 ещеодин компонент Label и измените его свойства согласно табл. 9.2.

Таблица 9.2. Свойства нового компонента L a b e l

Свойство

Name

C a p t i o n

F o n t . C o l o r

Font.Name

F o n t . S i z e

Значение

X

X

c l R e d

C o u r i e r New

36

Пояснение

Новое имя компонента

Надпись метки

Цвет шрифта — красный

Название шрифта

Размер шрифта

Page 68: Delphi. Учимся на примерах

Разработка программного кода 67

Таблица 9.2. Окончание

Свойство

F o n t . S t y l e

H e i g h t

Значение

[ f s B o l d ]

54

Пояснение

Начертание шрифта — полужирное

Высота метки

Ниже всех компонентов разместите компонент Checkbox (флажок)категории Standard. Присвойте его свойству Name значение comp, aсвойству Caption — значение Играть против компьютера (просле-дите также, чтобы свойство Checked было равно False).

Ниже разместите две кнопки (компонент Button категории Stan-dard), присвоив их свойству Caption значения Принять вариант иНовая игра. Полученная форма должна соответствовать рис. 9.1.

Ш Игра. Угадывание чисел

Днпазон чисел: от

Первый игрок: \"

до1000

| Играть против компьютера

; ; ; Принять вариант 1;

X

Новая игра

Рис. 9.1. Форма для игры "Угадывание чисел"

Разработка программного кодаПрежде всего, объявим переменные, которые будем использовать

varForml: TForml;num, j, i, kolvo, big, small: integer;maximum, minimum: array [1..100] of integer; {массивы

максимальных и минимальных чисел}

Переменная num соответствует случайно заданное число, перемен-ной kolvo — количество попыток, за которые число было отгадано, пе-ременной b i g — наибольшее число из названных, а переменнойsmall — наименьшее число из названных.

Page 69: Delphi. Учимся на примерах

68 Игра "Угадывание чисел"

Теперь напишем две процедуры, которые в случае игры противкомпьютера будут определять границы нахождения числа. Процедураmin будет определять нижнюю границу, а процедура max — верхнюю.Объявим эти процедуры как закрытые члены класса формы:type

TForml - class(TForm)

private{ Privateprocedure

procedure

public( Public с

end;

declarations )min () ;max () ;

ieclarations }

После этого создадим сами процедуры в разделе implementation://процедура нахождения наименьшего числаprocedure TForml.min();

begin

for i: =1 to kolvo do begin

for j:=1 to kolvo do begin

(Если число меньше наименьшего,то оно становится наименьшим}if minimum[j] > small then small := minimum[j];

end;

end;

end;

//процедура нахождения наибольшего числа «procedure Tforml.max();var temp: integer;begin

temp := StrTolnt(finish.Text);for i:=1 to kolvo do begin

for j:=1 to kolvo do beginif temp > maximum[j] then

if maximumtj] > 0 then temp:=maximum[j]; (если число

больше наибольшего...}end;

end;if ( (temp <> 0) and (temp <> StrTolnt(finish.Text)) ) then

{... и если число входит в допустимый диапазон,то оно становится наибольшим}

big := temp;end;

Page 70: Delphi. Учимся на примерах

Разработка программного кода 69

Рассмотрим процедуру, которая будет выполняться при созданииформы:procedure TForml.FormCreate(Sender: TObject);beginRandomize; //включаем генератор случайных чисел//загадываем случайное число из заданного диапазонаnum := Random(StrToInt(finish.Text) -

StrToInt(start.Text)) + StrToInt(start.Text);kolvo := 0; //обнуляем количество попытокbig := StrToInt(finish.Text); //самое большое числоsmall := StrToInt(start.Text); //самое маленькое число

end;

Сначала мы включаем генератор случайных чисел, затем выбираемслучайное число из заданного диапазона, и в конце устанавливаем длякомпьютера диапазон в пределах от наименьшего до наибольшего чис-ла. В дальнейшем мы будем постепенно сужать этот диапазон.

Самое главное событие — нажатие кнопки Принять вариант. Созда-дим для этого кнопки обработчик события OnClick:procedure TForml.Button2Click(Sender: TObject);begin

//увеличиваем количество попыток на единицуkolvo := kolvo + 1;if not сотр.Checked then //если идет игра с человекомbegin

if pll.Enabled then begin //если ход первого игрока//если вариант больше загаданного числа, ставим знак >if StrToInt(chl.Text) > num then znakl.Caption := '>';//если вариант меньше загаданного числа, ставим знак <if StrToInt(chl.Text) < nun then znakl.Caption :• '<';if StrToInt(chl.Text) • num then //если число угаданоbegin

znakl.Caption := '='; //изменим знак на "="//вместо знака "X" показываем загаданное числох.Caption := IntToStr(num);//выводим сообщение о победе первого игрокаShowMessage('Победил первый игрок!' + #13#10 +

'Число угадано эа ' + IntToStr(kolvo) +' попытки')

end;

//передаем ход второму игрокуpll.Enabled := False;chl.Enabled := False;ch2.Enabled := True;pl2.Enabled := True;Exit; //прерываем выполнение процедуры

Page 71: Delphi. Учимся на примерах

70 Игра "Угадывание чисел"

end;if pl2.Enabled then begin //если ход второго игрока

{сравниваем загаданное число с вариантом второгоигрока и ставим соответствующий знак}if StrToInt(ch2.Text) > пшп then znak2.Caption := '>';if StrToInt(ch2.Text) < num then znak2.Caption := '<';if StrToInt(ch2.Text) = num thenbegin

znak2.Caption := ' =' ;

x.Caption := IntToStr(num);ShowMessage('Победил второй игрок!

1 + #13#10 +

'Число угадано За ' + IntToStr(kolvo) +1 попытки')

end;end;

//передаем ход первому игрокур12.Enabled := False;ch2.Enabled := False;chl.Enabled := True;pll.Enabled := True;Exp-

end;

if comp.Checked then begin //если игра против компьютера{проверяем вариант первого игрока и ставимсоответствующий знак}

if StrToInt(chl.Text) > num then znakl.Caption := '>';if StrToInt(chl.Text) < num then znakl.Caption := '<';if StrToInt(chl.Text) = num thenbegin

znakl.Caption := '=';

x.Caption := IntToStr(num);

ShowMessage('Вы победили!' + #13#10 +

'Число угадано за ' + IntToStr(kolvo) +' попытки');

Exit;end;

//если вариант первого игрока больше загаданного числа}if znakl.Caption = '>' thenbegin

maximum[kolvo] := StrToInt(chl.Text); {добавляемв массив наибольших чисел вариант первого игрока}

max(); //ищем наибольшее числоend;

//если вариант первого игрока меньше загаданного числа)if znakl.Caption = '<' then beginminimum[kolvo] := StrToInt(chl.Text); {добавляем число

в массив наименьших чисел, выданных первым игроком}

Page 72: Delphi. Учимся на примерах

Разработка программного кода 71

min(); //ищем наименьшее числоend;

//после всех расчетов, компьютер выдает свой вариантch2.Text := IntToStr(Random(big - small) + small);

end;

//проверяем вариант компьютера и ставим соответствующий зьif StrToInt(ch2.Text) > num then znak2.Caption := '>';if StrToInt(ch2.Text) < num then znak2.Caption := '<';if StrToInt(ch2.Text) = num then begin

znak2.Caption := '=';x.Caption := IntToStr(num);ShowMessage('Вы проиграли!' + #13#10 +

'В этот раз победил компьютер!' + #13#10 +'Число угадано за ' + IntToStr(kolvo) +1 попытки');

end;end;

По нажатию кнопки Принять вариант мы проверяем, какой режимигры установлен: с другим игроком или против компьютера. Если мыиграем с человеком, то далее осуществляется проверка: кто из игроковвыдал свой вариант. Если это был первый игрок, то мы сравниваем еговариант ответа с загаданным числом и после этого отображаем соответ-ствующий знак или сообщаем о победе первого игрока, если числа рав-ны. Затем мы блокируем ввод с клавиатуры для первого игрока и раз-решаем ввести число второму игроку.

После того как второй игрок выдал свой вариант ответа, мы выпол-няем те же проверки, и, если число не угадано, вновь даем право попы-таться угадать загаданное число первому игроку. После того как кто-тоиз игроков дает вариант ответа, мы пополняем счетчик kolvo, чтобыпотом сообщить, сколько попыток использовалось, чтобы угадать чис-ло.

Если игра проходит против компьютера, то мы не разблокируемввод второго игрока вообще. Там просто будут отображаться варианты,выдаваемые компьютером. Каждый раз, перед тем как компьютер реша-ет, какой вариант ему выбрать, он анализирует вариант, выданный иг-роком. Если текущий вариант игрока больше загаданного числа, то мыдобавляем текущий вариант первого игрока в массив наибольших чисел.В этом массиве ищется самое маленькое число среди наибольших.

Если текущий вариант игрока меньше загаданного числа, то мы до-бавляем его в массив наименьших чисел. В этом массиве ищется самоебольшое число среди наименьших. Тем самым мы постоянно сокращаем