Головна

Практична робота № 27 | Практична робота № 28 | лістинг підпрограми | переміщення малюнка | Then begin | побудова графіка | Практична робота № 32 | Interface | Висновок табличних даних | Implementation |

© um.co.ua - учбові матеріали та реферати

Практична робота № 36

  1. II. Практична частина.
  2. TEМA 8. Законність і правова робота в народному господарстві
  3. V. КЕРІВНИЦТВО дипломної роботи
  4. А з підсвідомістю працюємо інакше.
  5. Аналітична робота в інтересах захисту бізнесу.
  6. Атракціони і реквізит здається в оренду або використовується в програмі, яку ми розробимо спеціально для ВАС! Від веселою спартакіади до першокласного тімбілдінга!
  7. Б) самостійна аудиторна робота

«Програвач»

Мета роботи -створити програму - програвач файлів мультимедіа, забезпечений системою візуалізації. Для початку многооконность буде реалізована за допомогою стандартних діалогів. Програвач файлів мультимедіа, що програє різні формати, а також супроводжуючий музичні файли візуалізацією.

1. Створити на диску папку (наприклад C: \ MyDelphi \ MyMPlayer), в якій буде створено проект, скопіювати в цю папку кілька музичних файлів і кліпів. Для демонстрації повноцінної роботи програвача знадобляться мультимедійні файли wav, mid, wma, mp3, avi, які можна знайти у відповідних папках.

відеофайли:

C: \ Program Files \ Borland \ Delphi5 \ Demos \ Coolstuf \

аудіофайли:

C: \ Windows \ Media \

C: \ Program Files \ Microsoft Office \ Office10 \ Media \

C: \ Мої документи \ Мої музичні записи \

2. Створити найпростішу програму програвання аудіофайлів (див. Практична робота № 10). Для цього помістити на форму кнопку, медіапрогравач, діалог завантаження.

 малюнок 64


3. Налаштувати фільтр діалогу на файли мультимедіа, відповідно заповнивши таблицю. Прибрати непотрібні нам кнопки програвача, відключивши їх в інспектор об'єктів (VisibleButtons). У обробнику натиснення на кнопку описати завантаження файлу.


OpenDialog - діалог завантаження

Основна властивість - FileName: String, основний метод - Execute. Коли Ви телефонуєте з програми методу Execute відбувається висновок на екран діалогу. Параметри виведення визначаються властивостями компонента: Title, Options, Filter і ін. Якщо користувач вибере файл для відкриття і натисне "Відкрити", то в властивість FileName компонента буде записано ім'я цього файлу в форматі string, а результатом методу Execute буде значення true. Інакше, якщо користувач натисне в діалозі кнопку "Скасувати", результат Execute буде false, тобто Execute є булевої функцією.

MediaPlayer- Медіапрогравач.

Основна властивість -FileName: String, основні методи - Play, Pause, Stop. Після того як в властивість FileName поміщено ім'я файлу мультимедіа, цей файл потрібно відкрити за допомогою методу Open (якщо встановлено властивість AutoOpen, то відкриття відбувається автоматично, але це не завжди добре, оскільки, якщо FileName не задано або задано невірно, то при автовідкриття відбудеться помилка).

Коли файл відкритий, він може бути відтворений. Це можна зробити за допомогою кнопок самого компонента, або викликавши метод Play. Те ж стосується зупинки і паузи - методів Stop і Pause. Для настройки зовнішнього вигляду компонента використовується безліч властивостей, наприклад, можна приховати частину кнопок, налаштовуючи властивість VisibleButtons.

4. У обробнику натиснення на Button1 викликається метод діалогу Execute, і якщо він видає результат true (користувач вибрав файл і натиснув "Відкрити"), то мультимедійних програвачів передається ім'я цього файлу і файл відкривається. Тепер користувач може відтворити його, натиснувши кнопки програвача.

procedure TForm1.Button1Click (Sender: TObject);

Begin

