Курсовая на тему Универсальный проигрыватель WinMedia
Работа добавлена на сайт bukvasha.net: 2015-07-01Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Содержание
Введение.
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.
Тестирование программы проводилось в следующем порядке:
Проверка соответствия программы техническому заданию. При этом проверялось наличие и корректность выполнения программой функций описанных в техническом задании.
Проверка правильности выполнения вычислений. Для этого вычисления были предварительно рассчитаны вручную, а после сверены с результатами программы.
Проверка работы программы с граничными значениями. Для этого при работе программы вводились граничные данные, на что в ответ от программы были получены сообщения о некорректности введенных данных и просьбе ввести их заново.
Определение времени выполнения программой расчетов. При этом тестировались наиболее ресурсоемкие задачи – непосредственное проведение тестирования и построение отчетов. При этом программа показала хорошие показатели.
Проверка защищенности данных с которыми оперирует программ от посторонних пользователей. При этом использовались попытки выполнить действия приводящие и изменениям данных: редактирование, удаление. В ответ на эти действия программа предлагала ввести пароль. При ложном вводе пароля программа отказывала в доступе на модификацию данных.
Проверка работы всех пунктов меню и вызова всех экранных форм. При этом были проверены пункты меню на соответствие функций выполняемых ими их описанию.
Проверка работы программы на компьютерах различной конфигурации. Помимо указанной выше тестовой конфигурации программа была протестирована на следующей платформе:
Процессор: 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] Хомоненко А.Д., Цыганков В.М., Мальцев М.Г. – “Базы данных”, учебное пособие.