Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LYeKTsII_GURSKOGO_1.doc
Скачиваний:
10
Добавлен:
16.11.2019
Размер:
3.31 Mб
Скачать

Два вида программ мультимедиа

· Иногда приходится предоставлять пользователям простой путь для проигрывания максимально широкого круга файлов и затем позволить ему выбрать и воспроизвести подходящий файл. В этом случае, на форме обычно располагается TMediaPlayer, предоставляющий возможность управления воспроизведением.

· Иногда программист может захотеть скрыть от пользователя существование компонента TMediaPlayer. То есть, воспроизвести звук или видео без того, чтобы пользователь заботился об их источнике. В частности, звук может быть частью презентации. Например, показ какого-нибудь графика на экране может сопровождаться объяснением, записанным в WAV-файл. В течении презентации пользователь даже не знает о существовании TMediaPlayer. Он работает в фоновом режиме. Для этого компонент делается невидимым (Visible := False;) и управляется программно.

Пример программы с мультимедиа

В данной главе мы рассмотрим пример построения приложения с мультимедиа первого типа. Создайте новый проект (File | New Project). Поместите TMediaPlayer на форму; поместите (страница WIN 3.1) компоненты TFileListBox, TDirectoryListBox, TDriveComboBox, TFilterComboBox для выбора файла. В свойстве FileList для DirectoryListBox1 и FilterComboBox1 поставьте FileListBox1. В свойстве DirList для DriveComboBox1 поставьте DirectoryListBox1. В свойстве Filter для FilterComboBox1 укажите требуемые расширения файлов:

AVI File (*.avi) | *.avi

WAVE File (*.wav) | *.wav

MIDI file (*.MID) | *.mid

Пусть мы хотим по двойному щелчку мышкой на компоненте FileListBox1 воспроизводить выбранный файл. Тогда в обработчике события OnDblClick для FileListBox1 следует записать:

Procedure TForm1.FileListBox1DblClick(Sender:TObject);

begin

with MediaPlayer1 do

begin

Close;

FileName := FileListBox1.FileName;

Open;

Play;

end;

end;

Внешний вид формы представлен на рис.4.

Рис.4. Начальный вид проекта

Сохраните проект, запустите его, выберите нужный файл и дважды щелкните на него мышкой. MediaPlayer должен воспроизвести этот файл в отдельном окне.

Как уже говорилось выше, видеоролик можно воспроизводить внутри формы, например, на панели. Давайте слегка модифицируем проект и добавим туда панель TPanel (см. рис.5). В свойстве Display для MediaPlayer1 укажите Panel1. Нужно убрать надпись с панели (Caption) и присвоить свойству BevelOuter := bvNone;

Чтобы переключаться при воспроизведении с окна на панель - поместите TСheckBox на форму и в обработчике события OnClick для него запишите:

procedure TForm1.CheckBox1Click(Sender: TObject);

var

Start_From : Longint;

begin

with MediaPlayer1 do

begin

if FileName ='' then Exit;

Start_From := Position;

Close;

Panel1.Refresh;

if CheckBox1.Checked then Display := Panel1

else Display := NIL;

Open;

Position := Start_From;

Play;

end;

end;

Запустите проект и воспроизведите видеоролик. Пощелкайте мышкой на компоненте CheckBox.

Рис.5. Добавлена панель для воспроизведения видео

и переключатель окно/панель

Во время выполнения программы может потребоваться отобразить текущее состояние объекта MediaPlayer и самого ролика (время, прошедшее с начала воспроизведения, длину ролика). Для этого у объекта TMediaPlayer есть соответствующие свойства и события: Length, Position, OnNotify и др.

Давайте добавим в проект прогресс-индикатор (TGauge), который отобразит в процентах, сколько прошло времени (см. рис.6). Для обновления показаний индикатора можно воспользоваться таймером. Поместите на форму объект TTimer и установите для него

Interval := 100; (100 миллисекунд).

В обработчике события OnTimer нужно записать:

procedure TForm1.Timer1Timer(Sender: TObject);

begin

with MediaPlayer1 do

if FileName<>'' then

Gauge1.Progress := Round(100*Position/Length);

end;