if OpenDialog1.Execute then

Begin

MediaPlayer1.FileName: = OpenDialog1.FileName;

MediaPlayer1.Open;

end;

end;

5. При запуску програми користувач бачить кнопку і програвач. Програвач не є активним, оскільки файл, який він повинен відтворювати, не відкритий.


При натисканні на кнопку активізується діалог. Параметри діалогу відповідають значенням властивостей, заданих попередньо в інспектор об'єктів. Наприклад, обраний фільтр звукових файлів приховує всі файли з відмінним розширенням.

Після вибору в папці з музикою файлу при натисканні кнопки "Відкрити" програвач став доступним. Файл відкритий, і можна відтворити його.

Якщо необхідно відтворити відеофайл, то при запуску автоматично буде створено окреме вікно, в якому відобразиться зображення.

6. Програвач готовий. Необхідно оформити призначений для користувача інтерфейс. Помістіть на форму панель, а на ній розташуйте компонент Image, розтягнутий на всю панель. Додайте таймер. Збережіть модуль як MainUnit і проект як MyMPlayer в приготовлену папку.

 малюнок 67


Дайте кожному компоненту відповідна назва. Оброблювач кнопки поміняйте згідно з останніми змінами і додайте розтягнення відеоекрани. Для того щоб відеофайли відтворювалися не в окремому вікні, а в заданому місці, наприклад, на Panel1, необхідно відповідним чином встановити властивість медіа-програвач Display. Для того щоб встановити і розтягнути потрібним чином зображення, потрібно встановити властивість DisplayRect:

MPlayer.DisplayRect: = Rect (0, 0, ScreenPanel.Width, ScreenPanel.Height);

де Rect (x1, y1, x2, y2: integer): TRect - функція, яка перетворює чотири числа до формату TRect - прямокутник, а властивість DisplayRect має саме цей формат.

Для того щоб перейменувати компоненти змініть властивість Name. Налаштуйте параметри компонентів:

1) MainForm: TmainForm

Caption = 'Мультимедіа-програвач'

ClientWidth = 402

ClientHeigth = 290

2) LifeTimer: Ttimer

Enabled = false

Interval = 100

3) MediaOpenDlg: TOpenDialog

Options: ofFileExist = true

Title = 'Завантажити файл мультимедіа'

4) LifeImage: TImage

Align = alClient

5) ScreenPanel: TPanel

Align = alTop

Caption = ''

Width = 402

Heigth = 252

6) MediaOpenBtn: TButton

Captoin = 'Відкрити'

7) MPlayer: TMediePlayer

Display = ScreenPanel

VisibleButtons = [btPlay, btPause, btStop]

7. Необхідно створити єдину форму для відтворення звукових і відеофайлів. Причому відтворення звукових файлів теж буде супроводжуватися анімацією. Як цього супроводу використовується гра "Життя".

Для цього додамо відповідний "розраховує" і "малює" код.

Опишемо константи, що визначають розмір поля, введемо новий тип - масив клітин і оголосимо глобальну змінну цього типу.

const
 XSize = 40;
 YSize = 25;
type
 TLifeCells = array [0 .. XSize - 1, 0 .. YSize - 1] of boolean;
var
 MainForm: TMainForm;
 A: TLifeCells;

Створимо процедуру, випадковим чином заповнює масив.

procedure RandomCells;
var
 i, j: integer;
begin
for i: = 0 to XSize - 1 do

for j: = 0 to YSize - 1 do

A [i, j]: = random <0.5;
end;

Це процедура випадкового заповнення поля. Булева змінна присвоюється логічно, а не за допомогою умовного оператора if random <0.5 then A [I, j]: = true else A [i.j]: = false.

Створимо функцію, визначальну число живих клітин-сусідів у даній клітини.

function NumOfCells (x, y: integer): integer;
var
 i, j, xx, yy: integer;
begin
 Result: = 0;
 for i: = -1 to 1 do
 for j: = -1 to 1 do
