Курсовая

Курсовая на тему Универсальный проигрыватель WinMedia

Работа добавлена на сайт bukvasha.net: 2015-07-01

Поможем написать учебную работу

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

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 27.12.2024


Содержание

Введение.

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 -----------------------------------------------------}

procedure TPlaylistEditor.ListKeyUp(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

if (Sender = PlayListBox) then SetFileInfo;

SetButtons;

end;

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlaylistEditor.ListDrawItem(Control: TWinControl;

Index: Integer; Rect: TRect; State: TOwnerDrawState);

Var

Offset: Integer;

begin

with (Control as TListBox), (Control as TListBox).Canvas do

begin

FillRect(Rect);

Offset := 1;

if (odSelected in State) then

BrushCopy(Bounds(Rect.Left + Offset, Rect.Top,

aBitmap2.Width, aBitmap2.Height),

aBitmap2,

Bounds(0, 0, aBitmap2.Width, aBitmap2.Height),

clBlack)

else

BrushCopy(Bounds(Rect.Left + Offset, Rect.Top,

aBitmap1.Width, aBitmap1.Height),

aBitmap1,

Bounds(0, 0, aBitmap1.Width, aBitmap1.Height),

clWhite);

Offset := Offset + aBitmap1.Width + 5;

TextOut(Rect.Left + Offset, Rect.Top, Items[Index]);

end;

end;

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlaylistEditor.AddButtonClick(Sender: TObject);

begin

AddSelected(-1);

SetButtons;

end;

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlaylistEditor.RemoveButtonClick(Sender: TObject);

begin

RemoveSelected;

SetButtons;

end;

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlaylistEditor.ClearButtonClick(Sender: TObject);

begin

TempPlayList.Clear;

PlayListBox.Clear;

ListChanged := True;

SetFileInfo;

SetButtons;

end;

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlaylistEditor.RandomizeButtonClick(Sender: TObject);

var

i,j: integer;

begin

Randomize;

for i := 0 to TempPlayList.Count-1 do

begin

j := Random(TempPlayList.Count);

TempPlayList.Move(i, j);

PlayListBox.Items.Move(i, j);

end;

ListChanged := True;

SetButtons;

end;

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlaylistEditor.DragTimerExpired(Sender: TObject);

Var

Приложение А (продолжение)

MousePos: TPoint;

begin

if DragTarget <> Nil then

begin

GetCursorPos(MousePos);

MousePos := ScreenToClient(MousePos);

with DragTarget do

begin

if (MousePos.X > Left) And (MousePos.X < Left + Width) then

begin

{ scroll the listbox up }

if (MousePos.Y < Top) And (TopIndex > 0) then

TopIndex := TopIndex - 1

else

{ scroll the listbox down }

if (MousePos.Y > Top + Height) And (TopIndex < Items.Count - (Height div ItemHeight)) then

TopIndex := TopIndex + 1;

end;

end;

end;

end;

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlaylistEditor.DrawIndexPtr(oldIndex, newIndex: integer);

const

Offset: integer = 2;

begin

with Canvas do

begin

if oldIndex <> LB_Err then

begin

with PlayListBox do

oldIndex := (oldIndex - TopIndex) * ItemHeight + Top - 5;

Brush.Color := Self.Color;

FillRect(Rect(Offset,oldIndex,

Offset+15,

oldIndex+15));

end;

if newIndex <> LB_Err then

begin

with PlayListBox do

newIndex := (newIndex - TopIndex) * ItemHeight + Top - 5;

Draw(Offset, newIndex, aIcon);

end;

end;

end;

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlaylistEditor.ListDragOver(Sender, Source: TObject;

X, Y: Integer; State: TDragState;

Var Accept: Boolean);

Var

curIndex: integer;

begin

if (Source is TCustomListBox) And (Sender is TCustomListBox) then

begin

Accept := True;

{ set the right drag cursors }

if (State = dsDragEnter) then

begin

if Source = PlayListBox then

begin

if Sender = PlayListBox then

Приложение А (продолжение)

TListBox(Source).DragCursor := crTrackDrag

else

TFileListBox(Source).DragCursor := crTrackDelete;

end

else

begin

if Sender = FileListBox then

TFileListBox(Source).DragCursor := crTrackDrag

else

TListBox(Source).DragCursor := crTrackAdd;

end;

aTimer.Enabled := False;

DragTarget := TListBox(Sender);

end

else if (State = dsDragLeave) then

aTimer.Enabled := True;

{ don't accept if on the scrollbars }

with TCustomListBox(Sender) do

begin

CurIndex := ItemAtPos(Point(X,Y),False);

if CurIndex = LB_Err then Accept := False;

end;

{ now draw the index arrow }

if (Sender = PlayListBox) then

begin

{special case for the last visible item }

CurIndex := FindIndex(TListBox(Sender), Point(X, Y));

if (CurIndex <> oldIndex) Or (State = dsDragLeave) then

begin

if (State = dsDragEnter) then

oldIndex := LB_Err;

if (State = dsDragLeave) then

curIndex := LB_Err;

DrawIndexPtr(oldIndex, curIndex);

oldIndex := curIndex;

end;

end;

end;

end;

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlaylistEditor.ListDragDrop(Sender, Source: TObject;

X, Y: Integer);

Var

aIndex: Integer;

begin

{ make sure source and destination components are list boxes }

if (Source is TCustomListBox) and (Sender is TCustomListBox) then

begin

if (Sender = FileListBox) then

begin

{ delete selected items }

if (Source = PlayListBox) then

RemoveSelected;

end

else

begin

{ copy from one list to another }

if (Source = FileListBox) then

begin

Приложение А (продолжение)

{ find destination position in list box }

aIndex := FindIndex(TListBox(Sender), Point(X, Y));

AddSelected(aIndex);

end

else { rearrange list }

begin

{ find destination position in list box }

aIndex := FindIndex(TListBox(Sender), Point(X, Y));

ResortSelected(aIndex);

end;

end;

end;

end;

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlaylistEditor.ListEndDrag(Sender, Target: TObject;

X, Y: Integer);

begin

aTimer.Enabled := False;

DragTarget := Nil;

end;

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlaylistEditor.Exit1Click(Sender: TObject);

begin

Close;

end;

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlaylistEditor.NewPlaylist1Click(Sender: TObject);

begin

if SaveDialog.Execute then

begin

TempPlayList.Clear;

PlayListBox.Clear;

ListChanged := True;

ListName := SaveDialog.FileName;

end;

end;

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlaylistEditor.OpenPlaylist1Click(Sender: TObject);

begin

if OpenDialog.Execute then

begin

TempPlayList.Clear;

PlayListBox.Clear;

if LoadPlayList(OpenDialog.FileName,TempPlayList) then

begin

UpdatePlayListBox;

ListChanged := False;

ListName := OpenDialog.FileName;

end

else MessageDlg('Unable to load Playlist!',mtError, [mbOK],0);

end;

end;

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlaylistEditor.SavePlaylist1Click(Sender: TObject);

begin

if SavePlayList(ListName,TempPlayList) then

begin

ListChanged := False;

end

else MessageDlg('Unable to save Playlist!',mtError, [mbOK],0);

end;

Приложение А (продолжение)

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlaylistEditor.SavePlaylistAs1Click(Sender: TObject);

begin

SaveDialog.InitialDir := ExtractFilePath(ListName);

SaveDialog.FileName := ExtractFileName(ListName);

if SaveDialog.Execute then

begin

if SavePlayList(SaveDialog.FileName,TempPlayList) then

begin

ListChanged := False;

ListName := SaveDialog.FileName;

end

else MessageDlg('Unable to save Playlist!',mtError, [mbOK],0);

end;

end;

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlaylistEditor.AppendPlaylist1Click(Sender: TObject);

begin

if OpenDialog.Execute then

begin

if LoadPlayList(OpenDialog.FileName,TempPlayList) then

begin

UpdatePlayListBox;

ListChanged := True;

end

else MessageDlg('Unable to append Playlist!',mtError, [mbOK],0);

end;

end;

end.

unit UPref;

interface

uses

Windows,

Messages,

SysUtils,

Classes,

Graphics,

Controls,

Forms,

Dialogs,

ComCtrls,

Tabnotbk,

StdCtrls,

ExtCtrls,

MMObj,

MMUtils,

MMSlider,

MMRegs,

MMWaveIO,

MMWavIn,

MMWavOut,

MMSpin;

type

TPreferencesForm = class(TForm)

PageControl1: TPageControl;

OptAudio: TTabSheet;

btnOk: TButton;

btnCancel: TButton;

GroupBox1: TGroupBox;

GroupBox2: TGroupBox;

GroupBox3: TGroupBox;

PlayCombo: TComboBox;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label6: TLabel;

radioWindow: TRadioButton;

radioThread: TRadioButton;

radioInterrupt: TRadioButton;

labelBufferSize: TLabel;

sliderBufferSize: TMMSlider;

spinBufferSize: TMMSpinButton;

procedure FormShow(Sender: TObject);

procedure BufferSizeChange(Sender: TObject);

procedure btnOkClick(Sender: TObject);

private

BufferSize: integer;

procedure UpdateBufferSize;

end;

var

PreferencesForm: TPreferencesForm;

implementation

uses umain;

{$R *.DFM}

{========================================================================}

{ Initialization and Settings }

{========================================================================}

{-- TPreferencesForm ----------------------------------------------------}

procedure TPreferencesForm.FormShow(Sender: TObject);

var

i: integer;

begin

with MainForm do

begin

{-- Audio Page --}

sliderBufferSize.Position := WaveOut.NumBuffers;

spinBufferSize.Value := sliderBufferSize.Position;

BufferSize := sliderBufferSize.Position*WaveOut.BufferSize;

UpdateBufferSize;

if WaveOut.NumDevs > 0 then

begin

PlayCombo.Items.Add(WaveOutGetDeviceName(WAVE_MAPPER));

for i := 0 to WaveOut.NumDevs-1 do

begin

PlayCombo.Items.Add(WaveOutGetDeviceName(i));

end;

PlayCombo.ItemIndex := WaveOut.DeviceId+1;

end;

if not _win95_ then radioInterrupt.Enabled := False;

case WaveOut.CallbackMode of

cmWindow : radioWindow.Checked := True;

cmThread : radioThread.Checked := True;

cmCallback: radioInterrupt.Checked := True;

end;

end;

end;

{-- TPreferencesForm ----------------------------------------------------}

procedure TPreferencesForm.btnOkClick(Sender: TObject);

Приложение А (продолжение)

begin

with MainForm do

begin

{-- Audio Page --}

WaveOut.DeviceID := PlayCombo.ItemIndex-1;

WaveOut.NumBuffers := BufferSize div WaveOut.BufferSize;

if radioWindow.Checked then

WaveOut.CallbackMode := cmWindow

else if radioThread.Checked then

WaveOut.CallbackMode := cmThread

else

WaveOut.CallbackMode := cmCallback

end;

end;

{========================================================================}

{ Audio Page }

{========================================================================}

{-- TPreferencesForm ----------------------------------------------------}

procedure TPreferencesForm.UpdateBufferSize;

begin

labelBufferSize.Caption := IntToStr(BufferSize div 1024)+' Kb';

if (MainForm.WaveOut.PWaveFormat <> nil) then

labelBufferSize.Caption := labelBufferSize.Caption+ Format(' - %f seconds',[wioBytesToTime(MainForm.WaveOut.PWaveFormat,BufferSize)/1000]);

end;

{-- TPreferencesForm ----------------------------------------------------}

procedure TPreferencesForm.BufferSizeChange(Sender: TObject);

begin

if (Sender = sliderBufferSize) then

spinBufferSize.Value := sliderBufferSize.Position

else

sliderBufferSize.Position := spinBufferSize.Value;

BufferSize := sliderBufferSize.Position * MainForm.WaveOut.BufferSize;

UpdateBufferSize;

end;

end.

unit UVideo;

interface

uses

Windows,

ShellAPI,

Messages,

SysUtils,

Classes,

Graphics,

Controls,

Forms,

Dialogs,

ExtCtrls,

Menus,

MMAbout,

MMObj,

MMAVICtl,

MMCstDlg,

MMAVI,

MMHook,

MMDesign;

type

TVideo = class(TForm)

AVIFile: TMMAVIFile;

AVIOpenDialog: TMMAVIOpenDialog;

AVIControl: TMMAVIControl;

AVIDisplay: TMMAVIVideoDisplay;

Bevel1: TBevel;

PopupMenu1: TPopupMenu;

OpenFile1: TMenuItem;

N1: TMenuItem;

Play1: TMenuItem;

Pause1: TMenuItem;

Stop1: TMenuItem;

N2: TMenuItem;

ShowDisplay1: TMenuItem;

ShowControls1: TMenuItem;

N3: TMenuItem;

Properties1: TMenuItem;

N4: TMenuItem;

Info1: TMenuItem;

MMDesigner1: TMMDesigner;

N5: TMenuItem;

SaveFrame1: TMenuItem;

SaveDialog: TSaveDialog;

procedure AVIDisplayDblClick(Sender: TObject);

procedure OpenFile1Click(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure PopupMenu1Popup(Sender: TObject);

procedure Play1Click(Sender: TObject);

procedure Pause1Click(Sender: TObject);

procedure Stop1Click(Sender: TObject);

procedure ShowDisplay1Click(Sender: TObject);

procedure ShowControls1Click(Sender: TObject);

procedure Properties1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure FormResize(Sender: TObject);

procedure Info1Click(Sender: TObject);

procedure FormShow(Sender: TObject);

procedure SaveFrame1Click(Sender: TObject);

private

MinWidth,MinHeight: integer;

procedure WMGetMinMaxInfo(Var Msg: TWMGetMinMaxInfo); message WM_GETMINMAXINFO;

procedure SetminMax;

end;

var

Video: TVideo;

implementation

uses Upref, UMain, UMe;

{$R *.DFM}

{-- TMainForm ------------------------------------------------------------}

procedure TVideo.WMGetMinMaxInfo(Var Msg: TWMGetMinMaxInfo);

begin

if (MinWidth <> 0) then

begin

with Msg.MinMaxInfo^ do

begin

ptMinTrackSize.X := MinWidth; { Minimum width }

ptMinTrackSize.Y := MinHeight; { Minimum height }

end;

Msg.Result := 0; { Tell windows you have changed minmaxinfo }

end;

inherited;

Приложение А (продолжение)

end;

{-- TMainForm -----------------------------------------------------------------}

procedure TVideo.SetMinMax;

begin

MinWidth := (Width-ClientWidth)+AVIControl.MinWidth;

MinHeight:= (Height-ClientHeight)+AVIControl.MinHeight;

if Height < MinHeight then Height := MinHeight;

with AVIControl do

begin

if (not ShowDisplay and not ShowControls) then

begin

Bevel1.Visible := False;

AVIControl.Visible := False;

end

else

begin

AVIControl.Visible := True;

Bevel1.Visible := True;

Bevel1.Top := 0;

end;

end;

end;

{-- TMainForm -----------------------------------------------------------------}

procedure TVideo.FormResize(Sender: TObject);

begin

if Height <= MinHeight then

Bevel1.Visible := False

else

with AVIControl do

if (AVIControl.ShowDisplay and ShowControls) then

begin

Bevel1.Visible := True;

Bevel1.Top := 0;

end;

end;

{-- TMainForm -----------------------------------------------------------------}

procedure TVideo.FormCreate(Sender: TObject);

begin

MinWidth := 0;

Icon.Handle := LoadIcon(0,IDI_WINLOGO);

end;

{-- TMainForm -----------------------------------------------------------------}

procedure TVideo.FormShow(Sender: TObject);

begin

SetMinMax;

end;

{-- TMainForm -----------------------------------------------------------------}

procedure TVideo.FormClose(Sender: TObject; var Action: TCloseAction);

begin

AVIControl.FreeStreams;

AVIFile.CloseFile;

mainform.Visible:=true;

end;

{-- TMainForm -----------------------------------------------------------------}

procedure TVideo.PopupMenu1Popup(Sender: TObject);

begin

with AVIControl do

begin

Play1.Enabled := (hasAudio or hasVideo) and not Playing or Paused;

Pause1.Enabled := Playing and not Paused;

Приложение А (продолжение)

Stop1.Enabled := Playing;

end;

end;

{-- TMainForm -----------------------------------------------------------------}

procedure TVideo.OpenFile1Click(Sender: TObject);

var

Idx: WORD;

begin

if AVIOpenDialog.Execute then

begin

AVIFile.FileName := AVIOpenDialog.FileName;

Caption := ExtractFileName(AVIOpenDialog.FileName);

AVIFile.OpenFile;

AVIControl.FreeStreams;

AVIControl.AddFile(AVIFile);

AVIDisplay.Refresh;

Icon.Handle := ExtractassociatedIcon(0,PChar(AVIOpenDialog.FileName),Idx);

end;

end;

{-- TMainForm -----------------------------------------------------------------}

procedure TVideo.AVIDisplayDblClick(Sender: TObject);

begin

with AVIControl do

if hasAudio or hasVideo then

begin

if not Playing or Paused then Play

else Stop;

end;

end;

{-- TMainForm -----------------------------------------------------------------}

procedure TVideo.Play1Click(Sender: TObject);

begin

AVIControl.Play;

end;

{-- TMainForm -----------------------------------------------------------------}

procedure TVideo.Pause1Click(Sender: TObject);

begin

AVIControl.Pause;

end;

{-- TMainForm -----------------------------------------------------------------}

procedure TVideo.Stop1Click(Sender: TObject);

begin

AVIControl.Stop;

end;

{-- TMainForm -----------------------------------------------------------------}

procedure TVideo.ShowDisplay1Click(Sender: TObject);

begin

with AVIControl do

begin

ShowDisplay := not ShowDisplay;

ShowDisplay1.Checked := ShowDisplay;

SetMinMax;

end;

end;

{-- TMainForm -----------------------------------------------------------------}

procedure TVideo.ShowControls1Click(Sender: TObject);

begin

with AVIControl do

Приложение А (продолжение)

begin

ShowControls := not ShowControls;

ShowControls1.Checked := ShowControls;

SetMinMax;

end;

end;

{-- TMainForm -----------------------------------------------------------------}

procedure TVideo.Properties1Click(Sender: TObject);

begin

with TPreferencesForm.Create(Self) do

try

ShowModal;

finally

Free;

end;

end;

{-- TMainForm -----------------------------------------------------------------}

procedure TVideo.Info1Click(Sender: TObject);

begin

autor.show;

end;

{-- TMainForm -----------------------------------------------------------------}

procedure TVideo.SaveFrame1Click(Sender: TObject);

var

Bmp: TBitmap;

begin

if SaveDialog.Execute then

begin

// make sure the display is up-to-date

AVIDisplay.Refresh;

Bmp := TBitmap.Create;

try

Bmp.Width := AVIDisplay.Width-2*AVIDisplay.BevelExtend;

Bmp.Height:= AVIDisplay.Height-2*AVIDisplay.BevelExtend;

Bmp.Canvas.CopyRect(Rect(0,0,Bmp.Width,Bmp.Height),

AVIDisplay.Canvas,

AVIDisplay.BeveledRect);

Bmp.SaveToFile(SaveDialog.FileName);

finally

Bmp.Free;

end;

end;

end;

end.

Приложение Б (обязательное)

Примеры отчетов

Пример Отчета Вывода на печать содержимого мультимедиа библиотеки:

Библиотека файлов

Название композиции

Исполнитель

Альбом

Продолжительность

<различные столбцы по запросу пользователя>

Toxicity

.

SoAD

Toxicity

3:20


Пример отчета вывода на печать содержимого плейлиста:

Плейлист <название плейлиста>

Название композиции

Исполнитель

Альбом

Продолжительность

<различные столбцы по запросу пользователя>

Toxicity

.

SoAD

Toxicity

3:20


Список литературы

[1] Архангельский А.Я. Программирование в Delphi. Учебник по классическим версиям Delphi. – М.: 00О «Бином-Пресс», 2006

[2] Голицына О.Л., Попов И.И. Основы алгоритмизации и программирования : Учеб. пособие.- М.: ФОРУМ: ИНФРА-М, 2004

[3] Тверских Н., Microsoft Access 2000 Шаг за шагом, – М., шагом, -М., издательство Эком., 1999

[4] Хомоненко А.Д., Цыганков В.М., Мальцев М.Г. – “Базы данных”, учебное пособие.


1. Доклад на тему Роль константинопольского патриархата
2. Реферат на тему Frankenstein Essay Research Paper Frankenstein is considered
3. Курсовая на тему Вдосконалення системи управління залученням позикового капіталу з метою забезпечення фінансової системи
4. Сочинение на тему Василий Шукшин и Владимир Высоцкий параллели художественных миров
5. Реферат Традиции и новации в государственно-правовом и общественном развитии России и Европы в Новей
6. Реферат Типы конфликтов
7. Кодекс и Законы Законы Чингизхана Великая Яса
8. Реферат Проблемы производительности труда на производстве
9. Реферат Некоммерческие организации признаки и виды
10. Реферат на тему Mexican Revolution Essay Research Paper Mexican Revolution