Запустите проект, выберите файл (AVI) и щелкните на нем два раза мышкой. При воспроизведении ролика прогресс-индикатор должен отображать процент, соответствующий прошедшему времени (см. рис.6).

Листинг DEMOVideo приведен ниже.

Unit DEMOVideo;

interface

uses

SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,

Forms, Dialogs, ExtCtrls, Gauges, FileCtrl, StdCtrls, MPlayer;

type

TForm1 = class(TForm)

MediaPlayer1: TMediaPlayer;

CheckBox1: TCheckBox;

FileListBox1: TFileListBox;

DirectoryListBox1: TDirectoryListBox;

DriveComboBox1: TDriveComboBox;

FilterComboBox1: TFilterComboBox;

Panel1: TPanel;

Gauge1: TGauge;

Timer1: TTimer;

Button1: TButton;

procedure FileListBox1DblClick(Sender: TObject);

procedure Timer1Timer(Sender: TObject);

procedure CheckBox1Click(Sender: TObject);

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FileListBox1DblClick(Sender: TObject);

begin

with MediaPlayer1 do

begin

Close;

Panel1.Refresh;

FileName := FileListBox1.FileName;

Open;

Play;

end;

end;

procedure TForm1.Timer1Timer(Sender: TObject);

begin

with MediaPlayer1 do

if FileName<>'' then

Gauge1.Progress := Round(100*Position/Length);

end;

procedure TForm1.CheckBox1Click(Sender: TObject);

var

Start_From : Longint;

begin

with MediaPlayer1 do

begin

if FileName ='' then Exit;

Start_From := Position;

Close;

Panel1.Refresh;

if CheckBox1.Checked then

Display := Panel1

else

Display := NIL;

Open;

Position := Start_From;

Play;

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

if FileListBox1.FileName ='' then Exit;

with MediaPlayer1 do

begin

Close;

Panel1.Refresh;

FileName := FileListBox1.FileName;

Open;

end;

end;

end.

Рис.6. Законченное приложение для воспроизведения AVI, WAV

и MDI файлов

ОТЛАДКА ПРОГРАММ

Эксперт Кода

В Delphi реализована замечательная новая особенность, называемая Экспертом Кода. Вы знаете, что вы хотите делать, но иногда забываете точный синтаксис некоторых операторов, например операторов типа If, For, While и других. Такая забывчивость может случиться с вами, если вы постоянно переключаетесь с одного языка программирования на другой. Но даже если вы и помните синтаксис, Delphi поможет вам и в этом случае. Эксперт Кода сэкономит ваше время и наберет часть текста за вас, исключив тем самым ошибки правописания, и сделает еще много других полезных вещей. Короче говоря, он облегчит вашу работу и сделает ее более продуктивной.

Эксперт Кода един в трех лицах:

  • - эксперт шаблонов кода,

  • - эксперт завершения кода,

  • - эксперт программных параметров.

Эксперт шаблонов кода. Предположим, вы набираете код некоторой программы и в следующей строке должны использовать оператор If. Вы можете набрать только If и затем нажать комбинацию клавиш Ctrl-J, после чего выбрать из всплывшего меню нужную вам разновидность оператора If. Вы можете сделать ваш выбор и дважды щелкнуть на нем или нажать Enter и нужный вариант кода будет подставлен в текст. Вам остается только заполнить пустоты в конструкции оператора. И все это волшебство выполняют шаблоны кода.

Delphi поставляется с целым набором шаблонов. Вы также можете редактировать, добавлять или удалять шаблоны, выполнив команду Tools | Code Templates (Инструменты | Программные шаблоны) и в возникающем в результате диалоговом окне Code Templates (Шаблоны кода) использовать соответствующие кнопки Add (добавить), Edit (редактировать) или Delete (удалить), чтобы сделать необходимые изменения.

Эксперт завершения кода. Эксперт завершения кода заканчивает код за вас, когда вы вводите имя класса и после него ставите точку (.). Этот эксперт может быть полезен при написании сложных компонентов и частом использовании одних и тех же объектов. Простой пример - класс ТАрplication. Вы можете набрать ТАрplication, в окне редактирования и список доступных свойств, методов и событий отобразится в открывшемся списке. Прокрутите список, пока не сделаете нужный вам выбор, дважды щелкните на нем и он будет добавлен после имени класса.

