Вы находитесь на странице: 1из 217

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

чщ

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

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

"МК-Пресс"

Киев, 2005

ББК 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

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

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

ISB N 966—8806—02—6

© Парижский С. М., текст, иллюстрации, 2005

© "МК-Пресс", оформление, дизайн обложки, 2005

Содержание 3

Содержание

 

9

 

1.

ИНТЕРФЕЙС В СТИЛЕ WINDOWS XP

10

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

13

13

13

14

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

18

 

22

22

22

24

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

25

4. Снимо к

 

29

29

29

30

:

3 I

 

35

35

35

37

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

39

 

43

43

43

45

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

47

   

50

50

.'

50

51

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

 

59

59

59

61

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

63

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

ЧИСЕЛ"

66

 

66

66

68

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

74

 

10.

81

 

81

81

82

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

86

 

89

89

89

90

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

91

 

95

95

95

96

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

99

13.

103

103

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

103

104

106

115

 

12 5

125

125

5

Содержание

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

Шутка №1

Шутка №3 отключение клавиатуры Шутка №4 Шутка №5 назначение фона для Рабочего стола

Шутка №2

ограничение диапазона движения мыши отключение кнопок мыши

очистка буфера обмена

Шутка №6 выбор фона случайным образом Шутка №7выключение монитора

Шутка №8 сообщение об ошибке, содержащее "мусор"

Шутка №9 открытие браузера Internet Explorer Шутка №10 сброс системной даты/времени ко д МОДУЛЯ

Полный исходны й

125

127

128

128

128

129

130

131

131

132

132

132

'.

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

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

ГЛАВА 19. НАПИСАНИЕ CGI-ПРИЛОЖЕНИЙ ПОСТАНОВКА ЗАДАЧИ РАЗРАБОТКА ПРОЕКТА

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

ПРИЛОЖЕНИЕ Б. KYLIX — DELPHI

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

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

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

ДЛЯ LINUX

РЕЕСТРУ WINDOWS

171

171

171

174

177

178

178

178

178

178

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

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

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

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

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

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

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

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

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

179

179

179

179

179

180

 

180

180

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

Пуск —» Избранное

пункта Пуск —> Документы

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

180

181

181

181

181

181

181

181

182

182

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

182

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

182

Пуск—> Настройка—>Панель задач

182

183

183

183

7

Содержание

Пуск.

183

18 3

183

184

185

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

185

/55

„ Сокрытие пиктограммы Сетевое окружение наРабочем столе Отключение возможности вызывать окно свойств экрана

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

185

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

185

185

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

Интерфейс в стиле WindowsXP

201

202

 

202

204

205

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

205

 

ПРОЕКТА DELPHI

206

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

206

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

207

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

20 8

 

208

209

209

 

209

210

210

210

210

210

211

211

211

212

212

21 2

212

Оператор if,

212

Оператор case

213

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

213

 

213

214

214

214

ОБРАБОТКА

ИСКЛЮЧЕНИЙ

214

9

Введение

Введение

В своей первой книге, "Delphi. Только практика", автор рассмат- ривал примеры различных интересных программ. Эта книга является продолжением первой книги. Продолжением, поскольку исходные коды программ, которые рассматриваются в первой и второй книге, не повто- ряются. Также как и в "Delphi. Только практика", в данном издании подробно рассмотрены программы для сетей, различные шуточные про- граммы, простые игрушки, некоторые полезные приложения, разработ- ка приложений в стиле Windows XP. В частности, здесь можно найти такие примеры как бесплатная отправка SMS, FTP-клиент, простое шифрование, CGI-сценарии и многое другое. Поскольку рассмотренные примеры достаточно просты, то даже на- чинающий программист сможет быстро освоить азы написания прило- жений в Delphi и перейти к разработке собственных проектов (описание синтаксиса языка программирования Object Pascal представлено в при- ложении Г). Само собой разумеется, что для изучения изложенного в книге материала желательно знать основы работы с Windows, по- скольку Delphi — средство разработки программ именно для этой опе- рационной системы. Структура книги такова, что ее не обязательно конца, — можно просто открыть любую главу и разработать рассматри- ваемую программу. Все примеры подробно объясняются и содержат комментарии сложных строк кода. Книга будет интересна как опытным программистам, так и тем, кто только начал изучать язык программиро- вания 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_styl e .txt . те еще один текстовый файл следующего содержания:

