Фоновая музыка в Delphi-приложении.
Настало время разобраться с фоновой музыкой в Delphi-приложениях
🕛 25.03.2008, 12:24
Привет! Настало время разобраться с фоновой музыкой в Delphi-приложениях. Ты, наверно, сразу скажешь : "Дак можно просто взять TMediaPlayer и сделать его невидимым". Можно. Я не спорю. Но так прога будет кушать больше ресурсов компьютера. Да и звуковые файлы отдельно от EXE-шника таскать не удобно : могут изменить или вообще удалить.Сегодня я покажу тебе, как запихать WAV-файлы в EXE-шник и как возпроизвести их без компонента MediaPlayer. Если ты готов, то создовай новый проект и сразу сохроняй его в отдельную директорию.
Ресурсы.
Начнём мы с файла-ресурсов. Подбири какие-нибудь звуки. Я назвал их Sound01 и Sound02. Теперь создовай в директории своего проекта текстовый файл со следующим содержанием:
Sound01 RCDATA LOADONCALL Sound01.wav
Sound02 RCDATA LOADONCALL Sound02.wav
Как ты наверно уже понял, это названия и пути к файлам. У нас файлы храняться прямо в каталоге с ресурсом, так что путь указывать необязательно, а достаточно просто указать имя. В данном примере два файла - Sound01 и Sound02. Но ты можешь запихать их туда сколько угодно, хоть альбом своего любимого певца smile
Теперь переиминовывай наш текстовый файл в "Sound.rc". Так. Теперь надо всё это дело скомпилировать. Компилить ресурсы будем через BRCC32.exe (Borland Resource CommandLine Compiler), который идёт в стандартной поставке Delphi. В качестве параметра нужно указывать путь и имя файла ресурсов. В нашем случае нужно выполнить строку:
C:\-директория Delphi-\BIN\BRCC32.EXE C:\-директория проекта-\Sound.rc
В случае удачного стечения обстоятельств (ого, как завернул!), всмысле если всё прошло нормально, то в каталоге нашей программы появиться файл "Sound.res". Теперь его надо привязать к нашему проекту...
Кодим.
Итак, файл ресурсов создан. Теперь, в проекте после строки {$R *.dfm} нужно добавить ещё строку {$R Sound.res} . Этими действиями мы линкуем (привязываем) наш файл ресурсов к EXE-шнику, т.е. при компиляции проекта все файлы из ресурса встроятся в тело программы.
Теперь начнём работу с этими ресурсами. Сначала добавь в раздел uses ещё один модуль MMSystem, он нам пригодится для воспроизведения WAV-файлов.
Давай сначала напишем процедуру воспроизведения файла из ресурсов. У меня она получилась вот такой :
procedure PlayWAVfromRES(name:PAnsiChar); var hResource: THandle; pData: Pointer;//указатель на ресурс begin hResource:=LoadResource( hInstance, FindResource(hInstance, name, RT_RCDATA)); pData := LockResource(hResource); SndPlaySound(pData, SND_MEMORY); FreeResource(hResource); end;
Здесь всё просто : сначала получаем хендл ресурса при помощи функции LoadResource. В качестве второго параметра, передаваемого этой функции, идёт результат функции FindResource. Эта функция отыскивает нужный нам ресур по его имени (в данном случае это переменная name). Потом указываем нашему указателю на ресурс. А при помощи SndPlaySound(pData, SND_MEMORY); мы проигрываем полученный файл. Ну а последней строкой мы освобождаем файл-ресурс из памяти.
Теперь добавь к форме кнопочку и создай обработчик нажатия этой кнопки. Впиши в него следующее:
PlayWAVfromRES('Sound01');
Это вызов нашей процедуры. В качестве единственного параметра указываем имя ресурса. Теперь можно сделать чтоб ещё один звук проигрывался при открытии приложения. Для этого создай обработчик события OnCreate нашей формы и впиши туда :
PlayWAVfromRES('Sound02');
Думаю, ты и сам понял, что здесь написано. Ну, вроде всё!