- •Методічні вказівки та контрольні завдання
- •Лабораторна робота №1
- •Лабораторна робота №2
- •Лабораторна робота №3
- •Лабораторна робота №4
- •Лабораторна робота №5
- •Процедура конвертації форматів bmp в wmf
- •Конвертація bmp в ico
- •Лабораторна робота №6
- •Завдання для самостійної роботи:
- •Лабораторна робота №7
- •Лабораторна робота №8
- •Завдання для самостійної роботи
- •Список використаної літератури
Лабораторна робота №2
СТВОРЕННЯ ЛАЗЕРНОГО ПРОГРАВАЧА
Для створення мультимедійного лазерного програвача необхідно створити новий проект. Потім встановити властивості форми представлені в табл. 1:
|
Таблиця 1 |
Властивість |
Значення |
BorderIcons.biMaximize |
False |
BorderStyle |
bsSingle |
Caption |
CD-проигрыватель |
Height |
350 |
Name |
MPForm |
Width |
370 |
Тепер розмістите на формі (майже під самим заголовком) компонент MediaPlayer, який знаходиться на закладці System загальної палітри компонент. Встановите властивості компоненту Media Player як вказано в табл.2 :
|
Таблиця 2 |
Властивість |
Значення |
AutoOpen |
True |
DeviceType |
dtCDAudio |
Name |
Player |
Двічі клацніть на ім'я властивостей VisibleButtons і встановіть в False значення наступних підвластивостей: btNext, btPrev, btStep, btBack, btRecord. Тим самим стануть не видимими відповідні кнопки в компоненті Media Player, розміщеному на формі. Тепер двічі клацніть на ім'я властивостей ColoredButtons і встановіть в False значення підвластивостей btPause і btEject. Тепер необхідно зберегти проект. Біля правого краю форми розмістите кнопку (компонент Button сторінки Standard). У її властивості Caption введіть значення: «&Закрыть». Клацніть по компоненту Media Player, а потім, натиснувши Shift, по кнопці, вибравши відразу два компоненти. Виберіть пункт меню Edit > Align... і у вікні Alignment, в розділі Vertical встановите радіокнопку Tops, що дасть вирівнювання кнопки по верхньому краю. Не відміняючи виділення обох компонентів, виберіть пункт меню Edit > Size... і в розділі Height встановите прапорець Shrink to smallest. В цьому випадку висота панелі компоненту Media Player стане рівній висоті кнопки. Двічі клацніть по кнопці "Закрити" на головній формі проекту і введіть команду Close. Натисніть F12 (щоб повернутися до шаблону форми). Клацніть по закладці Win32 палітри компонентів VCL, виберіть компонент ProgressBar і розмістіть смужку індикатора під панеллю програвача, розтягнувши її майже у всю ширину форми. Властивості Name привласніть значення ProgressBar. Під компонентом ProgressBar розмістите дві влучні (компонент Label вкладки Standard) - одна під інший. Першою дайте ім'я (властивість Name) Author, а другий - Album. Ці мітки відображатимуть інформацію про назву диска і його автора (або виконавцеві).
Тепер виділите обидві влучні і очистите властивість Caption - Delphi дозволяє встановлювати загальну властивість для декількох компонентів, а властивість Caption є у обох влучний.
Відкрийте вкладку Win32 палітри компонентів і встановіть на форму компонент Status Bar. Її властивості Name привласніть значення Status. Рядок статусу можна використовувати для виведення будь-якої інформації, що пояснює процес роботи програми. У цей компонент необхідно відображати інформацію про номер трека, що програється, час звучання, а також назва композиції. Для цього необхідно «поділити» компонент на 3 частини. Двічі клацніть по компоненту Status Bar, щоб відкрити діалогову панель для виконання вищеописаної дії з цим компонентом. Тепер три рази клацніть по кнопці "Add New" - в спеціальному вікні цієї панелі з'явилися три рядки: "0 - TStatusPanel", "1 - TStatusPanel" і "2 - TStatusPanel". Кожен рядок є одину з трьох осередків на компоненті. Їх нумерація починається з нуля. Клацніть по рядку "0 - TstatusPanel" і її властивості Width привласніть значення 25. Для другого рядка точно також задайте ширину в 40 пікселів. Тепер можна закрити вікно Editing Status.Panels. Потім вибираємо компонент StringGrid - сітка рядків, який знаходиться в закладці Additional. Розмістите його на формі і встановите значення для його властивостей з табл. 3:
|
Таблиця 3 |
Властивість |
Значення |
ColCount |
3 |
Color |
clInfoBk |
DefaultRowHeight |
18 |
FixedCols |
0 |
Name |
Songs |
RowCount |
10 |
ScrollBars |
ssVertical |
Встановивши такі властивості створена три колоночная сітка з 10 рядків кольору стандартної контекстної підказки Windows (clInfoBk). Висота рядків рівна 18 пікселів, жодної колонки не зафіксовано, дозволений тільки вертикальний повзунок. Далі необхідно змінити ширину списку рядків, щоб вона дорівнювала ширині компоненту ProgressBar, а висоту - щоб були видні всі десять рядків. Тепер зміните ширину колонок, використовуючи розділові лінії на першому фіксованому рядку (точно так, як і змінюється ширина колонок в програмі MS Excel, тобто за допомогою технології Drag&Drop).
Після того, як ви добилися потрібної ширини колонок, привласніть властивості FixedRows значення нуль - верхній фіксований рядок перетворився на звичайну смужку.
Двічі клацніть по властивості Options компоненту StringGrid і встановіть в False підвластивості goVertLine і goRangeSelect (відміна вертикальних розділяючих ліній в списку рядків і заборона одночасного вибору декількох рядків).
Підвластивості goRowSelect привласніть значення True. Ця підвластивість відповідає за зовнішній вигляд активного рядка списку. В даному випадку виділятися будуть всі три колонки відразу. Відкрийте вкладку System палітри компонентів і розмістіть в будь-якому місці форми два компоненти Timer. Вони автоматично отримають імена, відповідно: Timer1 і Timer2, які можна залишити без зміни. Властивість Interval (частота в мілісекундах) обох компонентів зробіть рівною 100. Для компоненту Timer2 встановите властивість Enabled в False, щоб зробити таким, що "не його цокає" на початку виконання програми.
Тепер необхідно створити алгоритми для функціонування всіх кнопок і дій. Перемістіться в початок модуля і додайте в секцію модулів (uses), що імпортуються, новий модуль: MMSystem. У після службового слова type перед описом форми (клас TMPForm) вставте наступний рядок: TPlayerStatus = (NoDisk, InsertingDisk, Played, Paused, Stopped). Компонент Media Player має властивість Mode, яка показує його поточний стан, – цю властивість фіксує або відсутність диска, або його присутність і один з декількох станів: не програється, програється.
У секції private опису форми замість коментаря { private declarations } введіть наступні рядки коди:
private
Trk, Min, Sec: word; // Трек і його тривалість (мин., сек.)
CD: TStringList; // Опис дисків
CurStatus: TPlayerStatus; // Поточний статус CD-ROM
procedure ClearSongsList;
procedure EmptyIndicat;
procedure InitProgressBar;
Перейдіть в секцію реалізації модуля, знайдіть рядок і введіть під директивою компілятору {$R *.DFM} :
procedure TMPForm.ClearSongsList;
{ Очистити список рядків}
begin
with Songs do
begin
RowCount:=1; Cells[0,0]:=''; Cells[1,0]:=''; Cells[2,0]:='';
end;
Author.Caption:= ''; Album.Caption:= '';
end;
procedure TMPForm.EmptyIndicat;
{ Очистити рядок статусу}
begin
Status.Panels [0].Text:= '00'; Status.Panels [1].Text:= '00:00';
Status.Panels [2].Text:= '';
ProgressBar.Position:= 0; ProgressBar.Max:= 100;
end;
procedure TMPForm.InitProgressBar;
{ Настройка індикатора звучання трека}
var Len: longint;
begin
with Player, ProgressBar do
if ( StartPos > 0 ) AND ( StartPos <= Tracks ) then
begin
Len:= TrackLength [ StartPos ]; Position:= 0;
Max:= MCI_MSF_MINUTE ( Len ) * 60 + MCI_MSF_SECOND ( Len );
// Виведення назви пісні в рядку статусу
Status.Panels [ 2 ].Text:= Songs.Cells [ 2, StartPos - 1 ];
end;
end;
Процедури ClearSongsList і EmptyIndicat дуже прості і потрібні лише для того, щоб у момент заміни диска очистити текстові властивості компонентів, що несуть інформацію про поточний диск, набір його треків, назву кожного трека, інформацію про поточну композицію, що виконується. InitProgressBar. StartPos, Tracks і TrackLength - властивості компоненту Media Player, що зберігають інформацію відповідно про: поточному треку, кількості треків на диску і довжині вказаного трека. Довжина трека у властивості TrackLength зберігається в так званому упакованому форматі MSF (хвилини, секунди, фрейми).
У компоненту Media Player є властивість TimeFormat, яка встановлює формат, що описує кожен трек CD. Властивість TrackLength TimeFormat ніякої дії не надає. Щоб розпакувати *.cda формат і витягувати з нього кількість хвилин і секунд, необхідно скористатися функціями MCI_MSF_MINUTE і MCI_MSF_SECOND відповідно, описаними в модулі MMSystem. Використовуючи ці дві функції, значення властивості Max компоненту ProgressBar встановлюється рівним кількості секунд звучання поточного трека.
Компонент Timer забезпечує можливість періодичного виконання однотипної дії з вказаною в його властивості Interval частотою. Таймер можна використовувати для контролю поточного стану CD-ROM (через те, що повторюється з частотою 0,01 сек. звернення до компоненту Media Player). Для спрощення коди краще розділити ці дві операції: перевірку поточного стану Media Player і виведення інформації про поточний трек (індикатор і лічильник секунд показуватимуть поточний стан композиції, що виконується). Двічі клацніть по компоненту Timer2 - він відповідатиме за індикацію стану композиції, що відтворюється в даний момент, - і введіть між рядками begin - end наступний код:
with Player, Status do
begin
Trk:= MCI_TMSF_TRACK ( Position );
Min:= MCI_TMSF_MINUTE ( Position );
Sec:= MCI_TMSF_SECOND ( Position );
// Закінчилася одна пісня і почалася інша?
if ( Min = 0 ) AND ( Sec = 0 ) AND ( Mode = mpPlaying ) then
begin InitProgressBar; Songs.Row:= Trk - 1; end;
ProgressBar.Position:= Min * 60 + Sec;
// Інформація в панелі стану
Panels [ 0 ].Text:= Format ( '%.2d' [ Trk ] );
Panels [ 1 ].Text:= Format ( '%.2d:%.2d' [ Min, Sec ] );
end;
Властивість Position компоненту Media Player зберігає інформацію про поточний звук в декілька іншому форматі - TMSF (трек, хвилини, секунди, фрейми) і для її витягання знадобилися функції, аналогічні тим, що були використані в процедурі InitProgressBar
Доступ до окремих фрагментів панелі стану (StatusBar) здійснюється через масив Panels, одне з полів якого (Text) зберігає інформацію, що відображається на панелі стану.
Тепер опишемо метод, який дозволить завантажувати інформацію про композиції CD. У описі форми введіть під рядком public оголошення наступного методу: procedure AddSongsToList ( Sng: TStringGrid );
Перейдіть в кінець модуля і перед фінальним end. введіть текст процедури:
procedure TMPForm.AddSongsToList ( Sng: TStringGrid );
var I: longint; M, S: word;
begin
with Sng do
begin
// Встановити кількість рядків в Sng рівним кількості треків CD
RowCount:= Player.Tracks;
// Для кожного трека:
for I:= 1 to Player.Tracks do
begin
// Отримати число хвилин
M:= MCI_MSF_MINUTE ( Player.TrackLength [ I ] );
// Отримати число секунд
S:= MCI_MSF_SECOND ( Player.TrackLength [ I ] );
// Перша колонка - номер трека
Cells [ 0, I - 1 ]:= Format ( '%.2d' [ I ] );
// Друга - час звучання
Cells [ 1, I - 1 ]:= Format ( '%.2d:%.2d' [ M, S ] );
// Третя поки порожня
Cells [ 2, I - 1 ]:= '';
end;
// Позиціонувати покажчик на перший рядок
Row:= 0;
end;
end;
Далі показаний приклад механізму перевірки кожного знов вставленого в CD-ROM диска. Оскільки розпізнавання наявності диска проводиться за допомогою таймера, то щоб уникнути зависання при дуже довгій перевірці, краще всього скористатися механізмом повідомлень Windows. При класичному підході - прямому виклику підпрограми – відбувається завантаження ресурсів ОС. В цьому випадку виклик процедури може провести до неї зависанню на декілька секунд.
Перейдіть у верхню частину модуля і після секції uses (перед словом type) введіть наступний код:
const
WM_SCANCD = WM_USER + 1;
WM_UNKNOWNCD = WM_USER + 2;
Такий спосіб дав можливість оголосити два внутрішні повідомлення: про початок сканування диска і повідомлення, яке програма пошле системі в тому випадку, якщо диск, що просканувався, виявиться їй невідомим.
Перейдіть до опису форми і в секції private після опису трьох службових методів введіть оголошення для двох обробників вище оголошених повідомлень:
procedure SCANCD ( var Msg: TMessage ); message WM_SCANCD;
procedure UNKNOWNCD ( var Msg: TMessage ); message WM_UNKNOWNCD;
Додайте в кінець секції реалізації модуля текст :
procedure TMPForm.ScanCD ( var Msg: TMessage );
begin end;
procedure TMPForm.UnknownCD ( var Msg: TMessage );
begin end;
Двічі клацніть по розміщеному на ній компоненту Timer1. У шаблоні обробника між парою begin - end (інструктивними дужками) помістите код:
// Визначити поточний стан CD-ROM
with Player, Status do
case Mode of
mpOpen: CurStatus:= NoDisk; // Відкритий (немає диска)
mpStopped: if CurStatus = NoDisk then // Диск є, але не грає
CurStatus:= InsertingDisk
else if CurStatus <> Paused then
CurStatus:= Stopped;
mpPlaying: begin // Грає
CurStatus:= Played;
// Якщо список рядків ще не заповнений
if Songs.RowCount = 1 then
AddSongsToList ( Songs );
end;
end;
// Активізувати другий таймер, якщо CD знаходиться в пристрої читання
Timer2.Enabled:= CurStatus <> NoDisk;
// Виконати дії для кожного з поточних станів диска
case CurStatus of
NoDisk: begin
ClearSongsList;
EmptyIndicat;
end;
InsertingDisk: begin
AddSongsToList ( Songs );
// Послати повідомлення про початок сканування
SendMessage ( Handle, WM_SCANCD, 0, 0 );
end;
Спочатку перевіряється властивість Mode компоненту Player (CD-проигрыватель), і залежно від його значення встановлюється значення змінної CurStatus.
Якщо виявляється, що диск знаходиться в пристрої читання, а пристрій готовий (стан mpStopped), то перевіряється попереднє значення CurStatus. Якщо воно рівне NoDisk, то програма «розуміє», що диск тільки що вставлений і встановлює CurStatus в InsertingDisk. Залежно від поточного стану CD-ROM виконуються певні дії. Якщо диск тільки-тільки вставлений, ядру ОС посилається повідомлення WM_SCANCD - про початок перевірки диска на предмет пошуку інформації про нього.
Повідомлення посилається за допомогою стандартної функції SendMessage.
Першим параметром цієї функції є параметр Handle. Це так зване посилання на екземпляр програми тієї, що послала повідомлення.
Д
ругий
параметр - само повідомлення; третій і
четвертий параметри могли б нести
яку-небудь інформацію (і цю інформацію
можна було б отримати в обробнику,
проаналізувавши структуру TMessage).
Робоче застосування представлене на
мал. 5
Рис 5. CD – програвач