Эксперт программных параметров. Этот эксперт отображает параметры функций, процедур и методов в виде подсказки. Теперь больше не нужно пробираться через текст программы или использовать справку для того, чтобы найти соответствующие объявления и узнать, какие параметры ожидаются в данном вызове и в каком порядке. Чтобы активизировать эксперт программных параметров, вам нужно ввести имя процедуры, функции или метода и затем открывающуюся круглую скобку; после этого на экране появится подсказка со списком параметров. Например:

FileOpen (

Как только появится совет, вы можете подставить нужные аргументы и продолжать работу дальше.

Отладка

Рассмотрим две процедуры:

procedure TForm1.AddNum;

Var

Value1, Value2, Total : integer;

begin

Value1 := StrToInt(Edit1.Text);

Value1 := StrToInt(Edit2.Text);

Label1 := StrToInt(Value1 + Value2);

end;

procedure TForm1.Button1Click;

begin

AddSum;

end;

Составим программу, использующую эти две процедуры. Теперь выполним программу и обратим внимание на полученный результат. Введем два небольших числа и нажмем кнопку «Сложение». Выдаваемая программой сумма должна быть неправильной. Чтобы найти причину неправильного результата, воспользуемся отладчиком, позволяющим выполнять программу по шагам и наблюдать процесс ее работы.

Первое, что нам нужно сделать, это установить точку прерывания. С установленной точкой прерывания программа будет выполняться как обычно, пока процесс управления не дойдет до строки, на которой установлена точка прерывания. После этого отладчик остановит выполнение программы. Oneраторы строки, соответствующей точке прерывания, в этот момент еще не будут выполнены.

Чтобы установить точку прерывания, щелкните на сером поле окна редактирования слева от текста программы (назовем это поле полоской) напротив той строки, на которой вы хотите установить точку прерывания. В данном случае это будет строка:

Valuel := StrToInt (Editl.Text);

После этого строка должна выделиться красным цветом и большой красной точкой на полоске слева от этой строки, как показано на рис.6.10 (при условии, что вы используете установки среды по умолчанию).

По умолчанию, полоска (gutter) задается видимой, но она может быть отключена в странице Display (Монитор) диалогового окна Environment Options (Опции среды), если вы снимите флаг кнопки-переключателя с именем Visible Gutter (полоска видна). Если полоска не видна, то щелкните на первом символе той строки программы, в которой вы хотите установить точку прерывания, и строка будет высвечена красным.

Если вы устанавливаете точку прерывания на строке кода, которая была оптимизирована Delphi, на экране появится диалоговое окно предупреждения (Warning) с вопросом, будете ли вы продолжать дальше. Это же окно вы увидите, если будете устанавливать точку прерывания, например, в строке с объявлениями переменных Var. В некоторых случаях вам может понадобиться для исследования и отладки программы переменная, которая исключается при компиляции с оптимизацией. Вы можете отключить оптимизацию, для чего выполните команду View | Project Manager (Просмотр | Менеджер проекта) и в появившемся диалоговом окне Project Options (Опции проекта) выберите страницу Compiler (компилятор). Уберите флаг соответствующего переключателя в разделе Code Generation (Генерация кода) и оптимизация проводится не будет. Более подробно этот вопрос освящается в руководствах Delphi и во встроенной в Delphi справочной системе.

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

Выполните программу еще раз. Введите число 4 как Значение 1 и 5 как Значение 2, затем нажмите кнопку Сложение. Вслед за этим появится окно редактора кода, где будет отмечено местоположение точки прерывания, как показано на рис.6.11. Точка прерывания отмечена зеленым маркером на полоске, который означает то, что вы остановились в этой точке прерывания, а указывающая направо зеленая стрелка отмечает текущую строку программы. В данном случае, текущая строка должна быть строкой, в которой установлена точка прерывания. Эта строка еще не выполнялась. Другими словами, зеленая стрелка указывает на следующую, подлежащую выполнению строку.

Сделаем еще одно заключительное замечание относительно точек прерывания. Вы можете установить специальные точки прерывания, в которых программа будет останавливаться только при выполнении некоторого условия или на указанном шаге цикла. Точки останова этого типа могут быть очень полезны, если ошибка в вашей программе возникает только при определенных условиях или в середине очень большого цикла. Чтобы установить условие или номер шага цикла для точки прерывания, вам нужно воспользоваться командой меню Run | Add Breakpoint (Выполнить | Добавить точку прерывания), вызывающей диалоговое окно Edit Breakpoint (Редактирование точек прерывания). Поскольку сейчас мы не будем использовать такие точки прерывания, мы закончим на этом их обсуждение. За подробной информацией обращайтесь ко встроенной в Delphi справочной системе и к руководствам Delphi.

Дополнительные опции отладки

Раздел Run меню Delphi содержит некоторые дополнительные команды отладки, которые имеют соответствующие комбинации «горячих» клавиш:

Run (Выполнить) — F9

Откомпилировать и выполнить программу; при работе в режиме отладки — продолжать выполнение программы с данной точки.

Step Over (По шагам без захода в ...) — F8

Вызывает пошаговое выполнение программы со входом в вызываемые функции и процедуры

Trace Into (Трассировка с заходом в ...) — F7

Команда вызывает пошаговое выполнение строк программы, считая вызов функции или процеду­ры за одну строку, т. е. вход в функции и проце­дуры не производится.

Trace to Next Source Line (Трассировка до следующей строки) Shift+F7

Переход к следующей исполняемой строке.

Run to Cursor (Выполнить до курсора) — F4

Команда выполняет программу до того места, на котором расположен курсор в окне редактора кода.

Show Execution Point (Показать точку выполнения)

Команда помещает курсор на операторе, который будет выполняться следующим.

Просмотр значений переменных при помощи окна Watch

В Delphi имеются два способа просмотра значений переменных:

  • окно наблюдаемых величин (Watches),

  • ToolTip Expression Evaluation (Мастер оценки выражений).

Окно наблюдаемых величин дает возможность указать имена переменных, которые вы желаете контролировать и значения которых будут отображаться в небольшом окне. Чтобы добавить наблюдаемую величину, вы можете либо нажать Ctrl+F5, либо выполнить команду меню Run | Add Watch (Выполнить | Добавить наблюдаемую величину) и в появившемся диалоговом окне Watch Properties (Наблюдаемые величины), показанном на рис.6.12, определить следующие параметры: имена переменных, их типы и выражения. Например, вы можете задать

Value 1 + Value2

или

IntToStr(Value1).

В диалоговом окне Watch Properties в поле ввода выпадающего списка Expression (Выражение) наберите Valuel. В результате появится диалоговое окно Watch List (Список наблюдаемых величин), где будут отображаться наши наблюдаемые переменные и их текущие значения, как показано на рис.6.13.

Если переменная еще не была создана или не получила значение, то на том месте, где должно находиться значение, будут выводится различные сообщения, указывающие состояние переменной. Например, сообщение может быть таким:

Process not accessible

(Процесс недоступен).

это означает, что код, который создают эти переменные, или еще не выполнялся, или уже закончил свою работу и переменные были удалены из памяти.

Вы можете также получить сообщение:

Inaccessible here due to optimization

(Сейчас не доступна из-за оптимизации).

Это обычно означает, что переменная еще не получила значения. Как только начнут выполняться строчки кода, в которых используется наблюдаемая переменная, ее значение появится в диалоговом окне Watch List.

Добавьте в список наблюдаемых величин вашего приложения Addition переменные Value2 и Total. Для этого, вызовите диалоговое окно Watch Properties в соответствии с теми рекомендациями, что приводились выше, и введите имя переменной, за которой вы должны наблюдать (например, Value2 или Total), в поле ввода списка Expression. Затем нажмите кнопку ОК. Вы должны выполнить эти действия для каждой переменной. Теперь два раза нажмите клавишу F8 (команда Step Over), чтобы пройти оставшуюся часть процедуры и узнать значения переменных. При выполнении переменная Value1 имеет значение, которое должно быть присвоено переменной Value2, а Value2 имеет вообще какое-то странное значение, а вместо значения переменной Total выведено сообщение, в котором сказано, что эта переменная была удалена редактором связей.

Обратитесь к процедуре AddNum из листинга 6.2, и вы увидите, что значение Edit2.Text было присвоено переменной Value1, хотя оно должно было быть присвоено переменной Value2. Этот тип ошибки часто возникает в результате операций «вырезать и вставить», когда после выполнения операции вставки вы забываете изменить соответствующим образом имена переменных. По этой причине переменная Value2 так и осталась не инициализированной, и она имеет то значение, которое находилось в соответствующем месте памяти во время выполнения программы.

Теперь понятно что произошло с Value1 и Value2, но что же случилось с переменной Total? А случилось вот что. Поскольку эта переменная нигде не используется, редактор связей попросту удалил ее. Эта ситуация часто возникает при проектировании программ: вы вводите переменные, которые как вам первоначально думается, вы будете использовать. Затем, в процесс развития вашего проекта, вы решаете присваивать некое значение не промежуточной переменной, а непосредственному получателю этого значения, в нашем случае - соответствующему свойству метки. Но вы забываете npи этом вернуться назад и удалить объявление ненужной вам переменной. Эта переменная никому не мешает, но компилятор будет сообщать вам, что переменная Total не используется. А вы можете либо использовать ее когда либо потом, либо удалить ее объявление.

Использование окна сообщений компилятора при отладке

Вы должны уже были обратить внимание на окно списка в нижней части окна редактора кода. В этом списке отображаются ошибки, предупреждения, подсказки и другая информация. Если количество строк сообщений превышает размер списка, у него появляется линейка прокрутки. (Вернитесь к рис.6.11, на котором можно увидеть это окно списка.) Здесь вы можете найти полезную формацию, которая может помочь вам в отладке вашего кода.

Для нашего примера прикладной программы Addition будут выданы три сообщения об ошибках:

Hint: (36): Value assigned to 'Value1' never used.

(Замечание: значение, присвоенное переменной Value1 никогда не используется)

Warning: (38): Variable 'Value2 might not have been initialized.

(Предупреждение: Переменная 'Value2', вероятно, не инициализирована)

Hint: (34): Variable 'Total' is declared but never used in ‘AddNum'

(Замечание: Переменная 'Total' объявлена но никогда не используется в ‘AddNum').

Теперь, когда мы нашли некоторые ошибки, применив для этой цели отладчик, мы можем внести изменения в код программы, чтобы удалить ошибки и получить правильно работающую программу. Не забудьте выйти из программы, для чего нажмите на клавиши Ctrl+F2. Вернитесь к процедуре AddNum и измените Value1 на Value2 во второй строке после begin. He забудьте также удалить объявление переменной Total.

Выполните повторно программу, нажав клавишу F9. После того, как снова введете числа 4 для переменной Value1 и 5 - для Value2, программа остановится в точке прерывания, но сообщения об ошибках не появятся и значения будут правильными, в чем вы убедитесь при пошаговом выполнении программы. Для этого нажмите F8 - команду пошагового выполнения программы и наблюдайте значения переменных, как вы уже делали это ранее. Все значения должны быть правильными, как присваиваемые, так и вычисляемые (например, Value1=4 и Value2=5).

Исследование значений переменных с помощью ToolTip Expression Evaluation (Мастера оценки выражений)

Второй способ просматривать значения переменных предоставляет возможность Delphi, называемая Мастером оценки выражений. Для этого достаточно поместить курсор на переменной, объекте, параметре, константе или выражении и значение, которое в настоящий момент имеет переменная, отобразится в окне мастера оценки поблизости от курсора. В окне также будет помещаться информация в виде советов. Если переменной присвоено значение, то оно будет выведено в окне. Если переменная оптимизирована компилятором или переменная нигде не используется, как, например, переменная Total, то вы получите совет по этому поводу.

Этот метод исследования значения переменной намного проще и быстрее, чем использование окна Watch. Вы сэкономите много времени в том случае, если вы интересуетесь только несколькими переменными или исследуете в сеансе отладки небольшой раздел кода, потому что вы сможете легко контролировать то, что происходит в программе, выполняя ее в пошаговом режиме, и вам просто не нужно собирать целую кучу наблюдаемых величин.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]