begin
 xx: = x + i; yy: = y + j;
if xx = -1 then xx: = XSize - 1;
if yy = -1 then yy: = YSize - 1;
if xx = XSize thenxx: = 0;
if yy = YSize then yy: = 0;
if A [xx, yy]then inc (Result);
end;
if A [x, y] then dec (Result);
end;

Це функція підрахунку живих сусідів. Зверніть увагу на змінні xx і yy. Подібним чином реалізується "зшивання" верхнього і нижнього, лівого і правого країв. В кінці виключається сама клітина з числа сусідів: if A [x, y] then dec (Result);

Створимо процедуру, малює поле клітин.

procedure DrawCells;
var
 i, j: integer;
begin
with MainForm.LifeImage.Canvasdo
begin
 Brush.Color: = сlBlue;
 Pen.Color: = Brush.Color;
 Rectangle (0, 0, XSize * 10, YSize * 10);
 Brush.Color: = clRed;
for i: = 0 to XSize - 1 do
for j: = 0 to YSize - 1 do
if A [i, j]then Rectangle (i * 10, j * 10, i * 10 + 10, j * 10 + 10);
end;
end;

Опишемо обробник таймера; кожен такт у нас буде відбуватися перерахунок живих клітин за правилами гри.

procedure TMainForm.LifeTimerTimer (Sender: TObject);
var
 i, j: integer;
 B: TLifeCells;
begin
for i: = 0 to XSize - 1 do
forj: = 0 to YSIze - 1 do
case NumOfCells (i, j) of
 2: B [i, j]: = A [i, j];
 3: B [i, j]: = true;
else B [i, j]: = false;
end;
 A: = B;
 DrawCells;
end;

Кожен такт таймера перераховуються живі клітини. Алгоритм гри, як відомо, полягає в наступному. Якщо у живої клітини два або три сусіда, то вона залишається живою, якщо менше двох, - гине від самотності, якщо більше трьох, - гине від тісноти. Народжується клітина, якщо у неї рівно три сусіда. За допомогою оператора case реалізуються правила. Використання локального масиву B необхідно. Якщо записувати відразу в A, то клітини нового покоління будуть також вважатися при обліку сусідів, що неприпустимо: кожному - своє. В кінці, однак, потрібно скопіювати нове покоління, що міститься в B, в масив A. Прості масиви можна копіювати присвоєнням: A: = B.

Модифікується обробник натискання кнопки під нові завдання. Проаналізуйте розширення завантаження, і, якщо завантажений відеофайл, Image стає невидимим, звільняючи екран для ролика, в іншому випадку, навпаки, виводиться картинку, на якій йде гра, заповнюється поле клітин і запускається таймер.

procedure TMainForm.MediaOpenBtnClick (Sender: TObject);
begin
if MediaOpenDlg.Execute then
begin
 MPlayer.FileName: = MediaOpenDlg.FileName;
 MPlayer.Open;
 MPlayer.DisplayRect: = Rect (0, 0, ScreenPanel.Width, ScreenPanel.Height);
 MPlayer.Play;
if ExtractFileExt (MPlayer.FileName) = '.avi' then LifeImage.Visible: = false
else begin
 LifeImage.Visible: = true;
 RandomCells;
 LifeTimer.Enabled: = true;
end;
end;
end;

Екран виведення "розтягується" на всю панель. Доданий автоматичний запуск відтворення. Залежно від розширення відтвореного файлу, LifeImage, на якому відбувається "Життя", або ховається (у разі '.avi'), або виводиться (в інших випадках).

 малюнок 68


8. Необхідно надати користувачеві можливість налаштування кольорів. На форму додаємо три компонента - два діалогу вибору кольору FieldColorDlg: TColorDialog (Color = clNavy), CellColorDlg: TColorDialog (Color = clYellow) і одну кнопку SetColorBtn: TButton (Caption = 'Кольори').

