Сиди, слушай. Часть 2Дмитрий Румянцев Краткое содержание предыдущей части. Некто, воодушевленный своими первыми удачными опытами в деле осваивания пакета Delphi 6.0, самонадеянно решает бросить перчатку в лицо разработчикам из корпорации Microsoft. С этой целью этот самый некто решает создать собственный CD-проигрыватель, способный не только воспроизводить AudioCD, но и - внимание! - автоматически опознавать вставленный компакт, и, в случае такой надобности, позволять сохранять описание компакт-диска в импровизированной базе данных. В проекте участвовали: MediaPlayer - компонент, отвечающий за работу с мультимедийными штучками, Timer (две штуки) - компонент, отвечающий за тиканье внутренних часов программы, а также разная вспомогательная мелюзга, как то: кнопка (Button), 2 метки (Label), индикатор затяжного процесса (ProgressBar) и панель статуса (StatusBar). В процессе разработки проекта упомянутый некто создает работающий CD-player и уже было совсем собирается приступить к его усовершенствованию (опознавание и сохранение в базе данных), как вдруг - журнальная площадь неожиданно заканчивается. Быстро оправившись от удара, некто стоически заканчивает разработку проекта и предлагает всем желающим ознакомиться со второй частью своего дневника, в котором он - потомкам в назидание - скрупулезно записывал все свои манипуляции над проектом CD-player. Итак... Show Must Go On!2.12. Откройте ранее сохраненный проект CD-player. Для этого удобно выбрать пункт File > Reopen и в списке проектов выбрать нужный (если вы не работали с каким-то другим проектом, то искомый расположен в первой строке списка под номером 0). Теперь к нашему проекту необходимо добавить еще одну форму, которая будет использоваться для ввода информации о диске. 2.12.1. Выберите пункт File > New Form (или щелкните соответствующую кнопку на toolbar) и сохраните новый модуль на диске под именем CDdescript.pas. 2.12.2. Для новой формы установите следующие свойства: BorderIcons.byMinimize = False, 2.12.3. Разместите на форме одну под другой три метки (компонент Label, страница Standard), назвав их, соответственно, (изменив их свойства Caption): "&Автор", "&Название" и "&Композиции" (если вас не устраивают такие названия, можете присвоить другие - что фантазия подскажет, например "Группешник", "Сидюшник" и "Хитюшники"). 2.12.4. Справа от первых двух меток разместите два компонента Edit (на той же вкладке), свойству Name первого присвойте значение CDAuthor, а второго - CDName (а вот тут уже без самодеятельности - эти названия не вздумайте изменять) и очистите у обоих свойство Text. 2.12.5. Под меткой "Композиции" разместите уже хорошо вам известный компонент StringGrid (без труда найдя его на странице Additional). Присвойте следующие значения его свойствам: Прежде чем устанавливать свойство FixedRows, измените ширину колонок (см. предыдущий номер журнала п. 1.18). Свойство Options.goEditing устанавливает в True для того, чтобы иметь возможность непосредственно редактировать строку сетки. Поскольку свойство FixedCols равно 2, что делает две левых колонки недоступными, то редактировать можно будет лишь колонку названий композиций (а что нам еще нужно?). 2.12.6. У меток "Автор", "Название" и "Композиции" (или что там вы напридумывали) свойству FocusControl присвойте значения (выбрав из раскрывающегося списка), соответственно: CDAuthor, CDName и List. Если эти свойства не установить - на работоспособности программы это не отразится, но будет потеряна возможность выбора строк редактирования при помощи клавиатурных эквивалентов (Alt+А и пр.). А хорошо разработанный интерфейс должен позволять выполнять любое действие как при помощи мыши, так и при помощи клавиатуры! Расширьте компоненты Edit, чтобы выровнять их по правому краю сетки строк. 2.12.7. Под списком строк разместите компонент Panel (страница Standard), очистите ее свойство Caption и установите следующие свойства (превратив, таким образом, в разделяющую бороздку): 2.12.8. Под "бороздкой" разместите две кнопки (компонент Button страницы Standard). Свойству Caption левой кнопки присвойте значение "&Сохранить", второй - "&Отмена". Для свойства ModalResult кнопки "Сохранить" из раскрывающегося списка выберите значение mrOk, для второй - mrCancel. Наконец, свойство Cancel кнопки "Отмена" установите в True (теперь отменить действие можно будет и нажатием на Esc). 2.12.9. Щелкните один раз по любому участку форму, не занятому компонентами. В Инспекторе объектов (Object Inspector) перейдите к закладке Events и дважды щелкните по свойству OnActivate (только щелкать надо не по названию, а по пустой строке ввода - она же раскрывающийся список, расположенной слева от названия свойства). В шаблон созданного обработчика введите между строками begin и end текст из врезки "Формирование сетки". 2.12.10. Переместитесь к строке {$R *.DFM} (директива компилятору для подключения внешнего описания формы) и под ней на новой строке введите: 2.12.11. Щелкните по закладке MainForm Редактора Кода (Code Editor). Здесь также найдите строку {$R *.DFM} и под ней введите: Чуете? Таким нехитрым способом вы осуществили взаимную ссылку одного модуля на другой (а того, в свою очередь, на первый). Но делать это можно лишь в секции реализации модуля (под строкой {$R *.DFM}). Если такую штуку проделать в секции интерфейса, то компилятор выдаст сообщение об ошибке. Теперь пара слов о методе AddSongsToList ( см. предыдущий Upgrade п. 2.7 ) главной формы MPForm, вернее не о самом методе, а о том, для чего он помещен в секцию public описания формы. Дело в том, что этот метод нам понадобился для заполнения сетки строк второй формы ( см.2.12.9 ). Если бы его описание было помещено в секции private главной формы, то вторая форма его бы не "увидела", ибо в эту секцию помещаются внутренние методы и свойства, недоступные извне. Для этого, кстати, в модуле CDdescript и понадобилось подключение модуля MainForm. Обычно этого не требуется (кстати замечу: если вы забудете выполнить подключения, умница Delphi заметит это при компиляции и сама предложит выполнить связь с модулем дополнительной формы). 2.12.12. Выровняйте все компоненты второй формы, сверившись с рисунком и сохраните проект. 2.13. Ну а теперь - главное. Как именно отличить один CD от другого? Идентифицировать CD (то есть отличить его от других) не так уж сложно. Можно сделать следующее утверждение: количество треков на диске и время звучания каждого из них (именно в данной последовательности) - величина постоянная и уникальна для каждого диска. Следовательно, с идентификацией диска особых проблем возникнуть не должно. Другой вопрос - как именно хранить информацию о CD? Можно, конечно, для этих целей разработать небольшую базу данных. Но в данном проекте (помимо даже фактора объема материала, который можно изложить в одной статье) этот подход излишне сложен - информация имеет уж больно простую структуру. Лучшим будет способ хранения в обычном ASCII-файле (текстовом файле) в виде последовательности строк - каждая новая строка описывает очередной CD. Чтобы программно можно было вычленить из строки нужное информационное поле, все поля в строке должны отделяться одно от другого специальными символами разделителями. Для этого потребуется специальная функция, которая будет возвращать из общей строки ограниченную разделителями подстроку указанного номера. В модуле MainForm переместитесь на самый верх к секции объявления констант (const) и под объявлением сообщений введите такой текст: Чуть дальше вы поймете, почему понадобилось целых три символа-разделителя. Константа FILE_NAME - это имя дискового файла, в котором будет храниться информация о CD. Как вы понимаете, это имя может быть любым. Вы можете изменить его здесь и на работоспособности программы это никак не отразится (вот чем хорошо использование именованных константа вместо использования в тексте конкретных значений). Точно также, кстати, можно ввести и другие символы-разделители (только выбирать нужно такие, которые не встретятся в названиях дисков и композиций). 2.14. Переместитесь в секцию реализации и сразу после строки uses CDdescript; введите код из врезки "Описание компакт-диска". Функция FoundPos носит вспомогательное значение и используется в GetSubString для поиска в строке позиции символа-разделителя. Функция GetSubString возвращает из строки S подстроку номер Num, обрамленную разделителем Delim. Поскольку с алгоритмической точки зрения здесь все очевидно и собственно к Delphi отношения не имеет, предлагаю разобрать ее самостоятельно (или воспринимать как таинственное заклинание продвинутых друидов, вызывающих духов персонального компьютера). 2.15. Договоримся о структуре строки, хранящейся в файле. Пусть она состоит из пяти полей, разделенных символом CH_TILDA: В секции описания композиций одно описание от другого отделяется символом CH_ZERO и состоит из трех, разделенных символом CH_VERT полей: Теперь у нас имеется все, чтобы наконец-то описать текст обработчиков сообщений WM_SCANCD и WM_UNKNOWNCD. Найдите в модуле MainForm заглушки обработчиков ( см. предыдущий номер журнала п. 2.10 ). Вместо строк begin - end метода TMPForm.ScanCD введите код из врезки "База компакт-дисков". В этом методе организован цикл WHILE DO по всем строкам, загруженным в список CD ( см. предыдущий номер журнала п. 2.4 ). В каждой очередной строке получается информация (с помощью функции GetSubString) о длине CD и количестве композиций. Если она совпадает с той, что в данный момент хранится в компоненте MediaPlayer (Player), организуется еще один - внутренний цикл WHILE DO, в котором также с помощью GetSubString получается информация о времени звучания каждой композиции и сверяется со значением массива TrackLength, который хранит информацию о композициях текущего диска. В конечном итоге - после всех этих циклов - переменная Found будет содержать True, если тестируемый диск с успехом выдержал испытание (в этом случае в главной форме выводится информация о нем - описание метода ShowSongsName см. п. 2.18 ) и False, если диск опознан, как неизвестный (в этом случае он сбивается ракетой класса "земля-воздух":)) Ха-ха, нет, в этом случае программа с помощью стандартной функции MessageDlg информирует пользователя о ситуации и спрашивает его разрешение добавить описание диска в базу. 2.16. Перейдите в главной форме к заглушке TMPForm.UnknownCD и введите вместо строк begin - end код из врезки "Ввод описания". Метод ShowModal - стандартный метод любой формы, предназначенный для вывода ее на экран. Метод возвращает mrOk, если пользователь нажал кнопку Ok (кнопка, свойство которой ModalResult, равна mrOk - см. 2.12.8 ) в вызываемой форме. Если это произошло, новое описание сохраняется в списке строк (CD.Add), затем весь список сохраняется в файле на диске (CD.SaveToFile) и вновь посылается сообщение (SendMessage) WM_SCANCD,в результате чего в главной форме будет выведена только что введенная информация. При формировании сохраняемой строки используется еще не описанный нами метод DescriptionCD. 2.17. Введите в разделе private описания главной формы следующие строки: Этот метод используется (см. 2.15) для заполнения сетки строк главной формы названиями композиций. 2.19. Нажмите F12, чтобы перейти к шаблону, и сделайте активной саму форму. На странице Events Инспектора объектов дважды щелкните по событию OnCreate и введите следующий текст в созданном шаблоне (между строками begin и end): Вновь перейдите к Инспектору Объектов, создайте шаблон для события OnClose и введите следующую строку: 2.20. И наконец, еще несколько коротких обработчиков. Дело в том, что, несмотря на имеющийся список треков, до сих пор еще нельзя запускать произвольную композицию. Чтобы можно было двойным щелчком по любой строке (или нажатием Enter) запускать нужную песню, перейдите к шаблону главной формы, сделайте активным сетку строк и создайте шаблон для обработчика события OnDblClick (двойной щелчок мышью). Введите в шаблоне код приведенный во врезке с соответствующим названием -"Обработка двойного щелчка". Теперь для этой же сетки строк создайте обработчик события OnKeyPress и введите: В созданном шаблоне введите следующее: 2.21. Последнее. Выберите пункт меню File > New. В появившемся окне New Items на странице New дважды щелкните по пиктограмме Text. Выберите пункт File > Save As и сохраните пустой текстовый файл в том же каталоге, что и весь проект под именем, присвоенном константе FILE_NAME (см. 2. 13). Сохраните проект. Перед этим рекомендую изменить пиктограмму проекта - я полагаю, что при помощи программы, рассмотренной в статье Килограмм пиктограмм вы уже создали свою замечательную коллекцию. Наконец-то!Уф-ф-ф! Это все - можете слушать и попутно составлять описание вашей аудиотеки. Но, во-первых, мы же пока еще учимся, так сказать овладеваем знаниями по работе с Delphi, во-вторых, сам факт того, что можно своими руками и малой кровью сконструировать программу, не уступающую профессиональной разработке такого гиганта, как Microsoft, чего-нибудь да значит. Ну, и в-третьих, только что созданный проект лучше, чем его "майкрософтовский" аналог тем, что можно расширять его свойства. Как? А для этого нужно продолжать изучение библиотеки визуальных компонентов среды Delphi. Так что следите за публикациями.
Источник: http://www.computery.ru/upgrade/
| |||||||||||||||||||||
Copyright © "Internet Zone", http://www.izcity.com/, info@izcity.com |