Опубликованно в журнале "Домашний компьютер" №9 2002г.
Однажды вы подойдёте к своему компьютеру в неожиданно поймёте, что игрушки потеряли для вас былую привлекательность, mp3 музыка уже не радует слух, а красочный пейзаж иконок на рабочем столе навевает тоску. Не беспокойтесь, это не болезнь. Вы просто подошли к тому уровню, на котором перестаёте быть Потребителем и можете стать Создателем. Создателем чего? Это зависит только от ваших талантов и способностей. Может быть, вас привлечёт создание видео. Или вы займётесь созданием своих аудио композиций, или подадитесь в компьютерные художники? Лично меня в такой момент привлекло программирование.
Компьютерный художник, музыкант остаётся в рамках тех программ, которые для него созданы. Программиста же ограничивают лишь его знания и необходимость время от времени отдыхать. В отличие от прочих, умеющий программировать, заметив, что ему не хватает какого-то инструмента, не бежит искать его, а может сам сделать то, что нужно. Да и зная свою программу до последнего бита можно не опасаться неожиданного глюка в самый ответственный момент. Это придаёт независимость от имеющихся программ и окончательно определяет, кто в доме хозяин: вы или компьютер.
Не стоит думать, что программирование представляет собой нечто недоступное человеку без трёх высших образований! По крайней мере, для работы в системе программирования Delphi, не требуется практически никаких специальных знаний. Прочитав эту статью, вы будете знать абсолютно всё, что необходимо для создания полезных работоспособных приложений. И кроме того, давайте придерживаться принципа "Чтобы научиться программировать необходимо программировать!"
Итак, начнём. Для работы потребуется Borland Delphi. Версия не очень важна. Я предпочитаю пользоваться Delphi 4. Она содержит порядка 220 стандартных компонентов, которые удовлетворят ваши потребности в абсолютном большинстве случаев. Сейчас уже вышла Delphi 6. В ней ещё больше компонент, значительно расширена справочная система, добавлены различные возможности, которых не было в предыдущих версиях. Но ни одна программа из тех, что я писал за последний год, не потребовала этих новых компонент и возможностей, хотя справку я использую именно от шестой версии. Кроме того, каждая последующая версия создаёт исполняемые файлы программ всё большего размера. Такова цена прогресса.
Давайте для разминки напишем простенькую программу строчек в 5. Нет, это будет не "Hello, world!", а нечто более содержательное – текстовый редактор. Запускаем Delphi и видим, что для нас уже заботливо приготовлена форма главного окна программы. Посмотрите на саму Delphi. Окно слева – Инспектор объектов (Object Inspector) – позволяет настраивать параметры используемых вами объектов. В частности можно вводить названия кнопок, пунктов меню и меток (свойство Caption), настраивать шрифт, используемый компонентом (Font), и цвет некоторых объектов (Color). Ни что не мешает вам использовать в своих программах не стандартные серые, а нежно-розовые или траурно-чёрные окошки.
Вдоль верхнего края экрана расположена панель с компонентами, из которых и строится программа. Компоненты разделены по тематическим страничкам: Standard, Win32, Win3.1, Internet, Dialogs, …
Пусть наш редактор выглядит примерно как Блокнот (Notepad): меню и рабочая область. Поместите на форму компоненты MainMenu и Memo. Они находятся на странице Standard. Также понадобятся OpenDialog и SaveDialog со страницы Dialogs. Установите свойство Align компонента Memo в alClient. При этом Memo занймёт всю свободную область окна. Добавим ещё полоски прокрутки: свойство ScrollBars установите в ssBoth. Если вам не терпится, то можете запустить программу (меню Run\Run или F9). Редактор уже работает, вот только результаты работы с текстом сохранить не удаётся. Но мы же ещё не написали ни одной строчки! Пойдём дальше. Дважды щёлкните на компоненте MainMenu, расположенном на форме. Откроется окно создания меню. Введите названия пунктов меню, как показано на рисунке. А теперь заставим это меню работать! Щёлкните дважды на пункте "Сохранить" и в открывшемся окне редактора программного кода введите следующую пару строк:
if OpenDialog1.Execute then
Memo1.Lines. LoadFromFile(OpenDialog1.Filename);
А для пункта "Сохранить" аналогично другую пару:
if SaveDialog1.Execute then
Memo1.Lines.SaveToFile(SaveDialog1.Filename);
И для полноты картины для пункта "Выход" введите всего лишь одно слово Close. Редактор готов! Можно запустить и проверить. И, как и обещал, всего пять строк. Желающие могут ещё добавить настройку шрифта. Для этого понадобится FontDialog со страницы Dialogs, а в обработчик нужного пункта меню надо будет ввести
If FontDialog1.Execute then
Memo1.Font:=FontDialog1.Font;
Чтобы таким редактором не пытались открывать, скажем, bmp файлы настройте свойство Filter у диалогов открытия и сохранения файлов. Ну и последний штрих. Нехорошо, когда окно называется Form1. Введите заголовок (Caption) окна, например "Редактор 5строк" вполне подойдёт.
Создание подобного редактора является едва ли не классической демонстрацией простоты работы со средой визуального программирования. Давайте теперь напишем что-нибудь более полезное и менее стандартное.
Мне достаточно часто требуется искать определённую картинку или звук среди десятков файлов. Вручную открывать все подряд? – Удовольствие ниже среднего. Использовать ACDSee? – Слишком большой инструмент для такой задачи. Я предпочитаю свою собственную маленькую программку.
Начните новый проект в Delphi (File\New Application). Разместите на форме компоненты DriveComboBox, DirectoryListBox и два FileListBox. Все они обитают на страничке Win3.1. Два списка файлов (FileListBox) требуются затем, чтобы в одном отображать файлы картинок, а в другом – мультимедиа файлы. С помощью этих компонент мы организуем подобие Проводника, чтобы получить удобный доступ к файлам. Теперь надо связать эти компоненты, чтобы изменения в одном вызывали соответствующую реакцию и в остальных. Свойству DirList компонента DriveComboBox1 присвойте значение DirectoryListBox1. Далее DirectoryListBox1.FileList (такая запись обозначает "свойство FileList компонента DirectoryListBox1") присвойте FileListBox1. Вот, теперь связано всё, кроме FileListBox2. Объясним программе, как с ним работать. Выделите DirectoryListBox1, в Инспекторе объектов перейдите на вкладку Events (События) и дважды щёлкните напротив слова OnChange. При этом вы получаете возможность описать, как программа должна реагировать на событие "изменение выбора папки". Введите в открывшемся окне строчку
FileListBox2.Directory:=DirectoryListBox1.Directory;
Теперь надо настроить свойство Mask у списков файлов. Именно это свойство определяет, файлы каких типов будут отображаться, а каких – нет. Для первого списка введите значение *.wav;*.mid;*.avi (здесь будут показаны медиа файлы), а во втором *.bmp;*.ico (этот значит для картинок).
Теперь нам понадобятся Image со страницы Additional и MediaPlayer со страницы System. Названия уже говорят о назначении этих объектов. Если не хотите делать окно своей программы уж очень большим (мало ли, какую картинку вы захотите просмотреть!) установите свойство Image1.Stretch в true. При этом открываемая в Image1 картинка растянется/сожмётся до его размеров и будет видна целиком независимо от собственного размера. Ну что ж, не будем тянуть и научим программу просматривать картинки прямо сейчас. В обработчик события OnClick второго списка файлов (напомню: Object Inspector\Events\OnClick) введите такую строчку
Image1.Picture.LoadFromFile(FileListBox2.FileName);
Это всё, что нужно, чтобы просматривать ваши картинки!
А теперь добавим работу с аудио/видео. Свойство MediaPlayer1.Visible установите в False, при этом проигрыватель во время работы программы виден не будет, но это не помешает нам им пользоваться. Осталось написать, что делать программе при щелчке (событие OnClick) на FileListBox1 и программа будет готова. Обработчик будет такой:
MediaPlayer1.FileName:=FileListBox1.FileName;
MediaPlayer1.Open;
MediaPlayer1.Play;
Готово! Программа действует. Конечно же, хорошо бы ещё настроить заголовок окна, запретить максимизацию окна (Form1.BorderIcons.biMaximize:=false) и добавить шкалу, по которой можно определить, сколько длится воспроизводимое аудио/видео. Займёмся шкалой, т.к. остальное вы уже умеете. Потребуется сама шкала Gauge со страницы Samples и таймер Timer со страницы System. Свойству Timer1.Interval присвойте значение поменьше, например 100. И в начальном состоянии таймер нужно отключить. За это отвечает свойство Enabled. Его значения: true – включено, false – выключено. Обработчик единственного события, которое имеет таймер, выглядит так:
Gauge1.Progress:=MediaPlayer1.Position;
if Gauge1.Progress=MediaPlayer1.Length then
Timer1.Enabled:=false;
Т.е. таймер отключается, когда файл проигран до конца. И ещё потребуется пару строк добавить в конец уже существующего обработчика щелчка по списку медиа файлов (FileListBox1.OnClick):
Gauge1.MaxValue:=MediaPlayer1.Length;
timer1.Enabled:=true;
Вот теперь программа не только работает, но и выглядит вполне цивилизованно.
Кстати, здесь использовался таймер. Это очень полезный компонент. С его помощью можно вызывать через определённые промежутки времени выполнение каких-либо команд. Очень просто можно сделать часы на основе таймера. Поместите на форму таймер и метку (Label со страницы Standard), выберете для неё какой-нибудь красивый шрифт (Label1.Font). А теперь в обработчик события таймера впишите такую строчку:
Label1.Caption:=TimeToStr(Now);
Получились простые непритязательные часики. Их несложно превратить в будильник, добавив ещё две строки:
If Label1.Caption='21:00:00' then
ShowMessage('Время смотреть кино на СТС!');
Но здесь "время пробуждения" жёстко записано в программе. Но ни что не мешает вводить его после запуска программы. Для этого надо добавить на форму строчку ввода (Edit) и сравнивать текст в метке с текстом в строчке:
If Label1.Caption=Edit1.Text then
ShowMessage('Подъём!!!');
Нет предела совершенству!
Только что мы рассмотрели пару программ, которые могут быть вам полезны. При желании вы можете добавить в них те функции, которые требуются именно вам: выключение компьютера в заданное время, копирование файлов по маске, преобразование рисунков в данной папке или их слайд-показ. Всё это делается очень просто. Вы УЖЕ знаете достаточно, чтобы написать свою программу для демонстрации содержимого вашего CD-R (конечно, если вы записываете CD). В действительности, чтобы писать достаточно хорошие программы, требуется знать как поставить условие выбора, организовать цикл, обратиться к свойству объекта и порядка 20-30 служебных процедур и функций. Вот и всё! С помощью Delphi вы можете писать полезные для работы программы. И нет абсолютно ни каких причин, почему бы не написать свою собственную игрушку. Разумеется, не стоит сразу начинать с создания Quake, но вот логические игры пишутся достаточно просто. Delphi предоставит вам всё необходимое для решения любых типов задач: работа с текстами, графикой, аудио, видео, использование анимации, разработка DLL, доступ к функциям и процедурам WinAPI, обработка любых сообщений Windows и многое другое. Так что создание игры требует не больших усилий, чем создание иной программы. Но о создании игр поговорим в другой раз.
Дерзайте, творите и создавайте!
Макаров Владимир
Исходный текст программы-просмотрщика можно взять здесь (6 Кб).