У обробнику натиснення на цю кнопку потрібно описати виклик діалогів.

 малюнок 69


ColorDialog (Основна властивість Color: TColor, основний метод - Execute) - Діалог вибору кольору. Якщо користувач вибрав колір і натиснув "ОК", результат цього методу - true, якщо користувач натиснув "Скасування", то результат false.

procedure TMainForm.SetColorBtnClick (Sender: TObject);
begin
if MessageDlg ( 'Змінити кольори?', MtConfirmation, [mbYes, mbNo], 0) = mrNothen exit;
if MainForm.FieldColorDlg.Execute then ScreenPanel.Color: = MainForm.FieldColorDlg.Color;
 MessageDlg ( 'Тепер змініть колір клітин', mtInformation, [mbOk], 0);
 CellColorDlg.Execute;
 DrawCells;
end;

MessageDlg(Const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Word; - Виклик вікна повідомлення. Це службове вікно.

Msg - текст повідомлення.

DlgType - тип діалогу. Можливі значення: mtWarning, mtError, mtInformation, mtConfirmation, mtCustom.

Buttons - використовувані кнопки. Змінна типу "безліч", можливі елементи: mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore, mbAll, mnNoToAll, mbYesToAll, mbHelp.

HelpCtx - індекс контекстної довідки. В даному прикладі індекс дорівнює нулю. При написанні проектів з розгорнутою довідковою системою вказується реальний індекс.

MessageDlg повертає число, дорівнює одній з наступних констант: mrNone, mrAbort, mrYes, mrOk, mrRetry, mrNo, mrCancel, mrIgnore, mrAll. Ці константи - так званий модальний результат (modal result) натискання на відповідну кнопку діалогу.

У даній програмі перевіряється, чи рівний модальний результат mrNo, тобто натиснута кнопка "Ні"; якщо натиснута, то викликається exit, і програма негайно виходить з поточної процедури-обробника.

Функції MessageDlg і Execute Delphi дозволяє викликати як процедури:

MediaOpenDlg.Execute замість if MediaOpenDlg.Execute then ...

При цьому неможливо проконтролювати, які кнопки були натиснуті: "OK" або "Скасувати".

Далі необхідно відкоригувати процедуру малювання, потім запустити програму, завантажити музичний файл і налаштуйте кольору. Нарешті, необхідно використовувати кольори діалогів при малюванні.

Внесіть зміни в DrawCells:

...

withMainForm.LifeImage.Canvas do
begin
 Brush.Color: = MainForm.FieldColorDlg.Color;
Pen.Color: = Brush.Color;
 Rectangle (0, 0, XSize * 10, YSize * 10);
 Brush.Color: = CellColorDlg.Color;

Brush.Color: =MainForm.CellColorDlg.Color;

...




9. На даний момент форма може бути масштабувати під час роботи програми. Для того щоб зафіксувати розмір форми, необхідно встановити відповідне властивість BorderStyle. Крім того, потрібно заборонити розгортання форми на весь екран (це також небажано).

Перелічимо основні властивості і події форми.

властивості

BorderIcons: TBorderIcons - іконки великої панелі форми, тип властивості - безліч, можливі елементи: biSystemMenu, biMinimize, biMaximize, biHelp (в даному випадку потрібно відключити biMaximize, щоб форму можна було розгорнути).

BorderStyle: ТBorderStyle - стиль бордюру bsDialog, bsSingle, bsNone, bsSizeable, bsToolWindow, bsSizeToolWin. Якщо встановити bsNone, то форма буде без заголовної панелі, а значить і без кнопки закриття програми. Следовательнр, виходити з програми можливе або за допомогою Alt-F4, або передбачити додаткову кнопку з методом Close.

ClientWidth, ClientHeigth: Integer - ширина і висота клієнтської області форми.

FormStyle: TFormStyle - стиль форми. Найбільш важливим значенням є fsStayOnTop. Якщо встановлено це значення, то форма буде перебувати над іншими формами, навіть якщо вона не активна, і перетинається з активною на даний момент формою.

Position: TPosition - розташування форми. Тут задаються різні початкові положення форми, наприклад, задати положення по центру екрана (poScreenCenter). При запуску програми вона виявиться в центрі.

WindowState: TWindowState - стан вікна. Можливі значення: wsNormal, wsMinimized, wsMaximized. За допомогою цієї властивості можна розгортати і згортати форму.

події

OnActivate, OnDesactivate(Sender: TObject) - події, що виникають, коли форма активується і дезактивируется (при цьому в форму переходить або її покидає фокус введення).

OnCloseQuery(Sender: TObject; var CanClose: Boolean) - подія, що виникає при спробі закрити форму. Наприклад, деяка програма запитує: "Ви хочете завершити програму?". Це - результат дії подібної події. Робиться це в обробнику подібним чином: CanClose: = MessageDlg ( 'Exit now?', MtConfirmation, [mbYes, mbNo], 0) = mrYes.

OnCreate, OnDestroy(Sender: TObject) - подія, необхідне для опису дій, необхідних на початку або в кінці роботи програми (відкриття і закриття файлів, читання і збереження налаштувань, ініціалізація змінних і т.п.).

OnHide, OnShow(Sender: TObject) - викликаються, коли форма стає видимою або невидимою (при присвоєнні відповідного значення властивості Visible).

OnResize(Sender: TObject) - відбувається, коли форма розтягується або стискається. Тут описують зміна розмірів і розташування компонентів на формі.

10. Продовжити оформлення медіа-програвач.

1) Для того щоб випадкове заповнення було більш випадковим, в подію форми OnCreate додати Randomize.