[Т~2Т~сТ\xp_style.txt

C:\Program

Сохраните

file\Delphi\Bin.

этот

файл

под

именем

xp_style.r c

Затем создай-

в

каталоге

1 1

Введение

Файлы xp_styl e . tx t

компакт-диске в папке Chapte r 01 .

и xp_styl e . r e

можно найти на прилагаемом к книге

Примечание

Bi n

предполагает, что Delphi был установлен

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

Указанный

путь

к папке

C:\Program

file\Delphi\Bin \ style . re .

Теперь

запустим передав ей в качестве параметра следует

программу

перейти

в режим

brcc3 2

Для манду системного меню Пуск • Выполнить, а затем в диалоговом окне Запуск программы введя команду cmd и нажав клавишу <Enter>. В ре- жиме командной строки с помощью команды c d перейдем в каталог

С: \Program

командной строки, выполнив ко-

. ехе,

имя файла хр

этого

f ile\Delphi\Bi n и выполним следующую команду:

brcc32.exe

xp_style.rc

В результате в каталоге C:\Program file\Delphi\Bi n должен

появиться ресурсный файл xpstyle . res , который следует подклю- чать Windows XP. Проверим, так ли это, создав

оформить в стиле

к приложению в том случае,

когда его требуется

программу в стиле ХР. Откройте диа- Win-

и выберите

тему

окно настройки свойств Рабочего стола dows ХР (если она еще не выбрана).

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

Edi t

чение: Все компоненты и сама форма в стил е Windows ХР. Ниже

разместите тии которой будет появляться информационное окно (оно тоже должно _Х1^ : ^Обработ^чик события ОпС 1i с к для КНОПКИ:

следующее зна-

логовое

категории Standard. Присвойте его свойству Text

кнопку (компонент Butto n

категории Standard), при нажа-

procedure TForml.ButtonlClick(Sender: TObject); begin ShowMessage(Editl.Text); end;

содержащее на выпол- нение. Как видим, внешний вид интерфейса никак не изменился, не смотря на то, что выбрана тема Windows ХР.

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

Теперь

при нажатии

КНОПКИ будет

появляться

окно,

12

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

Для

того чтобы

implementatio n

решить эту

проблему найдите в программном моду-

(сейчас в нем указано только подключение

ле раздел файла формы *.df m при помощи директивы

чтобы подключить наш файл ресурсов, следует в разделе

{$R

*.dfm}) .

того

implementa -

Для

tion ^2^3^—^915.9Ш1

($R

xp_style.res }

;

ХР

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

(рис.

1.1).

ХР

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

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

поя-

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

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

ле Windows ХР (рис.

Введите

в поле какой-либо текст

1.2).

и нажмите

кнопку —

должно

этом, размер ехе-файла увеличился всего

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

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

Все файлы проекта и исполняемый файл рассмотренной программы находятся на прилагаемом к книге компакт-диске в папке Chapte r 01 .

13

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

2

Глава

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

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

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

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

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

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

di\2.txt .

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

верхнем углу формы, один над другим

14

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

Справа от полей from и where разместим кнопки вызова диалого- вого окна обзора (компоненты Button категории Standard). Свойству Captio n этих кнопок присвойте значение Обзор или просто поставьте точки. При желании, можете изменить размеры кнопок. Разместите на форме под полем where компонент Label Standard и присвойте его свойству Caption значение Размер файла:. Справа от этой метки разместите еще один компонент Label, очистив для нее свойство Caption — эта метка будет отображать размер обра- батываемого файла. Ниже разместим две кнопки (компоненты Button), присвоим их свойствам Captio n значения Копировать и Вырезать. Под этими кнопками разместим выбора и удаления файлов: компонент Edi t кнопка вызова диалогового окна обзора и кнопка для удаления файла. Свойству Editl.Name присвоим значение Del, а свойству Text путь по умолчанию. Кнопку Обзор разместим справа, а кнопку Удалить Del. Полученная форма должна соответствовать рис. 2.1.

файлу,

категории

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

для

ввода

пути

к

-

файл

под полем

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

Что: • ICA1.txt

Куда: • D: V2.txt

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

Копировать

D:\1.txt

Вырезать

Удалить Файл

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

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

копирования файла. Это

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

Разработаем

процедуру

можно

было

15

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

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

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

Для

type

TFormi = class(TForm)

private

{ Private declarations } procedure doit; public

{

Public declarations }

end;

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

Примечание

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

procedure TFormi.doit(); var

i

f1, f2 : 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) do begin //Пока не достигнут конец первого файла //Считываем один байт из первого файла BlockRead(fl, cop, 1) ; //Записываем один байт во второй файл

он уже

16

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

BlockWrite(f2,cop,1);

end; CloseFile(fl); //Закрываем первый файл CloseFile(f2); //Закрываем второй файл finally; end; //Конец блока обработки исключений

if IOResult < > 0 //Если возникла ошибка ввода-вывода

then

MessageDlg('Ошибка при копировании файла!', mtError, [mbOk],0) //сообщение об ошибке

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

L end;

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

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

procedure TForml.ButtonlClick{Sender: TObiect);

По нажатию кнопки Вырезать должно происходить обычное копи- ювание с последующим удалением скопированного файла:

procedure

begin

TForml.Button5Click(Sender:

TObject);

doit ;

DeleteFile(from.Text);

//копируем

//удаляем

исходный файл

end;

Теперь создадим процедуры выбора и сохранения файла с помощью стандартных диалоговых окон. Для выбора первого (исходного) файла следует создать следующий обработчик события OnClick (кнопкеBut - ton2 соответствует поле from):

[procedure

TForml. Button2Click (Sender:

TObjectTl

•—••••••••••••••

~~ j

17

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

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

else ShowMessage( 'Файл

end;

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

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

procedure TForml.Button3Click(Sender:

begin if Savel.Execute then where.Text := Savel.FileName

TObject);

end;

else

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

Здесь выполняется та же проверка, что и в предыдущем случае. За- тем выбранный путь заносится в соответствующее поле ввода, чтобы его, при желании, можно было откорректировать. Теперь создадим аналогичный обработчик события 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;

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

Сначала мы удаляем

проверяем, существует ли он на

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

uses

Windows,

Messages, SysUtils, Variants, Classes, Graphics,

Controls,

Forms, Dialogs, StdCtrls, ShellAPI, Gauges;

type

TForml = class(TForm) from: TEdit;

where:

Buttonl : TButton;

TEdit;

Labell:

TLabel;

Label2:

TLabel;

Label3:

TLabel;:

Label4:

TLabel;

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* ~~~

"

~™~

20

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

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

Rewrite(f2);

while not Eof(fl) do begin //пока не достигнут конец первого файла //считываем один байт с первого файла 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.FileName else ShowMessage(''Вы не выбрали место для сохранения файла! 1 ; end;

procedure TForml.Button5Click(Sender: TObject); begin doit; DeleteFile(from.Text); //удаляем исходный файл end;

21

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

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

procedure TForml.Button4Click(Sender: TObject); begin if Openl.Execute then del.Text := Openl.FileName else ShowMessage('Файл не был выбран 1 ); end;

procedure TForml.Button6Click(Sender: TObject); begin DeleteFile(del.Text); //удаляем файл if not FileExists(del.Text) then //проверяем существование файла- //выводим сообщение об,успешном удалении ShowMessage('Файл удален!');

end;

end.

Все файлы проекта и исполняемый файл рассмотренной программы находятся на прилагаемом к книге компакт-диске в папке Chapter_02.

22

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

3

Глава

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

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

программу,

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

Разработать

которая

статистику

выбранного

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

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

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

Caption

 

Font.Color

Статистика clRed

Font.Name

Courie r New

Font.Size

16

Font.Style

[fsBold]

Lef t

128

Top

8

Ниже разместите компонент Edit категории Standard (поле ввода), в котором будет храниться путь к обрабатываемому файлу. Справа от него разместим кнопку (компонент Button категории Standard), которая будет открывать окно обзора для выбора файла. Присвойте свойству Buttonl.Captio n значение Обзор. Для реализации выбора файла разместите на форме компонент OpenDialog категории Dialogs. Измените значение свойства Name этого компонента на Openl.

23

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

Label

на свойству Caption значения Слов, Символов, Пробелов и Строк. Рас- и уста-

положите эти метки одну над другой вдоль левого новите свойства шрифта согласно табл. 3.2.

Разместите

форме

четыре

компонента

и присвойте

их

края формы

Свойство

Таблица 3.2. Свойства шрифта компонентов Значение

Пояснение

Labe l

Font.Name

Courie r

New

Font.Size

12

Font.Style

[fsBold]

Размер шрифта надписи Стиль шрифта — полужирный

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

Таблица 3.3.Свойства компонентов words , symbols , space s

line s

и

Caption

0

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

Font.Color

clRed

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

Font.Name

Courier New

Font.Size

12

Font.Style

[fsBold]

Lef t

112

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

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

: Щ:

Слов:

Символов:

• Пробелов :

Строк:

•'

:

0

0

: Р.

:.:::::: :

Статистик а

;

; 1 cAautoeKec.bat

Статистика

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

:::.::• :

Обзор

24

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

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

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

procedure TForml.ButtonlClick(Sender: TObject); begin //начинаем обзор с текущей папки Openl.InitialDir := GetCurrentDir; if Openl.Execute then Editl.Text : = Openl.FileName //открываем диалоговое //окно выбора файла else ShowMessage('Файл не выбран!');

[end; Начинаем обзор с каталога,

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

лу

бран, то сообщаем об этом пользователю, иначе отображаем

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

в данный момент находится

Editl .

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); //связываем файл с переменной f Reset (f) ; //открываем файл на чтение

while

not Eof (f) do

begin

//читаем файл до достижения конца файла

oldstr := str;

Read(f, str); //считываем символ в переменную str if ((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

2 5

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

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. Программа Статистика в действии

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

26

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

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

Г unit Unitl;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type TForml -

class(TForm

Labell

TLabel;

Labei2

TLabel;

Label3

TLabel;

Label4

TLabel;

Label5

TLabel;

words:

TLabel;

symbols: TLabel;

spaces

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.FileName else ShowMessage('Файл не выбран!');

end;

27

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

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

procedure TForml.Button2Click(Sender: TObject); 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); //связываем файл с переменной f Reset (f); //открываем файл на чтение while not Eof(f) do begin //читаем файл до достижения конца файла oldstr := str; Read(f, str); //считываем символ в переменную str

if ((str <> 32) and (str о

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; //счетчик слов

13) and (str <> 10))

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

end.

Все файлы проекта и исполняемый файл рассмотренной программы находятся на прилагаемом к книге компакт-диске в папке Chapter_03.

28

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

4

Глава

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

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

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

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

Создайте новый проект Delphi и измените заголовок формы (свой- ство Caption) на Screenshot . Чтобы пользователь не мог изменять размеры окна при работе с программой, следует присвоить свойству BorderStyl e значение bsDialog. Для удобства создания копий экрана окно программы должно быть всегда размещено поверх остальных окон. Для этого присвоим свойству FormStyle значение f sStayOnTop. Мы можем себе это позволить: на самой копии экрана окно нашей про- граммы отображено не будет, поскольку в момент создания копии оно будет временно сокрыто. Для SaveDialog категории Dialogs. Разместите этот компонент на форме. Поскольку мы заранее знаем, что будем сохранять рисунок, то свойству SaveDialogl . Filte r присвойте значение Рисунок | * . bmp | Все

фай - лы! * .*. При сохранении файла у пользователя будет выбор: сохранять файл как рисунок (.* . bmp) или как любой друго й файл (***) .

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

сохранения

копии

экрана

нам

понадобится

компонент

29

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

ScreenShot*

Рис.

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

Очистить

Сохранить

J

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

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

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

в n E°£P? M i^£L_

пользоваться

_

г

аг

Forml: TForml; //главная форма

ВМР1: Graphics.TBitmap;

DC1:

Imagel: TImage;

//для работы с рисунками (*.bmp)

HDC; //простое поле для графики

Самое главное событие в программе

это нажатие кнопки Сделать

procedure TForml.ButtonlClick(Sender: TObject); begin Forml.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);

30

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

ВМР1.SaveToFile('с:\1.bmp 1 ); //сохраняем снимок в файл //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

представлен

3 1

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

Э5ЭЗВЗЯИ

ИГ—

^

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

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

Рис.

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

Очистить

Сохранить

xj

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

unit Unitl;

interface

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

type TForml = class(TForm) Buttonl: TButton; Button2: TButton; Screenl: TImage; SaveDialogl: TSaveDialog; Button3: TButton; Button4: TButton; procedure ButtonlClick(Sender:

TObject);

procedure Button2Click(Sender:

TObject);

procedure Button3Click(Sender:

TObject);

procedure Button4Click(Sender:

TObject);

private

{ Private declarations } public

{ Public declarations }

end;

var

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,

0, 0, Screen.Width, 0, 0, SRCCOPY);

Screen.Height, DC1,

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 then BMP1.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

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

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

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

end;

end.

Все файлы проекта и исполняемый файл рассмотренной программы находятся

на прилагаемом к книге компакт-диске в папке Chapter

04.

34

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

5

Глава

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

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

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

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

Создадим хранятся в файлах с расширением

проект Delphi

компилируется как выполняемый файл . ехе. Для того чтобы наша про-

грамма имела расширение . scr , выполним команду меню Project —> Op-

tions, на вкладке

в поле Target file extension значение sc r (рис. 5.1) и нажмем кнопку ОК.

Разработать хранитель экрана для

новый проект Delphi. Как известно, экранные заставки

. scr,

а по умолчанию

Application

окна Project

Options

диалогового

введем

нам понадобится на форме, —

это два компонента Timer

Все

что

категории System. Первый будет служить для реализации постепенного насыщения формы цветом —

чение свойства Interva l на

степенном уменьшении насыщенности цвета вплоть до того момента, когда форма вновь станет полностью прозрачной. Для этого таймера свойству interva l следует также присвоить значение 100, а значение свойства Enabled изменить на False, поскольку изначально "затуха- ния" происходить не будет.

для этого таймера следует изменить зна- 100. Второй таймер потребуется при по-

35

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

Project Options

 

Directories/Conditionals

: VersionInfo

 

Packages

Forms

Application

 

Compiler

j

Linker

Applicationsettings

 
 

litle:

f

Help file: Г

^rowse

[con: j

ш^.

Load Icon

j

'

Output settings

"

T

arget file extension:

I scr

JDefai!

 

OK

Cancel

Help

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

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

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

BorderStyl e

bsNone

Alig n

alClien t

ForruStyle

fsStayOnTop

AlphaBlen d

True

AlphaBlendValu e

1

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

36

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

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

Объявите в разделе

var

переменную mouse типа TPoint. В этой

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

var

Forml: TForml;

mouse: TPoint;

Программа

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

создадим обработчики некоторых событий главной формы. Создание формы (событие OnCreate):

экранной заставки

должна

закрываться

не только

procedure

begin

TForml.FormCreate(Sender:

TObject);

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

ShowCursor(False);

//прячем курсор

end; Форма должна закрываться по нажатию любой клавиши (событие

OnKeyPress) и при движении мышью (событие OnMouseMove). Код об- работчика события OnKeyPress:

procedure

TForml.FormKeyPress(Sender:

TObject;

var

Key:Char);

begin

Halt;

end;

Для

иным:

//завершение

работы программы

события

OnMouseMove

программный

код

будет

несколько

procedure

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

begin if (X О

mouse

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

end;

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

color_check . Объявите ее как закрытый член класса формы:

37

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

type

TForml

class(TForm)

private

{ Private declarations }

procedure color_check(); public

{ Public declarations }

end;

В

color

разделе

check:

implementation

создадим

реализацию

procedure TForml.color check(); var

ran:

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

процедуры

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

1:

Forml.Color : = clBlack;

2:

Forml.Color := clWhite;

3:

Forml.Color := clBlue;

4:

Forml.Color := clGray;

5:

Forml.Color := clYellow;

6:

Forml.Color := clGreen;

end;

end;

1 до

6, в

от сти от того которого определяем цвет формы. Процедура colorchec k будет вызываться при каждом новом насыщении формы.

Здесь случайным

образом выбирается

число

зависимо-

Обработчик

события OnTimer

первого таймера должен

иметь сле-

дующий вид:

procedure TForml.TimerlTimer(Sender: TObject); begin if Forml.AlphaBlendValue > 250 then {проверяем: не полностью ли мы закрасили форму} begin Timerl.Enabled := False; //выключаем насыщение формы Timer2.Enabled := True; //включаем обратный процесс end; //постепенное насыщение формы Forml.AlphaBlendValue := Forml.AlphaBlendValue + 1; end;

38

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

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

procedure TForml.Timer2Timer(Sender: TObject); begin if Forml.AlphaBlendValue < 5 then //если форма уже полностью прозрачная begin color_check(); //выбираем случайный цвет для формы Timer2.Enabled := False; //выключаем второй таймер Timerl.Enabled := True; //включаем первый таймер end; //Уменьшаем прозрачность на 1 Forml.AlphaBlendValue := Forml.AlphaBlendValue - 1;

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

1.

100 мс прозрачность формы уменьшается

Здесь через каждые

Разработанный

нами

хранитель

экрана

действии

показан

на

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

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

5.1.

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

39

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

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

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

unit Unitl;

interface

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

type TForml = 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);

40

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

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

private

{ Private declarations }

procedure color_check(); public

f

Public declarations }

end;

var Forml: TForml; mouse: TPoint;

implementation

{$R *.dfm)

procedure TForml.color_check(} ; var ran: integer; //случайное число, соответствующее //определенному цвету

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

1: Forml.Color

clBlack;

2: Forml.Color

clWhite;

3: Forml.Color

clBlue;

4: Forml.Color

dGray;

5: Forml.Color

clYellow;

6: Forml.Color end; end;

clGreen;

procedure TForml.FormCreate(Sender: TObject); begin

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

ShowCursor(False);

//прячем курсор

end;

procedure TForml.FormKeyPress(Sender: TObject; var Key:Char) begin Halt; //завершение работы программы end;

41

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

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

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

begin if (X <> mouse.X) or (Y <> mouse.Y) then Halt; end;

procedure TForml.TimerlTiraer(Sender: TObject); begin if Forml.AlphaBlendValue > 250 then //проверяем: не полностью ли мы закрасили форму begin TimerI.Enabled := False; //выключаем насыщение формы Timer2.Enabled := True; //включаем обратный процесс end; //постепенное насыщение формы Forml.AlphaBlendValue := Forml.AlphaBlendValue + 1; end;

procedure TForml.Timer2Timer(Sender: TObject); begin if Forml.AlphaBlendValue < 5 then //если форма уже полностью прозрачная begin color_check(); //выбираем случайный цвет для формы Timer2.Enabled := False; //выключаем второй таймер TimerI.Enabled := True; //включаем первый таймер end; //Уменьшаем прозрачность на 1 Forml.AlphaBlendValue := Forml.AlphaBlendValue - 1; end;

end.

Все файлы проекта и исполняемый файл рассмотренной программы находятся на прилагаемом к книге компакт-диске в папке Chapter 05.

42

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

6

Глава

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

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

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

данной программой и открываться ею по двойному щелчку

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

Создайте новый проект Delphi. Разместите на форме компонент Im- age категории Additional, который будет служить для отображения ри- сунка. Для того чтобы при любых размерах окна рисунок всегда запол- нял всю форму, следует изменить значение свойства Alig n на alCli - ent.

Для вызова диалоговых пользуемся компонентами OpenDialog и SaveDialog категории Dia- logs. Присвоим свойству Name этих компонентов значения Openl и Savel соответственно. Для обоих компонентов присвойте свойству Filte r значение Все файлы|*.*. Для доступа к функциям программы будем использовать команды меню. Разместите на форме компонент MainMenu категории Standard. Для того чтобы создать пункты меню, следует дважды щелкнуть мы- шью на компоненте MainMenul, в результате чего откроется редактор меню, изображенный на рис. 6.1. Для того чтобы добавить новый пункт, следует щелкнуть мышью в этом окне на пустом элементе меню и изменить в инспекторе объектов значение свойства Caption. Вначале создаются пункты меню, а затем аналогичным образом — подпункты (команды). Для создания раздели- телей свойству Caption следует присвоить значение - (дефис).

окон открытия и сохранения рисунка вос-

43

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

Irrl Forml.MainMenul

Рис.

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

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

Файл Правка Файл Правка ; Открыть Очистить Сохранить Выход
Файл
Правка
Файл
Правка
;
Открыть
Очистить
Сохранить
Выход

Вид

Рис.

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

на рис. 6.3.

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

Рис.

•:••:

:

:••;••:•':„••:•'

:

_ :

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

J

44

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

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

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

Для команды Файл -> Открыть:

I procedure TForml.N2Click(Sender: TObject); begin //начинаем обзор с текущей папки Openl.InitialDir := GetCurrentDir; //открываем диалоговое окно выбора файла if Openl.Execute then begin //загружаем выбранный рисунок Imagel.Picture.LoadFromFile(Openl.FileName); Imagel.Show; //отображаем рисунок на форме end else //Если рисунок не был выбран 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;

45

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

Единственное, чего не достает этой программе, — это возможность открывать с ее помощью рисунки в файл-менеджерах. Реализуем эту возможность, добавив следующий код в обработчик события OnCreate главной фoJE l J!l!di

procedure TForml.FormCreate(Sender: TObject); var Str:String; //путь к файлу, который поступил как параметр i:Integer; begin if (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. Программа просмотра рисунков в действии

46

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

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

исходный

программы

просмотра

рисунков

Полный представлен в листинге6.1.

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

ГипТГ Uniti;

i interface

код модуля

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

type TForml = 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}

47

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

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

procedure TForml.FormCreate(Sender: TObject); var Str: String; //путь к файлу, который поступил как параметр i:Integer; begin if (ParamCount > 0) then //если на вход программы поступил параметр begin //составляем путь к файлу по символам Str := ParamStr(1); for i:=2 to ParamCount do Str := Str +'.*•+ ParamStr(i); end; Imagel.Picture.LoadFromFile(str); //загружаем рисунок Image1.Show; //показываем рисунок end; end;

procedure TForml.N2Click(Sender: TObject); begin //начинаем обзор с текущей папки Openl.InitialDir := GetCurrentDir; //открываем диалоговое окно выбора файла if Openl.Execute then begin //загружаем выбранный рисунок Imagel.Picture.LoadFromFile(Openl.FileName); Imagel.Show; //показываем рисунок на форме end else //Если рисунок не был выбран 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;

48

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

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

procedure TForml.N7Click(Sender: TObject); begin Image1.Hide; //прячем рисунок end;

L end.

Все файлы проекта и исполняемый файл рассмотренной программы находятся на прилагаемом к книге компакт-диске в папке Chapter_0 6.

49

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

7

Глава

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

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

Разработать

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

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

программу,

повторяющую

стандартного

Создадим новый проект Delphi. Интерфейс программы сделаем по- хожим на интерфейс стандартного блокнота. Разместите на форме ком- понент Memo (многострочное текстовое поле) категории Standard. Для всю форму, измените значение свойства Memol.Al-ign на alClient . Для текстового поля должна отображаться только вертикальная полоса про- крутки (то есть, будет выполняться автоматический перенос слов но но- вую строку). Для этого следует изменить значение свойства Scroll - Bars на ssVertical.

того чтобы при любых размерах окна этот компонент заполнял

Разместите на форме создайте меню, представленное компонент
Разместите
на форме
создайте меню, представленное
компонент MainMenu категории Standard и
на рис. 7.1.
ншавш;
Файл
Правка Формат |
Файл Праака Формат
Открыть
Файл Правка
Формат ;
,
Сохранить
Число XOR
*/ Перенос по словам
Шрифт
Зашифровать/Расшифроват
Закрыть
Очистить

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

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

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

50

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

Для вызова диалогового окна открытия файла будем использовать компонент OpenDialog категории Dialogs, а для сохранения файла — компонент SaveDialog той же категории. Для обоих компонентов из- мените значение свойства Filte r на Блокнот | * . tx t | Все файлы | * . *. Также разместите на форме еще один компонент категории Dialogs:

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

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

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

Шифровать текст будем

функции хог

или обычного

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

переменную xr_num типа

Прежде

string:

var

объявите

Forml: TForml;

xr_num: string;

глобальную

51

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

Теперь займемся командами меню. Обработчик события для пункта Файл —> Открыть:

OnClick

procedure TForml.NIClick(Sender: TObject); begin //начинаем обзор с текущей папки OpenDialogl.InitialDir := GetCurrentDir; if not OpenDialogl.Execute then ShowMessage('File not selected!')

else //загружаем выбранный файл в Memo

Memol.Lines.LoadFromFile(OpenDialogl.FileName);

end;

и просим пользователя выбрать текстовый или любой другой файл. После того как пользователь выбрал файл, загружаем его в нашу программу. Обработчик события OnClick для пункта Файл —> Сохранить:

окно обзора

Здесь мы открываем стандартное диалоговое

procedure TForml.N2Click(Sender: TObject); begin Savedialogl.InitialDir := GetCurrentDir; if not SaveDialogl.Execute then 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 для пункта Правка -» Зашифро- вать/Расшифровать:

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

[procedure TForml.N5Click(Sender: TObject);

j var

xr: string; //зашифрованный текст i: integer; //счетчик цикла 1 begin for i:=1 to Length(Memol.Text) d o begin //перебираем каждый символ в тексте //выполняем указанное пользователем смещение 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:

begin

i

begin

f

N9.Checked

the n

//есл и

флажок

TObject);

установлен

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

По

этой

команде меню

мы проверяем, какое состояние сейчас у мы

Если

флажок установлен, т о полосу и убираем

горизонтальную

флажок

прокрутки. В

горизонтальную

пункта Формат -» Перенос по словам.

сбрасываем противном случае, полосу прокрутки.

его и отображаем

устанавливаем

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 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; end; end;

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

Теперь осталось только реализовать автоматическую

procedure TForml.FormCreate(Sender: TObject); var

Str:

String; //путь к параметру

i: Integer; begin xr num := '2'; //по умолчанию смещение « 2 if (ParamCount > 0) then begin Str := ParamStr(l); //Формируем путь к аргументу for i:=2 to ParamCount d o St r := St r +•

*.+ ParamStr(i) ;

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

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

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

54

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

его содержимое в поле Memo. Пример

наем путь шифрования со смещением 10 представлен на рис. 7.3.

к файлу и отображаем

Файл

Правка

Формат

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

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

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

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

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

unit Unitl

interface

uses

Windows,

Messages, SysUtils, Variants, Classes, Graphics,

Controls

Forms, Dialogs, StdCtrls, Menus;

type

TForml = class(TForm)

Memol:

TMemo;

menul:

TMainMenu;

Filel:

TMenuItem;

Editl:

TMenuItem;

N1: TMenuItem;

N2: TMenuItem;

N3: TMenuItem;

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); begin OpenDialogl.InitialDir := GetCurrentDir; if not OpenDialogl.Execute then ShowMessage('File not selected!')

else //загружаем выбранный файл в Memo

Memol.Lines.LoadFromFile(OpenDialogl.FileName);

end;

procedure TForml.N2Click(Sender: TObject); begin SaveDialogl.InitialDir := GetCurrentDir;

56

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

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

if not SaveDialogl.Execute

then 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; //очищаем Memo end;

procedure TForml.N5Click(Sender: TObject); var xr: string; //зашифрованный текст i: integer; //счетчик цикла begin for i:=l to Length(Memol.Text) do begin //перебираем каждый символ в тексте //Выполняем указанное пользователем смещение 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 //если флажок установлен begin N9.Checked := False; //сбрасываем флажок //Отображаем горизонтальную полосу прокрутки Memol.ScrollBars := ssBoth; end else begin //если флажок не установлен N9.Checked := True; //устанавливаем флажок //убираем горизонтальную полосу прокрутки Memol.ScrollBars := ssVertical; end; end;

57

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

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

procedure TForml.NIOClick(Sender: TObject); begin //Определяем все настройки шрифта и отображаем их в окне

FontDialogl.Font.Color := Memol.Font.Color; //цвет шрифта

FontDialogl.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.Style; //стиль

//применяем все выбранные настройки

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;

procedure TForml.FormCreate(Sender: TObject); var Str:String; //путь к параметру i:Integer; begin xr_num := '2'; //по умолчанию смещение = 2 if (ParamCount > 0) then begin 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.

Все файлы проекта и исполняемый файл рассмотренной программы находятся на прилагаемом к книге компакт-диске в папке Chapter_07 .

58

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

8

Глава

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

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

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

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

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

будет не-

По всему экрану мелькает

форма,

игры —

успеть

щелкнуть

новый проект Delphi. Мелькающее

Создадим

окно у

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

BorderStyl e

bsNone

FormStyl e

fsStayOnTop

Colo r

clWindowText

Heigh t

72

 

Widt h

208

те его

Разместите

свойства

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

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

Captio n

Попадания:

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

Font.Colo r

clLim e

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

59

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

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

 

Значение ,

 

Font.Name

Courie r

New

Font.Size

12

Font.Style

[fsBold]

Lef t

16

Top

16

еще свойства согласно табл. 8.3.

Разместите

на форме

один

компонент

Labe l

и измените

его

Таблица 8.3. Свойства второго компонента Labe l

Name

popad

 

Captio n

0

Font.Colo r

clRe d

Font.Name

Courie r

New

Font.Siz e

16

Font.Styl e

[fsBold ]

Lef t

120

Top

16

Разместите бражать предельное число "попаданий", и измените его свойства со- гласно табл. 8.4.

компонент Label, который будет ото-

на форме третий

Таблица 8.4.Свойства третьего компонента Labe l

Captio n

/10

Font.Colo r

clRe d

 

Font.Name

Courie r

New

Font.Siz e

16

Font.Styl e

[fsBold ]

Lef t

144

Top

16

на форме компонент Timer

категории tem. Результат оформления формы должен соответствовать рис. 8.1.

Напоследок

разместите

Sys-

60

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

Рис. 8.1. Форма для игры "Успей щелкнуть"

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

Изменение формы окна на эллиптическую реализуется в обработ- чике события OnCreate формы. Для этого необходимо объявить гло- бальную переменную forma типа HRGN, которая будет содержать разме- ры окна:

var Forml: TForml; forma: HRGN;

В обработчик события OnCreate добавьте следующий код:

procedure TForml.FormCreate(Sender:

TObject)

"

"1

begin Randomize; //включаем генератор

forma := CreateEllipticRgn(0, 0,

Forml.Width,

 

Forml. Height);

//вид окна

//применяем новый вид окна SetWindowRgn(Handle, forma, True) ; end;

окно в виде эллипса и применяем новый вид окна.

Здесь мы задаем Каждую координаты в пределах экрана. Это будет реализовано в обработчике события Timer 1. OnTimer:

секунду

форма должна

случайным

образом

менять свои

procedure TForml.TimerlTimer(Sender: TObject); begin Forml.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);

61

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

begin if StrToInt(popad.Caption) < 10 then begin //если попаданий меньше 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 ' then begin //если игрок попал 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); //Устанавливаем начальную скорость перемещения окна