Универсальный проигрыватель WinMedia
Развитие эффективных способов воспроизведения музыкальной информации без потери качества. Требования к функциональным характеристикам, к надежности и безопасности, к составу и параметрам технических средств, к информационной и программной совместимости.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 03.12.2010 |
Размер файла | 496,0 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
- Содержание
- Введение.
- 1 Разработка системного проекта.
- 1.1 Назначение разработки.
- 1.2 Требования к функциональным характеристикам.
- 1.3 Требования к надежности и безопасности.
- 1.4 Требования к составу и параметрам технических средств.
- 1.5 Требования к информационной и программной совместимости.
- 2 Разработка технического проекта.
- 2.1 Построение диаграммы потоков данных.
- 2.2 Проектирование модели данных.
- 2.3 Детальное проектирование программного обеспечения.
- 3 Реализация.
- 3.1 Обоснование выбора средств разработки.
- 3.2 Описание основных программных модулей.
- 4 Тестирование программного продукта.
- Заключение.
- Приложение А
- Приложение Б.
- Библиография.6
- Введение
- На сегодняшний день деятельность людей всё в большей степени зависит от их информированности, способности эффективно использовать информацию. Наступило время, когда профессионал - юрист, инженер, экономист, социолог, журналист - уже с трудом справляются с потоком информации. Специалисту, чтобы на должном уровне выполнять свои обязанности, необходимы инструментарии и методология его применения для обработки информации. Это сравнимо с использованием средств передвижения: человек может пешком преодолевать любое расстояние, но современный темп жизни просто немыслим без применения автомобиля, поезда, самолёта и т.д. То же самое происходит в области информации: теоретически человек может сам переработать без компьютера любую информацию, но сделает это эффективнее с использованием специальных компьютерных технологий.
- Развитие эффективных способов воспроизведения музыкальной информации(без потери качества) тоже не стояло на месте: появившиеся виниловые пластинки были вскоре заменены на магнитные кассеты, последние в свою очередь быстро сменились оптическими дисками. Все это никак несмогло обойти персональный компьютер. Существует множество форматов хранения музыки и видео(mp3,wav,avi самые популярные из них). В данном курсовом проекте создается программа Универсальный проигрыватель Win media для воспроизведения аудио-, видео-форматов на компьютере.
- 1 Разработка системного проекта
- 1.1 Назначение разработки
Универсальный проигрыватель Win media позволяет воспроизвести аудио-, видео-форматы, вести мультимедиа библиотеку, сохранять плейлисты. Проигрыватель обладает интуитивно понятным интерфейсом и прост в эксплуатации.
На рисунке 1 Программа представлена виде начальной контекстной диаграммы потоков данных:
Рисунок 1 - Диаграмма потоков данных
1.2 Требования к функциональным характеристикам
Универсальный проигрыватель Win media должен воспроизводить популярные мультимедиа форматы (wav, mp3, mpg, wma, avi, mpeg).
После запуска программы необходимо указать необходимый мультимедиа файл с помощью окна открытия файла либо указать плейлист. Открытые файлы записываются в плейлист и сохраняются на жесткий диск. В последствии можно будет вновь загрузить сохраненный плейлист.
1.3 Требования к надежности
Универсальный проигрыватель Win media должен корректно воспроизводить мультимедиа файлы и бесперебойно работать на протяжении всего сеанса работы(воспроизведение мультимедиа файла)
1.4 Требования к составу и параметрам технических средств
Для нормального функционирования Универсальный проигрыватель Win media необходима следующая минимальная конфигурация ПК:
- частота процессора: 800 Мгц
- объем оперативной памяти: 64 мб
- необходимый объем свободного дискового пространства: 10 мб и размер базы данных.
- разрешение монитора: 800x600
- наличие CD-ROM или FDD.
1.5 Требования к информационной и программной совместимости
Данная программа предназначена для работы в следующих операционных системах: Windows 98 SE/2000/XP.
2. Разработка технического проекта
2.1 Построение диаграммы потоков данных
Целью построения диаграммы потоков данных является отображение процессов существующих в системе и связи между этими процессами, а так же процесс преобразования входных данных в выходной результат.
Основные элементы диаграммы потоков данных:
- Внешняя сущность - представляющая собой материальный предмет или физическое лицо, который является источником или приемником данных. Определение некоторого объекта в качестве внешней сущности указывает на то, что она находится за пределами границ анализируемой ИС.
- Система и подсистема. При построении модели сложной ИС она может быть представлена в самом общем виде на так называемой контекстной диаграмме в виде одной системы как единого целого, либо может быть декомпозирована на ряд подсистем.
- Процесс - представляет собой преобразование входных потоков данных в выходные в соответствии с определенным алгоритмом. Физически процесс может быть реализован различными способами: это может быть подразделение организации, выполняющее обработку входных документов и выпуск отчетов, программа, аппаратно реализованное логическое устройство и т.д.
- Накопитель данных - представляет собой абстрактное устройство для хранения информации, которую можно в любой момент поместить в накопитель и спустя некоторое время извлечь, причем способы помещения и извлечения могут быть любыми. Накопитель данных может быть реализован физически в виде таблицы в оперативной памяти, файла на магнитном носителе и т.д. Накопитель данных в общем случае является прообразом базы данных и описание хранящихся в нем данных должно быть увязано с информационной моделью.
- Поток данных - определяет информацию, передаваемую через некоторое соединение от источника к преемнику. Реальный поток данных может быть информацией, передаваемой по кабелю между двумя устройствами, пересылаемыми по почте письмами, магнитными лентами или дискетами, переносимыми с одного компьютера на другой и т.д.
Внешними сущностями в Универсальном проигрывателе Win media являются медиа файл, пользователь и сам плеер.
Задачей пользователя является: указание мультимедиа файла (процесс 1.2), занесение фалов в мультимедиа библиотеку(процесс 1.3).
Задачей плеера является открытие мультимедиа файла(процесс 1.5) и его воспроизведение (процесс 1.10).
При открытии пользователем нового файла автоматически создается плейлист.
При добавлении пользователем файла в мультимедиа библиотеку информация о файле записывается в библиотеку.
Впоследствии файлы из базы данных можно добавить в текущий плейлист.
Диаграмма потоков данных изображена на рисунке 2.
2.2 Проектирование модели данных
На основании диаграммы потоков данных строится концептуальная модель данных. В ней отображается подробное описание структуры данных, связи между объектами данных, структура этих связей.
Структура модели данных универсального проигрывателя Win media:
Таблица “библиотека мультимедиа файлов” - содержит информацию о добавленных в библиотеку мультимедиа файлах
Поле “Код” - уникальный идентификатор записи таблицы (ключевое поле)
Поля “ Название композиции”, “Исполнитель”, “Альбом” - имеют строковый тип и используются для хранения Названия композиции, Исполнителя и альбома мультимедиа файла.
Поле “Жанр” имеет целочисленный тип и используется для хранения кода жанра к которому принадлежит композиция.
Таблица “Жанры” - содержит перечень жанров.
Поле “Код” - уникальный идентификатор каждой записи таблицы (ключевое поле)
Поле “Жанр” - имеет строковый тип и содержит наименование жанра.
Модель данных универсального проигрывателя Win media изображена на рисунке 3.
2.3 Детальное проектирование программного обеспечения
Программа состоит из нескольких основных окон: Главного окна (в которой производится воспроизведение аудио файлов) и Видео окна (в которой производится воспроизведение видео фалов).
На рисунке 4 представлена главная форма программы для воспроизведения аудио файлов
Рисунок 4 - Форма приложения для воспроизведения аудио файлов.
На рисунке 5 представлена форма программы для воспроизведения видео файлов
Рисунок 5 - Форма приложения для воспроизведения видео файлов.
На рисунке 6 представлена диаграмма последовательностей экранных форм.
Символом 1 обозначено действие по вызову главной формы.
Символом 2 обозначено действие по вызову файла справочной системы, для получения какой-либо справочной информации по программе.
Символом 3 обозначено действие по вызову формы , отображающей сведения о программном продукте.
Символом 4. действие по завершению работы программы
На рисунке 7 представлена форма программы для редактирования/создания/сохранения плейлистов.
Рисунок 7 - Форма приложения для редактирования/создания/сохранения плейлистов.
На рисунке 8 представлена форма программы для изменение настроек проигрывателя.
Рисунок 8 - форма программы для изменение настроек проигрывателя.
3. Реализация
3.1 Обоснование выбора средств разработки
Для написания курсового проекта, я выбрал систему программирования Delphi 7.0.
Delphi - объектно-ориентированная, визуальная среда программирования, относящаяся к классу RAD - (Rapid Application Development _ «Средство быстрой разработки приложений») средств CASE - технологии. Delphi сделала разработку мощных приложений быстрым процессом.
При проектировании программы и добавлении на форму новых компонентов Delphi автоматически заносит необходимый программный код в модуль программы и подключает соответствующие библиотеки, избавляя разработчика от рутинной работы и позволяя сосредоточиться на написании
Отличительной особенностью Delphi является богатая библиотека визуальных компонентов (VCL). Эта библиотека объектов включает в себя стандартные объекты построения пользовательского интерфейса, объекты управления данными, графические объекты, объекты мультимедиа, диалоги и объекты управления файлами.
Еще Delphi позволяет добавить различные сторонние компоненты созданные сторонними разработчиками. В данной программе использовался компонент MMTOOL версии 7.0. Этот компонент позволяет облегчить создание программы для работы со звуком/видео.
Так же плюсом в пользу использования Delphi является удобный отладчик, который позволяет анализировать работу программы во время ее исполнения. С его помощью можно последовательно выполнять отдельные операторы исходного текста последовательно, наблюдая при этом, как меняются значения различных переменных.
3.2 Описание основных программных модулей
На рисунке 9 представлен алгоритм открытие файла
Символом 1 обозначено начало процедуры.
Символом 2 обозначены операторы открытия файла.
Символом 3 обозначен оператор условия принадлежности мультимедиа файла к видео файлу.
Символом 4 обозначен оператор воспроизведения файла в главной форме при значении «нет» в цикле под номером 3.
Символом 5 обозначен оператор открытия файла в специальной форме для видео файлов при значении «да» в цикле под номером 3.
Символом 5 обозначен оператор выхода из программы
На рисунке 10 представлен алгоритм занесения файла в библиотеку
Символом 1 обозначено начало процедуры.
Символом 2 обозначен открытие файла
Символом 3 обозначен цикл с предусловием выдающий запрос записывать ли файл в базу данных.
Символом 4 обозначен оператор, читающий информацию о файле.
Символом 5 обозначен условный оператор, заносящий полученную информацию в библиотеку.
Символом 6 обозначен оператор выхода из процедуры.
4 Тестирование программного продукта
Целью проведения тестирования является проверка правильности работы универсального проигрывателя Win Media.
Тестирование программы проводилось по мере написания ее модулей в процессе отладки, при стыковке написанных модулей и после окончания написания программы.
Тестирование программы осуществлялось на следующей аппаратной платформе:
Процессор: 2 Ггц
Объем оперативной памяти 512 Мб
Размер свободного дискового пространства 500 Мб
Для тестирования программы использовались операционные системы:
Windows XP SP2.
Тестирование программы проводилось в следующем порядке:
1. Проверка соответствия программы техническому заданию. При этом проверялось наличие и корректность выполнения программой функций описанных в техническом задании.
2. Проверка правильности выполнения вычислений. Для этого вычисления были предварительно рассчитаны вручную, а после сверены с результатами программы.
3. Проверка работы программы с граничными значениями. Для этого при работе программы вводились граничные данные, на что в ответ от программы были получены сообщения о некорректности введенных данных и просьбе ввести их заново.
4. Определение времени выполнения программой расчетов. При этом тестировались наиболее ресурсоемкие задачи - непосредственное проведение тестирования и построение отчетов. При этом программа показала хорошие показатели.
5. Проверка защищенности данных с которыми оперирует программ от посторонних пользователей. При этом использовались попытки выполнить действия приводящие и изменениям данных: редактирование, удаление. В ответ на эти действия программа предлагала ввести пароль. При ложном вводе пароля программа отказывала в доступе на модификацию данных.
6. Проверка работы всех пунктов меню и вызова всех экранных форм. При этом были проверены пункты меню на соответствие функций выполняемых ими их описанию.
7. Проверка работы программы на компьютерах различной конфигурации. Помимо указанной выше тестовой конфигурации программа была протестирована на следующей платформе:
- Процессор: 1200 Мгц
- Объем оперативной памяти 256 Мб
- Размер свободного дискового пространства 300 Мб
- Для тестирования программы использовалась операционная система: Windows 2000.
Заключение
На курсовое проектирование мне была предложена задача: создание Универсального проигрывателя win media
При разработке программного продукта была изучена предметная область для данной задачи, выявлены информационные потоки, на основании которых была построена диаграмма потоков данных.
Универсальный проигрыватель win media позволяет:
- Воспроизводить мультимедиа файлы различных форматов.
- Создавать плейлисты.
- Вести базу данных мультимедиа файлов.
Приложение А (обязательное)
Листинг программы.
Программа RadLe
unit UMain;
interface
uses
Windows,
Messages,
ShellAPI,
SysUtils,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
Buttons,
ComCtrls,
StdCtrls,
ExtCtrls,
Menus,
MMSystem,
MMUtils,
MMAbout,
MMObj,
MMDSPObj,
MMWaveIO,
MMMPType,
MMMPEG,
MMDesign,
MMWavOut,
MMDIBCv,
MMLevel,
MMConect,
MMSpectr,
MMHTimer,
MMSlider,
MMLEDS,
MMPanel,
MMSpin,
MMLEDLbl,
MMButton,
MMWave,
MMLabel,
MMVolume,
MMHook, MMPitch, MMAudio, MMWheel, MMAVI;
type
TMainForm = class(TForm)
OpenDialog: TOpenDialog;
WaveOut: TMMWaveOut;
MMDesigner1: TMMDesigner;
MMConnector1: TMMConnector;
HiTimer: TMMHiTimer;
MMPanel2: TMMPanel;
ButtonPanel: TMMPanel;
DisplayPanel: TMMPanel;
MMPanel7: TMMPanel;
MMLevelScale1: TMMLevelScale;
digit: TMMLEDDigit;
MMLevel2: TMMLevel;
MMLevel1: TMMLevel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
MMSpectrum1: TMMSpectrum;
ss1: TMMLEDDigit;
ss2: TMMLEDDigit;
mm1: TMMLEDDigit;
mm2: TMMLEDDigit;
btnStop: TMMSpeedButton;
btnPlay: TMMSpeedButton;
btnPause: TMMSpeedButton;
btnOpen: TMMSpeedButton;
btnPrev: TMMSpeedButton;
btnSkipL: TMMSpeedButton;
btnSkipR: TMMSpeedButton;
btnNext: TMMSpeedButton;
btnClose: TMMSpeedButton;
btnMenu: TMMSpeedButton;
btnIncVolume: TMMSpeedButton;
btnDecVolume: TMMSpeedButton;
Bevel1: TBevel;
btnPlayList: TMMSpeedButton;
Gauge: TMMLevel;
Bevel2: TBevel;
ledMode: TMMLEDMode;
ledRate: TMMLEDPanel;
Label18: TLabel;
lblBitRate: TLabel;
ledBitRate: TMMLEDPanel;
lblLayer: TLabel;
lblLayer2: TLabel;
lblFile: TMMLEDLABEL;
PopupMenu: TPopupMenu;
Preferences1: TMenuItem;
N1: TMenuItem;
Play1: TMenuItem;
Stop1: TMenuItem;
Pause1: TMenuItem;
N2: TMenuItem;
Previous1: TMenuItem;
Next1: TMenuItem;
N3: TMenuItem;
PlayList1: TMenuItem;
WaveFile: TMMWaveFile;
N4: TMenuItem;
Info1: TMenuItem;
ImageEOF: TImage;
ImageState: TImage;
MPEGFile: TMMMPEGFile;
SpeedButton1: TSpeedButton;
N5: TMenuItem;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure HiTimerTimer(Sender: TObject);
procedure WaveOutStop(Sender: TObject);
procedure btnCloseClick(Sender: TObject);
procedure btnOpenClick(Sender: TObject);
procedure btnStopClick(Sender: TObject);
procedure btnPauseClick(Sender: TObject);
procedure btnPlayClick(Sender: TObject);
procedure btnPrevClick(Sender: TObject);
procedure btnSkipLClick(Sender: TObject);
procedure btnSkipRClick(Sender: TObject);
procedure btnNextClick(Sender: TObject);
procedure btnDecVolumeClick(Sender: TObject);
procedure btnIncVolumeClick(Sender: TObject);
procedure btnPlayListClick(Sender: TObject);
procedure WaveOutStart(Sender: TObject);
procedure MMPanelMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure MMPanelMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
procedure MMPanelMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure GaugeMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
Приложение А (продолжение)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure btnMenuClick(Sender: TObject);
procedure PopupMenuPopup(Sender: TObject);
procedure PreferencesClick(Sender: TObject);
procedure Info1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure WaveOutPause(Sender: TObject);
procedure WaveOutRestart(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure N5Click(Sender: TObject);
public
oMin, oSec: Word;
Dragging: Boolean;
DragStart: TPoint;
Seeking: Boolean;
OldTime,CurTime: Longint;
PlayListName: TFileName;
PlayList : TStringList;
PlayIndex: integer;
IncPlayList: Boolean;
DisplayColor: TColor;
TimeCnt : Longint;
procedure LoadImage(Image: TImage; Name: PChar);
procedure DrawTime(Time: Longint);
procedure SetFileParams;
function LoadFile(FileName: TFileName): Boolean;
function AddFile(FileName: TFileName): Boolean;
procedure SelectFile(index: integer);
procedure WMNCHitTest(var Msg: TWMNCHitTest); message WM_NCHitTest;
procedure WMDropFiles(var Msg: TMessage); message WM_DropFiles;
procedure LoadSettings;
procedure SaveSettings;
procedure DrawLevelBar(Sender: TObject; DIB: TMMDIBCanvas; Rect: TRect; nSpots,Peak: integer);
end;
var
MainForm: TMainForm;
implementation
{$R *.DFM}
{$R IMAGE.RES}
uses upref,ulist, UMe, UVideo;
const
REGBASENAME = 'Software\SwiftSoft\MPEGPlay';
procedure TMainForm.WMNCHitTest(var Msg: TWMNCHitTest);
begin
inherited; { is the click in the client area? }
if (Msg.Result = htClient) then { if so, make Windows think it's }
Msg.Result := htCaption; { on the caption bar. }
end;
procedure TMainForm.LoadImage(Image: TImage; Name: PChar);
begin
with Image.Picture do
begin
{ load the bitmap }
Bitmap.Handle := LoadBitmap(hInstance,Name);
Приложение А (продолжение)
{ change the black/white resource to a colored bitmap }
ChangeColors(Bitmap,False,DisplayColor,clBlack,clBlack);
end;
end;
procedure TMainForm.LoadSettings;
var
L,T: integer;
begin
try
L := (Screen.Width-Width) div 2;
T := (Screen.Height-Height) div 2;
Left := GetFromRegistry(HKEY_CURRENT_USER, REGBASENAME, 'Left', L);
Top := GetFromRegistry(HKEY_CURRENT_USER, REGBASENAME, 'Top', T);
WaveOut.NumBuffers := GetFromRegistry(HKEY_CURRENT_USER, REGBASENAME, 'Buffers', WaveOut.NumBuffers);
WaveOut.BufferSize := GetFromRegistry(HKEY_CURRENT_USER, REGBASENAME, 'BufferSize', WaveOut.BufferSize);
WaveOut.DeviceID := GetFromRegistry(HKEY_CURRENT_USER, REGBASENAME, 'DeviceID', WaveOut.DeviceID);
WaveOut.CallBackMode := GetFromRegistry(HKEY_CURRENT_USER, REGBASENAME, 'CBMode', WaveOut.CallBackMode);
except
end;
end;
procedure TMainForm.SaveSettings;
begin
SaveInRegistry(HKEY_CURRENT_USER, REGBASENAME, 'Left', Left);
SaveInRegistry(HKEY_CURRENT_USER, REGBASENAME, 'Top', Top);
SaveInRegistry(HKEY_CURRENT_USER, REGBASENAME, 'Buffers', WaveOut.NumBuffers);
SaveInRegistry(HKEY_CURRENT_USER, REGBASENAME, 'BufferSize', WaveOut.BufferSize);
SaveInRegistry(HKEY_CURRENT_USER, REGBASENAME, 'DeviceID', WaveOut.DeviceID);
SaveInRegistry(HKEY_CURRENT_USER, REGBASENAME, 'CBMode', WaveOut.CallBackMode);
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
MMLevel1.DIBCanvas.BackGroundBitmap.LoadFromResourceName(hInstance,'BM_BAR1');
MMLevel2.DIBCanvas.BackGroundBitmap.LoadFromResourceName(hInstance,'BM_BAR1');
MMSpectrum1.DIBCanvas.BackGroundBitmap.LoadFromResourceName(hInstance,'BM_BAR2');
MMLevel1.DIBCanvas.PaletteRealize := True;
MMLevel2.DIBCanvas.PaletteRealize := True;
MMSpectrum1.DIBCanvas.PaletteRealize := True;
DragAcceptFiles(Handle,True);
PlayListName := 'noname.m3u';
PlayList := TStringList.Create;
PlayIndex := 0;
DisplayColor := clLime;
LoadImage(ImageEOF,'BM_EOF');
LoadImage(ImageState,'BM_PLAY');
LoadSettings;
MMLevel1.OnDrawBar := DrawLevelBar;
MMLevel2.OnDrawBar := DrawLevelBar;
MMSpectrum1.OnDrawBar := DrawLevelBar;
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
PlayList.Free;
end;
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
IncPlayList := False;
WaveOut.Close;
Приложение А (продолжение)
SaveSettings;
end;
procedure TMainForm.FormShow(Sender: TObject);
begin
if (ParamStr(1) <> '') then
if LoadFile(ParamStr(1)) then
begin
btnPlayClick(nil);
end
else MessageDlg(ParamStr(1)+' is not a valid Audiofile',mtError, [mbOK],0);
end;
procedure TMainForm.WMDropFiles(var Msg: TMessage);
var
i,cnt: integer;
Buf: array[0..255]of Char;
begin
try
cnt := DragQueryFile(Msg.wParam,$FFFFFFFF,@Buf,255);
if (cnt > 0) then
begin
IncPlayList := False;
WaveOut.Stop;
PlayList.Clear;
for i := 0 to cnt-1 do
begin
DragQueryFile(Msg.wParam,i,@Buf,255);
if not AddFile(StrPas(Buf)) then
MessageDlg(StrPas(Buf)+' is not a valid Audiofile',mtError, [mbOK],0);
end;
PlayIndex := 0;
SelectFile(0);
if (PlayList.Count > 0) then btnPlayClick(nil);
end;
finally
DragFinish(Msg.wParam);
end;
end;
{-- TMainForm -----------------------------------------------------------}
procedure TMainForm.DrawTime(Time: Longint);
Var
Hour, Min, Sec, MSec: Word;
begin
{ Display the "Time" }
TimeDecode(Time, Hour, Min, Sec, MSec);
if (oSec <> Sec) then
begin
ss1.Value := Sec;
oSec := Sec;
end;
if (oMin <> Min) then
begin
mm1.Value := Min;
oMin := Min;
end;
end;
{-- TMainForm -----------------------------------------------------------}
procedure TMainForm.SetFileParams;
begin
Приложение А (продолжение)
if not MpegFile.Empty then
with MpegFile do
begin
ss1.Enabled := True;
ss2.Enabled := True;
mm1.Enabled := True;
mm2.Enabled := True;
digit.Enabled:= True;
lblFile.Caption := IntToStr(PlayIndex+1)+':'+UpperCase(ExtractFileName(Filename));
ledRate.Value := PlaybackRate div 1000;
ledRate.Enabled := True;
lblLayer.Visible := True;
lblLayer2.Visible := True;
case Layer of
1: lblLayer2.Caption := 'I';
2: lblLayer2.Caption := 'II';
3: lblLayer2.Caption := 'III';
end;
if (Mode = smJointStereo) or (Mode = smStereo) then
ledMode.Mode := mStereo
else
ledMode.Mode := mMono;
ledMode.Enabled := True;
ledBitRate.Value := BitRate;
ledBitRate.Enabled := True;
lblBitRate.Caption := 'KBit/s';
end
else if not WaveFile.Wave.Empty then
with WaveFile.Wave do
begin
ss1.Enabled := True;
ss2.Enabled := True;
mm1.Enabled := True;
mm2.Enabled := True;
digit.Enabled:= True;
lblFile.Caption := IntToStr(PlayIndex+1)+':'+UpperCase(ExtractFileName(Filename));
ledRate.Value := SampleRate div 1000;
ledRate.Enabled := True;
lblLayer.Visible := False;
lblLayer2.Visible := False;
ledMode.Mode := Mode;
ledMode.Enabled := True;
ledBitRate.Value := BitLength;
ledBitRate.Enabled := True;
lblBitRate.Caption := 'Bit';
end
else
begin
ss1.Enabled := False;
ss2.Enabled := False;
mm1.Enabled := False;
mm2.Enabled := False;
digit.Enabled:= False;
lblFile.Caption := 'Нет Файла';
ledRate.Enabled := False;
lblLayer.Visible := False;
lblLayer2.Visible := False;
ledMode.Enabled := False;
ledBitRate.Enabled:= False;
end;
Приложение А (продолжение)
end;
{-- TMainForm -----------------------------------------------------------}
procedure TMainForm.HiTimerTimer(Sender: TObject);
var
Time: Longint;
begin
MMConnector1.Trigger;
inc(TimeCnt);
if (TimeCnt mod 5 = 0) and (wosPlay in Waveout.State) and not Seeking then
begin
Time := WaveOut.Position;
inc(CurTime,Time-OldTime);
DrawTime(CurTime);
OldTime := Time;
if not MpegFile.Empty then
begin
Gauge.Value := MulDiv(MpegFile.Position, 100, MpegFile.Frames);
ImageEOF.Visible := MpegFile.Position >= MpegFile.Frames;
end
else
begin
Gauge.Value := MulDiv(WaveFile.Wave.Position, 100, WaveFile.Wave.DataSize);
ImageEOF.Visible := WaveFile.Wave.Position >= WaveFile.Wave.DataSize;
end;
end;
end;
{-- TMainForm -----------------------------------------------------------}
procedure TMainForm.WaveOutStart(Sender: TObject);
begin
TimeCnt := 0;
HiTimer.Enabled := True;
LoadImage(ImageState,'BM_PLAY');
ImageState.Visible := True;
end;
{-- TMainForm -----------------------------------------------------------}
procedure TMainForm.WaveOutStop(Sender: TObject);
begin
HiTimer.Enabled := False;
WaveOut.Close;
Seeking := False;
DrawTime(0);
Gauge.Value := 0;
ImageEOF.Visible := False;
ImageState.Visible := False;
if IncPlayList then
begin
if (PlayIndex < PlayList.Count-1) then
begin
inc(PlayIndex);
SelectFile(PlayIndex);
WaveOut.Start;
end
else
begin
PlayIndex := 0;
SelectFile(PlayIndex);
end;
end;
end;
{-- TMainForm -----------------------------------------------------------}
procedure TMainForm.WaveOutPause(Sender: TObject);
Приложение А (продолжение)
begin
LoadImage(ImageState,'BM_PAUSE');
end;
{-- TMainForm -----------------------------------------------------------}
procedure TMainForm.WaveOutRestart(Sender: TObject);
begin
LoadImage(ImageState,'BM_PLAY');
end;
{-- TMainForm -----------------------------------------------------------}
function TMainForm.LoadFile(FileName: TFileName): Boolean;
begin
Result := False;
if (FileName <> '') and FileExists(FileName) then
begin
PlayIndex := 0;
PlayList.Clear;
MpegFile.FileName := '';
WaveFile.Wave.FileName := '';
if IsMpegFile(FileName) or wioIsWaveFile(FileName, RIFF_FILE) then
begin
PlayListName := 'noname.m3u';
PlayList.Add(FileName);
end
else
begin
PlayListName := FileName;
LoadPlayList(FileName,PlayList);
end;
Result := (PlayList.Count > 0);
SelectFile(0);
end;
caption := filename;
end;
{-- TMainForm -----------------------------------------------------------}
function TMainForm.AddFile(FileName: TFileName): Boolean;
begin
Result := False;
if (FileName <> '') and FileExists(FileName) then
begin
if IsMpegFile(FileName) or wioIsWaveFile(FileName, RIFF_FILE) then
begin
PlayList.Add(FileName);
Result := True;
end
else
begin
Result := LoadPlayList(FileName,PlayList);
end;
end;
end;
{-- TMainForm -----------------------------------------------------------}
procedure TMainForm.SelectFile(index: integer);
var
FileName: TFileName;
begin
MpegFile.FileName := '';
WaveFile.Wave.FileName := '';
if (index >= 0) and (index < PlayList.Count) then
begin
FileName := PlayList[index];
Приложение А (продолжение)
if (FileName <> '') and FileExists(FileName) then
begin
if IsMpegFile(FileName) then
begin
MpegFile.FileName := FileName;
WaveOut.Input := MpegFile;
end
else if wioIsWaveFile(FileName, RIFF_FILE) then
begin
WaveFile.Wave.FileName := FileName;
WaveOut.Input := WaveFile;
end
end;
CurTime := 0;
OldTime := 0;
end;
SetFileParams;
end;
{-- TMainForm -----------------------------------------------------------}
procedure TMainForm.PopupMenuPopup(Sender: TObject);
begin
{ adjust menu entrys }
PopupMenu.Items[6].Enabled := PlayList.Count > 1;
PopupMenu.Items[7].Enabled := PlayList.Count > 1;
if (wosPlay in WaveOut.State) then
begin
PopupMenu.Items[0].Enabled := False;
PopupMenu.Items[2].Caption := '&Рестарт';
PopupMenu.Items[3].Enabled := True;
PopupMenu.Items[4].Enabled := True;
end
else
begin
PopupMenu.Items[0].Enabled := True;
PopupMenu.Items[2].Caption := '&Воспроизвести';
PopupMenu.Items[3].Enabled := False;
PopupMenu.Items[4].Enabled := False;
end;
if (wosPause in WaveOut.State) then
PopupMenu.Items[3].Caption := '&Пауза'
else
PopupMenu.Items[3].Caption := '&Пауза';
end;
{-- TMainForm -----------------------------------------------------------}
procedure TMainForm.PreferencesClick(Sender: TObject);
begin
with TPreferencesForm.Create(Self) do
try
ShowModal;
finally
Free;
end;
end;
{-- TMainForm -----------------------------------------------------------}
procedure TMainForm.btnOpenClick(Sender: TObject);
var
Idx: WORD;
begin
if (OpenDialog.Execute) and (opendialog.FileName = '*.avi') then
begin
Video.Show;
Video.Visible:=true;
mainform.Visible:=false;
if video.AVIOpenDialog.Execute then
Приложение А (продолжение)
begin
video.AVIFile.FileName := opendialog.FileName;
video.Caption := ExtractFileName(opendialog.FileName);
video.AVIFile.OpenFile;
video.AVIControl.FreeStreams;
video.AVIControl.AddFile(video.AVIFile);
video.AVIDisplay.Refresh;
video.Icon.Handle := ExtractassociatedIcon(0,PChar(opendialog.FileName),Idx);
end;
end
else
if OpenDialog.Execute then
begin
IncPlayList := False;
WaveOut.Stop;
if not LoadFile(OpenDialog.FileName) then
MessageDlg('Итс файл из нот карренли',mtWarning, [mbOK],0);
SetFileParams;
end;
end;
{-- TMainForm -----------------------------------------------------------}
procedure TMainForm.btnCloseClick(Sender: TObject);
begin
if (MessageDlg('ВЫ дестительно хотите выйте из программы??', mtConfirmation, [mbYes, mbNo], 0) = mrYes) then
Close;
end;
procedure TMainForm.btnMenuClick(Sender: TObject);
var
P: TPoint;
begin
P := ButtonPanel.ClientToScreen(Point(btnMenu.Left,btnMenu.Top+btnMenu.Height));
PopupMenu.Popup(P.X,P.Y);
end;
procedure TMainForm.btnPlayClick(Sender: TObject);
begin
if (PlayList.Count = 0) then
begin
btnOpenClick(nil);
Refresh;
end;
IncPlayList := False;
if (PlayList.Count > 0) then
begin
if not (wosPlay in WaveOut.State) then
begin
SelectFile(PlayIndex);
WaveOut.Start;
end
else if (wosPause in WaveOut.State) then
WaveOut.Restart
else
begin
WaveOut.Stop;
WaveOut.Start;
end;
end;
Приложение А (продолжение)
IncPlayList := True;
end;
{-- TMainForm -----------------------------------------------------------}
procedure TMainForm.btnPauseClick(Sender: TObject);
begin
if (wosPlay in WaveOut.State) then
begin
if (wosPause in WaveOut.State) then
WaveOut.Restart
else
WaveOut.Pause;
end;
end;
{-- TMainForm -----------------------------------------------------------}
procedure TMainForm.btnStopClick(Sender: TObject);
begin
IncPlayList := False;
WaveOut.Stop;
end;
//предыдущая композиция
procedure TMainForm.btnPrevClick(Sender: TObject);
begin
IncPlayList := False;
if (PlayIndex > 0) then
begin
dec(PlayIndex);
if (wosPlay in WaveOut.State) then
begin
WaveOut.Stop;
SelectFile(PlayIndex);
WaveOut.Start;
end
else SelectFile(PlayIndex);
end;
IncPlayList := True;
end;
////следующая композиция
procedure TMainForm.btnNextClick(Sender: TObject);
begin
IncPlayList := False;
if (PlayIndex < PlayList.Count-1) then
begin
inc(PlayIndex);
if (wosPlay in WaveOut.State) then
begin
WaveOut.Stop;
SelectFile(PlayIndex);
WaveOut.Start;
end
else SelectFile(PlayIndex);
end;
IncPlayList := True;
end;
{-- TMainForm -----------------------------------------------------------}
procedure TMainForm.GaugeMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
aPos: Longint;
Приложение А (продолжение)
begin
if (wosOpen in WaveOut.State) then
begin
Seeking := True;
WaveOut.Pause;
if not MpegFile.Empty then
begin
with Gauge do
aPos := MulDiv(X-BevelExtend,MpegFile.Frames,(Width-2*BevelExtend)-1);
if aPos >= MpegFile.Frames then
begin
WaveOut.Stop;
exit;
end
else
begin
MpegFile.Position := aPos;
CurTime := MpegFile.Position*MpegFile.TimePerFrame;
end;
end
else
begin
with Gauge do
aPos := MulDiv(X-BevelExtend,WaveFile.Wave.DataSize,(Width-2*BevelExtend)-1);
if aPos > WaveFile.Wave.DataSize then
begin
WaveOut.Stop;
exit;
end
else
begin
WaveFile.Wave.Position := aPos;
CurTime := WaveFile.Wave.Position;
end;
end;
WaveOut.Reset;
WaveOut.Restart;
OldTime := 0;
Seeking := False;
end;
end;
{-- TMainForm -----------------------------------------------------------}
procedure TMainForm.btnSkipLClick(Sender: TObject);
begin
if (wosPlay in WaveOut.State) then
begin
Seeking := True;
WaveOut.Pause;
if not MpegFile.Empty then
begin
MpegFile.Position := MpegFile.Position-(5000 div MpegFile.TimePerFrame);
CurTime := MpegFile.Position*MpegFile.TimePerFrame;
end
else
begin
WaveFile.Wave.Position := WaveFile.Wave.Position-5000;
CurTime := WaveFile.Wave.Position;
end;
WaveOut.Reset;
WaveOut.Restart;
OldTime := 0;
Seeking := False;
end;
end;
{-- TMainForm -----------------------------------------------------------}
procedure TMainForm.btnSkipRClick(Sender: TObject);
Приложение А (продолжение)
begin
if (wosPlay in WaveOut.State) then
begin
if not MpegFile.Empty then
begin
if MpegFile.Position+(5000 div MpegFile.TimePerFrame) > MpegFile.Frames then
WaveOut.Stop;
end
else
begin
if WaveFile.Wave.Position+5000 > WaveFile.Wave.DataSize then
WaveOut.Stop;
end;
Seeking := True;
WaveOut.Pause;
if not MpegFile.Empty then
begin
MpegFile.Position := MpegFile.Position+(5000 div MpegFile.TimePerFrame);
CurTime := MpegFile.Position*MpegFile.TimePerFrame;
end
else
begin
WaveFile.Wave.Position := WaveFile.Wave.Position+5000;
CurTime := WaveFile.Wave.Position;
end;
WaveOut.Reset;
WaveOut.Restart;
OldTime := 0;
Seeking := False;
end;
end;
{-- TMainForm -----------------------------------------------------------}
procedure TMainForm.btnDecVolumeClick(Sender: TObject);
var
Volume,L,R: Longint;
begin
if (wosOpen in WaveOut.State) then
begin
WaveOutGetVolume(WaveOut.Handle,@Volume);
L := LoWord(Volume);
R := HiWord(Volume);
L := Max(L - 5000,0);
R := Max(R - 5000,0);
Volume := (R shl 16) + L;
WaveOutSetVolume(WaveOut.Handle,Volume);
end;
end;
{-- TMainForm -----------------------------------------------------------}
procedure TMainForm.btnIncVolumeClick(Sender: TObject);
var
Volume,L,R: Longint;
begin
if (wosOpen in WaveOut.State) then
begin
WaveOutGetVolume(WaveOut.Handle,@Volume);
L := LoWord(Volume);
R := HiWord(Volume);
L := Min(L + 5000,$FFFF);
R := Min(R + 5000,$FFFF);
Volume := (R shl 16) + L;
WaveOutSetVolume(WaveOut.Handle,Volume);
Приложение А (продолжение)
end;
end;
{-- TMainForm -----------------------------------------------------------}
procedure TMainForm.btnPlayListClick(Sender: TObject);
var
wasPlaying: Boolean;
begin
with TPlayListEditor.Create(Self) do
try
if ShowModal = mrOK then
begin
IncPlayList := False;
wasPlaying := (wosPlay in WaveOut.State);
WaveOut.Stop;
PlayList.Assign(TempPlayList);
PlayListName := ListName;
PlayIndex := 0;
SelectFile(0);
if wasPlaying then btnPlayClick(nil);
end;
finally
Free;
end;
end;
{-- TMainForm -----------------------------------------------------------}
procedure TMainForm.MMPanelMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (Button = mbLeft) then
begin
Dragging := True;
DragStart := TControl(Sender).ClientToScreen(Point(X,Y));
end;
end;
{-- TMainForm -----------------------------------------------------------}
procedure TMainForm.MMPanelMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (Button = mbLeft) then Dragging := False;
end;
{-- TMainForm -----------------------------------------------------------}
procedure TMainForm.MMPanelMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
var
Diff: TPoint;
begin
if Dragging then
begin
Diff := TControl(Sender).ClientToScreen(Point(X,Y));
Diff := Point(Diff.X-DragStart.X,Diff.Y-DragStart.Y);
SetBounds(Left+Diff.X,Top+Diff.Y,Width,Height);
DragStart.X := DragStart.X+Diff.X;
DragStart.Y := DragStart.Y+Diff.Y;
end;
end;
{-- TMainForm -----------------------------------------------------------}
procedure TMainForm.Info1Click(Sender: TObject);
begin
autor.show;
end;
{-- TMainForm -----------------------------------------------------------}
Приложение А (продолжение)
procedure TMainForm.DrawLevelBar(Sender: TObject; DIB: TMMDIBCanvas; Rect: TRect; nSpots,Peak: integer);
begin
with DIB,Rect do
begin
if Sender = MMSpectrum1 then
begin
DIB_CopyDIBBits(MMSpectrum1.DIBCanvas.BackSurface,Left,Bottom-nSpots,Right-Left-1,Bottom,0,Bottom-nSpots);
DIB_CopyDIBBits(MMSpectrum1.DIBCanvas.BackSurface,Left,Bottom-Peak,Right-Left-1,2,0,Bottom-Peak);
end
else if Sender = MMLevel1 then
begin
DIB_SetTColor(MMLevel1.Color);
DIB_Clear;
DIB_CopyDIBBits(MMLevel1.DIBCanvas.BackSurface,0,Top,2*nSpots,Bottom,0,0);
DIB_CopyDIBBits(MMLevel1.DIBCanvas.BackSurface,2*Peak-2,Top,2,Bottom,2*Peak,0);
end
else
begin
DIB_SetTColor(MMLevel2.Color);
DIB_Clear;
DIB_CopyDIBBits(MMLevel2.DIBCanvas.BackSurface,0,Top,2*nSpots,Bottom,0,0);
DIB_CopyDIBBits(MMLevel2.DIBCanvas.BackSurface,2*Peak-2,Top,2,Bottom,2*Peak,0);
end;
end;
end;
procedure TMainForm.SpeedButton1Click(Sender: TObject);
begin
Application.Minimize;
end;
procedure TMainForm.N5Click(Sender: TObject);
begin
video.Show;
mainform.Visible:=false;
end;
end.
unit UMe;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, MMObj, MMLEDLbl, MMScroll, MMLEDS, ExtCtrls;
type
TAutor = class(TForm)
MMLEDLABEL1: TMMLEDLABEL;
MMLEDLABEL2: TMMLEDLABEL;
MMLEDLABEL3: TMMLEDLABEL;
MMLEDPanel1: TMMLEDPanel;
MMLEDLABEL4: TMMLEDLABEL;
MMLED1: TMMLED;
procedure MMLED1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Autor: TAutor;
implementation
Приложение А (продолжение)
{$R *.dfm}
procedure TAutor.MMLED1Click(Sender: TObject);
begin
close;
end;
end.
unit UML;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, Grids, DBGrids;
type
TML = class(TForm)
DBGrid1: TDBGrid;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
procedure N2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
ML: TML;
implementation
{$R *.dfm}
procedure TML.N2Click(Sender: TObject);
begin
close;
end;
end.
unit UDM;
interface
uses
SysUtils, Classes, DB, ADODB;
type
TDM = class(TDataModule)
DataSource1: TDataSource;
ADOCommand1: TADOCommand;
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
private
{ Private declarations }
public
{ Public declarations }
end;
var
DM: TDM;
implementation
{$R *.dfm}
end.
unit UList;
interface
uses
Windows,
SysUtils,
Messages,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
StdCtrls,
ExtCtrls,
FileCtrl,
Menus,
ComCtrls,
MMMPType,
MMMpeg,
MMWaveIO,
MMRiff;
type
TPlaylistEditor = class(TForm)
OKButton: TButton;
CancelButton: TButton;
MainMenu1: TMainMenu;
File1: TMenuItem;
Label5: TLabel;
Label6: TLabel;
PlayListBox: TListBox;
AddButton: TButton;
RemoveButton: TButton;
ClearButton: TButton;
RandomizeButton: TButton;
FileListBox: TFileListBox;
DirectoryListBox1: TDirectoryListBox;
DriveComboBox1: TDriveComboBox;
Bevel1: TBevel;
NewPlaylist1: TMenuItem;
OpenPlaylist1: TMenuItem;
SavePlaylist1: TMenuItem;
SavePlaylistAs1: TMenuItem;
AppendPlaylist1: TMenuItem;
N1: TMenuItem;
Exit1: TMenuItem;
OpenDialog: TOpenDialog;
SaveDialog: TSaveDialog;
InfoLabel: TLabel;
procedure ListMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure ListKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormShow(Sender: TObject);
procedure ListDrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ClearButtonClick(Sender: TObject);
procedure RandomizeButtonClick(Sender: TObject);
procedure AddButtonClick(Sender: TObject);
Приложение А (продолжение)
procedure RemoveButtonClick(Sender: TObject);
procedure ListDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure ListDragDrop(Sender, Source: TObject; X, Y: Integer);
procedure ListEndDrag(Sender, Target: TObject; X, Y: Integer);
procedure FormHide(Sender: TObject);
procedure Exit1Click(Sender: TObject);
procedure NewPlaylist1Click(Sender: TObject);
procedure OpenPlaylist1Click(Sender: TObject);
procedure SavePlaylist1Click(Sender: TObject);
procedure SavePlaylistAs1Click(Sender: TObject);
procedure AppendPlaylist1Click(Sender: TObject);
private
FListName : TFileName;
DragTarget: TListBox;
aTimer : TTimer;
aBitmap1 : TBitmap;
aBitmap2 : TBitmap;
aIcon : TIcon;
oldIndex : integer;
oldCaption: String;
procedure CreateParams(var Params: TCreateParams); override;
procedure SetListName(aValue: TFileName);
procedure SetButtons;
function FirstSelection(aList: TCustomListBox): Integer;
function LastSelection(aList: TCustomListBox): Integer;
function FindIndex(aList: TListBox; aPos: TPoint): integer;
procedure ClearSelected(aList: TCustomListBox);
procedure AddSelected(aIndex: integer);
procedure ResortSelected(aIndex: integer);
procedure RemoveSelected;
procedure DrawIndexPtr(oldIndex, newIndex: integer);
procedure DragTimerExpired(Sender: TObject);
procedure UpdatePlayListBox;
procedure SetFileInfo;
public
TempPlayList: TStringList;
ListChanged: Boolean;
property ListName: TFileName read FListName write SetListName;
end;
var
PlaylistEditor: TPlaylistEditor;
function LoadPlayList(FileName: TFileName; aPlayList: TStringList): Boolean;
function SavePlayList(FileName: TFileName; aPlayList: TStringList): Boolean;
implementation
uses umain;
{$R *.DFM}
const
crTrackDrag = 1;
crTrackAdd = 2;
crTrackDelete = 3;
{------------------------------------------------------------------------}
function LoadPlayList(FileName: TFileName; aPlayList: TStringList): Boolean;
var
i: integer;
F: TextFile;
S: String;
Приложение А (продолжение)
begin
i := 0;
if (FileName <> '') and FileExists(FileName) then
begin
AssignFile(F, FileName);
{$I+}
Reset(F);
try
while not EOF(F) do
begin
ReadLn(F, S);
if (S <> '') then
begin
if FileExists(S) then
begin
if IsMpegFile(S) or wioIsWaveFile(S, RIFF_FILE) then
begin
aPlayList.Add(S);
inc(i);
end
else
MessageDlg(S+' is not a valid Audiofile',mtError, [mbOK],0);
end;
end;
end;
finally
CloseFile(F);
end;
{$I+}
end;
Result := (i > 0);
end;
{------------------------------------------------------------------------}
function SavePlayList(FileName: TFileName; aPlayList: TStringList): Boolean;
var
i: integer;
F: TextFile;
begin
Result := True;
if (FileName <> '') then
begin
AssignFile(F, FileName);
{$I-}
Rewrite(F);
try
if (IOResult <> 0) then Result := False
else
begin
for i := 0 to aPlayList.Count-1 do
begin
WriteLn(F,aPlayList[i]);
if (IOResult <> 0) then
begin
Result := False;
break;
end;
end;
end;
finally
CloseFile(F);
end;
{$I+}
end;
end;
Приложение А (продолжение)
{-- TPlayListEditor -----------------------------------------------------}
procedure TPlayListEditor.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.Style := Params.Style and not WS_SIZEBOX;
end;
{-- TPlayListEditor -----------------------------------------------------}
procedure TPlaylistEditor.FormCreate(Sender: TObject);
begin
oldCaption := Caption;
TempPlayList := TStringList.Create;
ListName := 'noname.m3u';
aTimer := TTimer.Create(Self);
aTimer.Interval := 50;
aTimer.Enabled := False;
aTimer.OnTimer := DragTimerExpired;
aBitmap1 := TBitmap.Create;
aBitmap2 := TBitmap.Create;
aBitmap1.Handle := LoadBitmap(HInstance, 'BM_NOTE');
aBitmap2.Width := aBitmap1.Width;
aBitmap2.Height := aBitmap1.Height;
BitBlt(aBitmap2.Canvas.Handle, 0,0, aBitmap1.Width, aBitmap1.Height,
aBitmap1.Canvas.Handle, 0,0, NOTSRCCOPY);
aIcon := TIcon.Create;
aIcon.Handle := LoadIcon(HInstance, 'MARKERICON');
Icon.Handle := LoadIcon(HInstance, 'PLAYLISTICON');
oldIndex := -1;
Screen.Cursors[crTrackDrag] := LoadCursor(HInstance, 'CR_TRACKDRAG');
Screen.Cursors[crTrackAdd] := LoadCursor(HInstance, 'CR_TRACKADD');
Screen.Cursors[crTrackDelete] := LoadCursor(HInstance, 'CR_TRACKDELETE');
DragTarget := Nil;
end;
{-- TPlayListEditor -----------------------------------------------------}
procedure TPlaylistEditor.FormDestroy(Sender: TObject);
begin
aTimer.Free;
aBitmap1.Free;
aBitmap2.Free;
aIcon.Free;
TempPlayList.Free;
end;
{-- TPlayListEditor -----------------------------------------------------}
procedure TPlaylistEditor.FormShow(Sender: TObject);
begin
PlayListBox.Clear;
TempPlayList.Assign(MainForm.PlayList);
ListName := MainForm.PlayListName;
UpdatePlayListBox;
ListChanged := not ((ListName <> '') and (ListName <> 'noname.m3u'));
SetFileInfo;
SetButtons;
end;
{-- TPlayListEditor -----------------------------------------------------}
procedure TPlaylistEditor.FormHide(Sender: TObject);
begin
Приложение А (продолжение)
if ModalResult = mrOK then
begin
if ListChanged then
if MessageDlg('Сохранить изменения в плейлисте ?', mtConfirmation, [mbYes,mbNo],0) = mrYes then
begin
if (ListName <> 'noname.m3u') then
SavePlaylist1Click(nil)
else
SavePlaylistAs1Click(nil);
end;
end;
end;
{-- TPlayListEditor -----------------------------------------------------}
procedure TPlayListEditor.SetListName(aValue: TFileName);
begin
FListName := aValue;
Caption := oldCaption;
if FListName <> '' then
Caption := Caption + ' - ' + FListName;
end;
{-- TPlayListEditor -----------------------------------------------------}
procedure TPlaylistEditor.SetButtons;
begin
AddButton.Enabled := (FileListBox.SelCount > 0);
RemoveButton.Enabled := (PlayListBox.SelCount > 0);
ClearButton.Enabled := (PlayListBox.Items.Count > 0);
RandomizeButton.Enabled := (PlayListBox.Items.Count > 0);
end;
{-- TPlayListEditor -----------------------------------------------------}
procedure TPlayListEditor.UpdatePlayListBox;
var
i: integer;
begin
PlayListBox.Clear;
for i := 0 to TempPlayList.Count-1 do
PlayListBox.Items.Add(ExtractFileName(TempPlayList[i]));
end;
{-- TPlayListEditor -----------------------------------------------------}
procedure TPlayListEditor.SetFileInfo;
var
FileName,S: String;
lpwio: PWaveIOCB;
MpegInfo: TMpegFileInfo;
begin
if (TempPlayList.Count > 0) and (PlayListBox.ItemIndex >= 0) then
begin
FileName := TempPlayList[PlayListBox.ItemIndex];
if IsMpegFile(FileName) then
begin
if GetMpegFileInfo(FileName, MpegInfo) then
begin
S := 'ISO MPEG ';
with MpegInfo do
begin
case Version of
v1 : S := S + '1 - ';
v2LSF: S := S + '2 - ';
end;
case Layer of
1: S := S + 'Layer I; ';
2: S := S + 'Layer II; ';
3: S := S + 'Layer III; ';
end;
S := S + Format('%2.3f kHz; %d KBit/s; ',[SampleRate/1000,BitRate]);
case SampleMode of
smStereo : S := S + 'Stereo;';
smJointStereo : S := S + 'Joint Stereo;';
smDualChannel : S := S + 'Dual Channel;';
smSingleChannel: S := S + 'Mono;';
end;
InfoLabel.Caption := S;
end;
exit;
end;
end
else if wioIsWaveFile(FileName, RIFF_FILE) then
begin
if wioReadFileInfo(lpwio, PChar(FileName),
mmioFOURCC('W', 'A', 'V', 'E'), RIFF_FILE) = 0 then
try
InfoLabel.Caption := 'WAVE - ';
wioGetFormatName(@lpwio.wfx, S);
InfoLabel.Caption := InfoLabel.Caption+' '+S;
wioGetFormat(@lpwio.wfx, S);
InfoLabel.Caption := InfoLabel.Caption+' '+S;
exit;
finally
wioFreeFileInfo(lpwio);
end;
end;
InfoLabel.Caption := 'Незнай че за файл...';
end
else InfoLabel.Caption := '';
end;
{-- TPlayListEditor -----------------------------------------------------}
function TPlaylistEditor.FirstSelection(aList: TCustomListBox): Integer;
begin
for Result := 0 to aList.Items.Count - 1 do
if aList.Selected[Result] then exit;
Result := LB_ERR;
end;
{-- TPlayListEditor -----------------------------------------------------}
function TPlaylistEditor.LastSelection(aList: TCustomListBox): Integer;
begin
for Result := aList.Items.Count - 1 downTo 0 do
if aList.Selected[Result] then exit;
Result := LB_ERR;
end;
{-- TPlayListEditor -----------------------------------------------------}
function TPlaylistEditor.FindIndex(aList: TListBox; aPos: TPoint): integer;
begin
with aList do
begin
Result := ItemAtPos(aPos, False);
if Items.Count > (Height div ItemHeight)-1 then
if Result = TopIndex + (Height div ItemHeight)-1 then
if aPos.Y > Height-(ItemHeight div 2) then
inc(Result);
end;
end;
{-- TPlayListEditor -----------------------------------------------------}
procedure TPlaylistEditor.ClearSelected(aList: TCustomListBox);
Var
aIndex: integer;
begin
aIndex := FirstSelection(aList);
Приложение А (продолжение)
if aIndex > LB_Err then
begin
while aIndex <= LastSelection(aList) do
begin
if aList.Selected[aIndex] then
begin
aList.Selected[aIndex] := False;
ListChanged := True;
end;
inc(aIndex);
end;
SetFileInfo;
end;
end;
{-- TPlayListEditor -----------------------------------------------------}
procedure TPlaylistEditor.AddSelected(aIndex: integer);
Var
i: Integer;
begin
with TempPlayList do
begin
if (aIndex = -1) then aIndex := Count;
for i := 0 to FileListBox.Items.Count - 1 do
begin
if FileListBox.Selected[i] then
begin
Insert(aIndex, FileListBox.Items[i]);
ListChanged := True;
inc(aIndex);
end;
end;
UpdatePlayListBox;
if aIndex >= PlayListBox.Height div PlayListBox.ItemHeight then
PlayListBox.TopIndex := aIndex-((PlayListBox.Height div PlayListBox.ItemHeight)-1);
end;
end;
{-- TPlayListEditor -----------------------------------------------------}
procedure TPlaylistEditor.ResortSelected(aIndex: integer);
Var
i: Integer;
begin
if (PlayListBox.Items.Count > 1) then
with PlayListBox do
begin
if (aIndex = -1) then aIndex := 0;
i := 0;
while i < Items.Count do
begin
if Selected[i] then
begin
Selected[i] := False;
ListChanged := True;
if aIndex > i then
begin
TempPlayList.Move(i, aIndex-1);
Items.Move(i, aIndex-1);
dec(i);
end
else
begin
Приложение А (продолжение)
TempPlayList.Move(i, aIndex);
Items.Move(i, aIndex);
inc(aIndex);
end;
end;
inc(i);
end;
if (Items.Count > 0) then
begin
TopIndex := 0;
Selected[0] := True;
Selected[0] := False;
end;
end;
end;
{-- TPlayListEditor -----------------------------------------------------}
procedure TPlaylistEditor.RemoveSelected;
Var
i: Integer;
begin
with PlayListBox do
begin
ItemIndex := 0;
for i := Items.Count - 1 downTo 0 do
if Selected[i] then
begin
Items.Delete(i);
TempPlayList.Delete(i);
ListChanged := True;
end;
if (Items.Count > 0) then
begin
TopIndex := 0;
Selected[0] := True;
Selected[0] := False;
end;
end;
end;
{-- TPlayListEditor -----------------------------------------------------}
procedure TPlaylistEditor.ListMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
begin
if (Sender = PlayListBox) then SetFileInfo;
SetButtons;
end;
end;
{-- TPlayListEditor -----------------------------------------------------}
Подобные документы
Требования к функциональным характеристикам, составу и параметрам технических средств, информационной и программной совместимости. Описание программы: общие сведения, логическая структура. Средства и порядок испытаний. Входные и выходные данные.
курсовая работа [6,3 M], добавлен 12.01.2015Требования к функциональным характеристикам программы, составу и параметрам технических средств, программной совместимости. Особенности программирования в среде Access. Описание интерфейса программы, ввод и редактирование данных, добавление новых книг.
курсовая работа [1,5 M], добавлен 17.11.2010Анализ программной системы, способной облегчить действия руководителя тушения пожара и повысить эффективность пожарных работ. Требования к функциональным характеристикам, составу и параметрам технических средств. Разработка программной документации.
курсовая работа [381,6 K], добавлен 13.08.2013Системный анализ предметной области. Требования к программе и программному изделию, к функциональным характеристикам, к надежности, составу и параметрам технических средств. Обоснование выбора средств выбора для хранения и обработки базы данных.
реферат [403,8 K], добавлен 02.02.2014Разработка игровой программы "разгадывания кроссворда". Создание схемы хранения данных, изучение возможности среды программирования. Требования к функциональным характеристикам, составу и параметрам технических средств, информационной совместимости.
курсовая работа [403,9 K], добавлен 26.03.2015Разработка системы управления базой данных "Структура ВУЗа". Требования к программе: функциональным характеристикам, надежности, эксплуатации, составу и параметрам технических средств. Требования к программной документации. Порядок контроля и приемки.
курсовая работа [982,7 K], добавлен 08.06.2015Назначение и цели создания системы. Требования к программе или программному изделию, к информационной и программной совместимости, к составу и параметрам технических средств. Алгоритм Rijndael. Назначение и условия применения программного продукта.
дипломная работа [1,3 M], добавлен 01.03.2009Документ, на основании которого ведется разработка. Требования к составу и параметрам технических средств, к информационной и программной совместимости. Проработка программных средств. Переопределение стандартных операций для абстрактных типов данных.
курсовая работа [371,5 K], добавлен 21.02.2012Требования к функциональным характеристикам проектируемого интернет-магазина. Требования к составу и параметрам технических средств и программной документации. Стадии и этапы разработки интернет-магазина, проверка и контроль правильности ее работы.
курсовая работа [598,2 K], добавлен 17.05.2011Стадии и этапы разработки программного продукта для осуществления упрощенной работы с клиентами и учёта услуг оказываемых "Интернет-центром". Требования к функциональным характеристикам и надежности программы, к составу и параметрам технических средств.
лабораторная работа [29,4 K], добавлен 13.06.2014