procedure TMainForm.FormCreate (Sender: TObject);

Begin

Randomize;

RandomCells;

End;

2) Також бажано зробити цикл відтворення медіафайлів, описати обробник події медіа-програвач OnNotify. У MediaPlayer є дві властивості - Position: LongInt і Length: LongInt. Це, відповідно, поточна позиція в запису і довжина запису. Подія програвача OnNotify виникає при завершенні різних керуючих методів MediaPlayer. Стан програвача можна дізнатися з властивості Mode.

Коли запис буде догравати до кінця, буде викликатися метод Play, що запускає її з початку. При зупинці програвача «перемотувати» запис на початок.

if Position = Length then Play

procedure TMainForm.MPlayerNotify (Sender: TObject);

Begin

with MPlayerdo case Mode of mpPlaying: if Position = Length then Play;

mpStopped: Rewind;

End;

End;

1) Встановити назву програми і вибрати йому іконку. У головному меню відкрити Project => Options. На вкладці Application, задати назву програми (це назва, зокрема, буде відображатися знизу на панелі завдань Windows), а також завантажити потрібну іконку. Стандартну іконку можна знайти в папці C: \ Program Files \ Common Files \ Borland Shared \ Images \ Icons, створити свою іконку - в редакторі Delphi (меню Tools => Image Editor) або в будь-якому іншому редакторі ресурсів.



11. Проаналізуємо недоліки: не виводиться назва файлу, що, компоненти на формі не дуже-то гармонують один з одним, невідомо, скільки відсотків записи програно на даний момент, не можна встановлювати швидкість візуалізації, немає можливості редагування та збереження позицій гри "Життя".

Створіть копію проекту. Додати в проект нову форму для управління відтворенням медіафайлів. Для створення нової форми клацніть на кнопку меню. Є можливість зробити це і в пункті меню File => New ... Там же можна створити форму за допомогою майстра.

Додайте на форму п'ять кнопок SpeedButton, TrackBar і таймер.

 малюнок 74


кнопка SpeedButtonвідрізняється від звичайної кнопки, по-перше, тим, що може містити зображення, а по-друге, тим, що може залишатися такою, що натискує.

 малюнок 75


Основні властивості - Glyph: TPicture (картинка), Down: Boolean (натиснута), основна подія - OnClick. У цій кнопки є ще кілька важливих властивостей. Для того щоб кнопка могла бути натиснута, її властивість Group: Integer має бути більше нуля. В цьому випадку всі кнопки з однаковим значенням групи стають перемикачами - якщо натиснути одну, інші відщіпає. Це може бути небажано в разі однієї кнопки з ненульовий групою - один раз натиснувши, її не можна відключити. В цьому випадку допоможе властивість AllowAllUp: Boolean. Сучасного вигляду кнопок надає властивість Flat: Boolean.

У програмі відмовимося від стандартного інтерфейсу MediaPlayer, І, зробивши його невидимим, будемо звертатися до нього через створені кнопки. Колекція ікон для кнопок знаходиться в папці C: \ Program Files \ Common Files \ Borland Shared \ Images \ Buttons \.

Налаштування TrackBar проводиться за допомогою властивостей ThumbLength: Integer (довжина бігунка), TickMarks: TTickMark (положення рисок лінійки), TickStyle: TTickStyle (стиль рисок).

Налаштуйте форму і компоненти. Змініть імена компонент.

1) ControlForm: TControlForm

Caption = 'мультимедійний не завантажено'

BorderStyle = bsToolWindow

ClientHeight = 24

ClientWidth = 402

2) NewSpBtn: TSpeedButton

AllowAllUp = true

Flat = true

Glyph: rety.bmp

GroupIndex = 1

3) PosTrk: TTrackBar

ThumbLength = 15

TickMarks = tmBoth

TickStyle = lsNone

4) PosTimer = TTimer

Enabled = false

Interval = 500

5) MediaOpenSpBtn: TSpeedButton

Flat = true

Glyph: MdOpen.bmp

6) PlaySpBtn: TSpeedButton

AllowAllUp = true

Flat = true

Glyph: vcrplay.bmp

GroupIndex = 1

7) PlaySpBtn: TSpeedButton

AllowAllUp = true

Flat = true

Glyph: vcrpause.bmp

GroupIndex = 1

8) StopSpBtn: TSpeedButton

AllowAllUp = true

Flat = true

Glyph: vcrstop.bmp

GroupIndex = 1

12. Там, де необхідно звернутися до якихось змінним, функціям, типам, об'єктам, описаним в іншому модулі, необхідно описати посилання на цей модуль в розділі uses. Однак тонкість полягає в тому, що uses може розташовуватися і в розділі interface, і в розділі implementation. При запуску програми нове вікно повинно знаходитися під головним вікном. Але якщо описати посилання двох модулів друг на друга в розділах interface, виникне так звана помилка кругової посилання. В рамках Pascal два модуля не можуть використовувати інтерфейс один одного. Посилання в інтерфейсі потрібна для того, щоб при описі типів, класів, змінних інтерфейсу використовувати типи і константи, описані в інших модулях. В даному інтерфейсі використовується, наприклад, клас TForm, TSpeedButton, TTrackBar, TTimer, описані, відповідно, в модулях Forms, Buttons, ComCtrls, ExtCtrls. Тобто використання інших модулів в інтерфейсі дає можливість, перш за все, описати нові типи за допомогою вже описаних типів. Саме тому заборонена кругова посилання. Тоді потенційно можливо було б описати: TypeA = array [0..4] of TypeB - в одному модулі і TypeB = array [0..99] of TypeA - в іншому. Тобто ignotum per ignotius - Невідоме через ще більш невідоме (лат.).

Що ж стосується застосування не типів, але конкретних змінних і об'єктів, що фігурують в інших формах, то це використання відбувається якраз в implementation, і тут кругові посилання цілком припустимі. При роботі з декількома формами важливо також враховувати порядок їх створення. Це стосується обробки подій OnCreate - звертатися можна тільки до створеним формам.

Var ControlFom: TControlFom;

 



Практична робота № 34 | Implementation