Автор работы: Пользователь скрыл имя, 24 Мая 2013 в 16:39, реферат
В этом разделе не описаны расположенные на этой странице компоненты TDDEClient, TDDEClientItem, TDDEServer И TDDEServerItem.
Они рассчитаны на поддержку устаревшей технологии межпрограммного обмена данными DDE - Dynamic Data Exchange (динамический обмен данными), которая в современных программах полностью вытеснена технологией OLE.
КОМПОНЕНТЫ СТРАНИЦЫ SYSTEM
В этом разделе не описаны расположенные на этой странице компоненты TDDEClient, TDDEClientItem, TDDEServer И TDDEServerItem.
Они рассчитаны на поддержку устаревшей технологии межпрограммного обмена данными DDE - Dynamic Data Exchange (динамический обмен данными), которая в современных программах полностью вытеснена технологией OLE.
18.4.1. TTimer - таймер
Компонент TTimer (таймер) служит для отсчета интервалов реального времени. Его свойство interval определяет интервал времени в миллисекундах, который должен пройти от включения таймера до наступления события onTimer. Таймер включается при установке значения True в его свойство Enabled. Раз включенный таймер все время будет возбуждать события onTimer до тех пор, пока его свойство Enabled не примет значения False.
Следует
учесть, что в силу специфики реализации
аппаратного таймера
var
BegTime: TDateTime;
procedure TFormI.TimerlTimer(Sender: TObject);
var
h, m, s, ms: Word;// Переменные для декодирования времени
const
MaxTick = 10; // Количество интервалов таймера
begin
if Tag = 0 then
BegTime := Time; // Запоминаем начальное время
Tag := Tag + 1; // Наращиваем счетчик тиков
if Tag = MaxTick then
begin
Timeri.Enabled := False; // Выключаем таймер
// Декодируем значение 1 тика
DecodeTime((Time-BegTime)/
// Выводим результат в заголовке окна:
Caption := IntToStr(s) + ' s ' + IntToStr(ms) + ' ms'
end
end;
Обратите внимание на определение глобальной переменной BegTime в области видимости процедуры TimerlTimer. Необходимость нескольких (MaxTick) срабатываний для точного усреднения результата связана с тем, что системные часы также обновляются каждые 55 мс. После запуска программы в заголовке окна вы увидите строку
О s 55 ms,
в которой указывается, сколько реального времени разделяет два соседних события OnTimer. Этот результат повторится для любых значений константы MaxTick. Если вы установите Interval таймера в диапазоне от 56 до 110 миллисекунд, в заголовке будет указано 110 ms И Т. Д.
18.4.1.1. Мультимедийный таймер
В ряде практически важных применений (при разработке игр, в системах реального времени для управления внешними устройствам и т. п.) интервал 55 мс может оказаться слишком велик. Современный ПК имеет мультимедийный таймер, период срабатывания которого может быть от 1 мс и выше. Однако этот таймер не имеет компонентного воплощения, поэтому для доступа к нему приходится использовать функции API.
Общая
схема его использования
procedure TimeProc(uID, uMsg: UINT; dwUser, dwi, dw2: DWORD);
stdcall;
Здесь uID - идентификатор события таймера (см. ниже); uMsg - не используется; dwuser - произвольное число, передаваемое процедуре в момент запуска таймера; dwi, dw2 - не используются. Запуск таймера реализуется функцией
function timeSetEnet(uDelay, uResolution: UINT;
IpTimeProc:Pointer;
dwUser: DWORD;
fuEvent: UINT): UINT;
stdcall;
external 'winmm.dll';
Здесь uDelay - требуемый период срабатывания таймера (в мс);
uResolution - разрешение таймера; значение
0 означает, что события срабатывания
таймера будут возникать с
максимально возможной
Таймер останавливается, и связанные
с ним системные ресурсы
function timeKillEvent(uID: UINT): UINT;
stdcall; external 'winmm.dll';
Здесь uID - идентификатор события таймера, полученный с помощью timeSetEvent.
В следующем примере иллюстрирует
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls;
type
TfmExample = class(TForm)
Panell: TPanel;
bbRun: TBitBtn;
bbClose: TBitBtn;
edinput: TEdit;
IbOutput: TLabel;
mmOutput: TMemo;
procedure bbRunClick(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations
end;
var
fmExample: TfmExample;
implementation
{$R *.DFM} // Объявление экспортируемых функций:
function timeSetEvent(uDelay, uReolution: UINT; IpTimeProc:
Pointer;
dwUser: DWORD; fuEvent: UINT): Integer;
stdcall;
external
'winmm';
function timeKillEvent (uiD: UINT): Integer;
stdcall;
external 'winmm' ;
// Объявление глобальных переменных
var
uEventID: UINT; // Идентификатор события таймера
BegTime: TDateTime; // Засечка времени
Counter: Integer; // Счетчик повторений
Delay: Word; // Период срабатывания
procedure ProcTime(uID, msg:. UINT; dwUse, dwi, dw2: DWORD);
stdcall;
// Реакция на срабатывание таймера (процедура обратного вызова)
var
h, m, s, ms: Word; // Переменные для декодирования времени
const
MaxCount = 55; // Количество повторений
begin
timeKillEvent(uEventID); // Останавливаем таймер
Counter := Counter+1; // Наращиваем счетчик
if Counter=MaxCount then // Конец цикла?
begin // - Да: декодируем время
DecodeTime((Time-BegTime)/
fmExample.mmOutput.Lines.Add(
// Сообщаем результат
Format('Задано %s ms. Получено %d ms', [fmExample.edinput.Text, ms ] ) ) ;
fmExample.edinput.Text := ''; // Готовим повторение fmExample.edinput.SetFocus
end
else // - Нет: вновь пускаем таймер
uEventID := timeSetEvent(Delay,0,@
end;
procedure TfmExample.bbRunClick(Sender: TObject);
// Запускает таймер, edinput содержит требуемый период.
begin
// Проверяем задание периода
if edinput.Text='' then Exit;
try
Delay := StrToInt(edinput.Text)
except
ShowMessage('Ошибка ввода числа');
edinput.SelectAll;
edinput.SetFocus ;
Exit
end;
Counter := 0;
// Сбрасываем счетчик
BegTime := Time;
// Засекаем время
// Запускаем таймер:
uEventID := timeSetEvent(Delay,0,@
if uEventID=0 then
ShowMessage('Ошибка запуска таймера')
end;
procedure TfmExample.FormActivate(
begin
edinput.SetFocus
end;
end.
18.4.2. TPaintBox - окно для рисования
Назначение компонента TPaintBox - дать вам простое окно с канвой для рисования произвольных изображений. Канва содержится в свойстве Canvas компонента, графические инструменты - в свойствах Font, pen и Brush, а собственно рисование осуществляется в обработчике события OnPaint. Особенности использования этих инструментов см. в п. 16.4. Например, следующий обработчик создаст окно, показанное на рис. 18.35:
Рис. 18.35. Пример использования TPaintBox
procedure TFormI.PaintBoxIPaint(Sender: TObject);
var
X, Y: Integer;
begin
with PaintBoxl, Canvas do
begin
Brush.Color := cIRed;
Ellipse (0, 0, Width, Height);
Font.Name := 'Arial';
Font.Size := Height div 5;
Font.Style := [fsBold, fsltalic];
Font.Color := clWhite;
X := (Width - TextWidth('Delphi')) div 2;
Y := (Height - TextHeight('D')) div 2;
TextOut(X, Y, 'Delphi')
end
end;
При повторении примера положите на пустую форму компонент
TPaintBox И установите его размеры: Height = 100/ Width = 300.
18.4.3. TMediaPlayer - медиаплейер
Компонент TMediaPlayer представляет собой набор кнопок (рис. 18.36), предназначенных для управления различными мультимедийными устройствами (компакт-дисками, звуковыми картами и т. п.).
Рис. 18.36. Кнопки компонента TMediaPlayer
Если ваш компьютер оснащен звуковой картой, вставьте этот компонент в пустую форму, в его свойство FileName поместите название любого файла с расширением WAV (из каталога с: | winsows | media), установите в свойство Autoopen компонента значение True и запустите программу - после щелчка мышью по кнопке вы услышите звучание выбранного музыкального фрагмента. Как видите, использование компонента предельно просто. Он автоматически распознает тип мультимедийного устройства по расширению файла и берет на себя управление этим устройством. Разумеется, в каждый момент времени компонент может управлять лишь одним устройством, однако с помощью изменения содержимого FileName или явно с помощью свойства DeviceType программа может менять устройство, связанное с компонентом.
Каждая кнопка компонента имеет собственное имя, позволяющее программисту сделать какую-либо кнопку невидимой или недоступной. В следующей таблице приводится имя и назначение каждой кнопки (под носителем информации подразумеваются файлы и физические устройства, которые могут служить источником или приемником информации).
btStop |
Останавливает запись или воспроизведение |
btNext |
Позиционирует устройство на следующую дорожку или в конец носителя информации, если устройство не имеет дорожек |
btPrev |
Позиционирует устройство на предыдущую дорожку или в начало носителя информации, если устройство не имеет до |
btStep |
рожек Позиционирует устройство на один блок кадров ближе к концу носителя информации. Количество кадров в блоке |
btBack |
содержится в свойстве Frames компонента Позиционирует устройство на один блок кадров ближе к началу носителя информации |
btRecord |
Начинает запись в носитель информации |
btEject |
Освобождает устройство от носителя информации |
btPlay |
Запуск |
btPause |
Пауза |
Свойства компонента:
property AutoEnable: Boolean; |
Разрешает/запрещает |
property AutoOpen: Boolean;
|
Разрешает/запрещает |
property AutoRewind: Boolean;
|
Разрешает/запрещает автоматиче “перемотку” носителя информации в момент начала записи или воспроизведения. Игнорируется, если устройство имеет дорожки или если установлены значения в свойства startpos и EndPos |
TMPDevCaps = (mpCanStep, mpCanEject, mpCanPlay, mpCanRecord, mpUsesWindows); TMPDevCapsSet = set of TMPDevCaps; |
Содержит возможности |
property Capabilities: TMPDevCap sSet; TMPBtnType = (btPlay, btPause, btStop, btNext, btPrev, btStep, btBack, btRecord, btEject); |
Кнопки, перечисленные в этом свойстве, будут использовать умалчиваемые цвета, не перечисленные кнопки будут черно-белыми. |
TButtonSet = set of TMPBtnType;property ColoredButtons: Tbutton Set; |
По умолчанию множество ColoredButtons содержит все кнопки |
property DeviceID: Word; |
Содержит Windows-идентификатор |
TMPDeviceTypes = (dtAutoSelect, dtAVIVideo, dtCDAudio, dtDAT, dtDigitalVideo, dtMMMovie, dtOther, dtOverlay, dtScanner, dtSequencer, dtVCR, dtVideodisc, dtWaveAudio); property DeviceType: TMPDevice Types; |
Содержит тип устройства. Если Device- Type" dtAutoSelect, тип определяется автоматически по расширению файла в свойстве FileName. Каждое мультимедийное устройство в момент инсталляции указывает в файле system. ini, файлы с какими расширениями оно поддерживает |
property Display: TWinContrn: |
Содержит ссылку на окно для устройств, которые могут его использовать в процессе записи/воспроизведения |
property DisplayRect: TRect;
|
Содержит область окна Display, которое устройство может использовать для отображения процесса записи/воспроизведения. Для улучшения процесса отображения рекомендуется в DisplayRect указывать умалчиваемые размеры(задаются координатами 0,0 для правого нижнего угла) |
property EnabledButtons: TButtonSet; |
Содержит множество доступных кнопок (тип TButtonSet описан выше для свойства ColoredButtons) |
property EndPos: Longint;
|
Содержит положение носителя информации в момент прекращения записи или воспроизведения. Переустановка значения приводит к повторению записи или воспроизведения |
property Error: Longint; |
Содержит код ошибки. Доступно только для чтения |
property ErrorMessage: String; |
Содержит сообщение об ошибке. Доступно только для чтения |
property FileName: String;
|
Содержит имя читаемого или записываемого файла |
property Frames: Longing; |
Определяет количество кадров, пропускаемых при выполнении методов step или Back |
property Length: Longint; |
Содержит текущую длину |
TMPModes = (mpNotReady,-ipStopped, mpPlaying, mpRecord- ing, mpSeeking, mpPaused, -npOpen) ; property Mode: TMPModes;
|
Показывает текущее состояние мультимедийного устройства: mpNotReady - не готово; mpStopped - остановлено; mpPlaying - воспроизводит информацию; mpRecording -записывает информацию; mpSeeking - перемещает носитель информации; mpPaused - Приостановлено; mpOpen - от крыто. Доступно только для чтения |
property Notify: Boolean; PNotifyValues = (nvSuccessful, Superseded, nvAborted, nvFailre); |
Содержит True, если методы Back, Close, Eject, Next, Open, Pause, PauseOnly, Play, Previous, StartRecording, Resume, Rewind, Step и Stop будут создавать событие OnNotify Содержит результат последней команды, создающей событие OnNotify: nvSuccessful - выполнена успешно; nvSuperseded |
property NotifyValue: TMPNotify; Values;
|
заменена другой командой; nvAborted досрочно прервана; nvFailure - завершилась ошибкой. Доступно только для чтения |
property Position: Longint; |
Содержит текущую позицию |
property Shareable: Boolean;
|
Разрешает/запрещает другим компонентам и программам использовать устройство, связанное с данным компонентом |
property Start: Longing;
|
Содержит позицию от начала носителя, с которой начинается запись или воспроизведение. Определяется в момент открытия устройства и доступно только для чтения |
property StartPos: Longint;
|
Содержит текущую позицию от начала носителя, с которого начинается запись или воспроизведение |
TMPTimeFormats = (tfMilliseconds, tfHMS, tfMSF, tfFrames,tfSMPTE24, tfSMPTE25, tfSMPTESO,tfSMPTE30Drop, tfBytes, tfSam ples, tfTMSF);property TimeFormat: TMPTimeFor mats; |
Определяет формат представления данных в свойствах StartPos, Length, Position, Start и Endpos (см. пояснения ниже)
|
property TrackLength[TrackNum: Integer]: Longint; |
Возвращает длину (в формате TimeFormat) дорожки с индексом TrackNum. Доступно только для чтения |
property TrackPosition[TrackNum: Integer]: Longint
|
Возвращает стартовую позицию (в формате TimeFormat) дорожки С индексом TrackNum. Доступно только для чтения |
property Tracks: Longint;
|
Содержит количество дорожек в открытом устройстве. Доступно только для чтения |
property VisibleButtons: TButtonSet; |
Содержит множество видимых кнопок (тип TButtonSet описан выше для свойства ColoredButtons) |
property Wait: Boolean;
|
Если содержит True, управление возвращается в программу только после завершения перехода устройства в другое состояние, связанное с методами Back, Close, Eject, Next, Open, Pause, PauseOnly, Play, Previous, StartRecording, Resume, Rewind, Step или Stop |
Если свойство AutoEnabie имеет значение True, компонент автоматически по типу устройства или расширению файла и значению свойства Mode определяет, какие кнопки будут доступны пользователю. Если AutoEnabie=Faise, доступными будут только те кнопки, которые входят в множество EnabiedButtons. Множество Enabied-
Buttons игнорируется, если AutoEnable=True.
Свойство AutoRewind игнорируется, если устройство имеет дорожки или если процесс записи/воспроизведения вызван изменением значения в свойстве StartPos или Endpos.
Положение носителя В свойствах StartPos, Length, Position, Start и EndPos В Зависимости от значения свойства TimeFormat должно интерпретироваться следующим образом (отсчет ведется от начала носителя информации):
tfMilliseconds |
Миллисекунды в диапазоне от 0 до 4 294 967 295 Часы, минуты, секунды. |
tfHMS |
Занимают в порядке |
tfMSF |
Минуты, секунды и кадры. Занимают в порядке перечисления по одному байту начиная с младшего. Старший байт Longint не используется |
tfFrames |
Кадры в диапазоне от 0 до 4 294 967 295 |
tfSMPTE24 |
Часы, минуты. секунды и количество блоков по 24 кадра в секунду. Занимают в порядке перечисления по одному байту начиная с младшего |
tfSMPTE25 |
Часы, минуты, секунды и количество блоков по 25 кадров в секунду |
tfSMPTE30 |
Часы, минуты, секунды и количество блоков по 30 кадров в секунду |
tfSMPTE30Drop |
Часы, минуты, секунды и количество пропущенных блоков по 30 кадров в секунду |
tfBytes |
Байты в диапазоне от 0 до 4 294 967 295 |
tfSamples |
Количество условных блоков информации в диапазоне от 0 до 4294967295 |
tfTMSF |
Дорожки, минуты, секунды и кадры. Занимают в порядке перечисления по одному байту начиная с младшего |
Свойство
TimeFormat недоступно из окна Инспектора объектов
и устанавливается
Методы компонента:
procedure AutoButtonSet(Btn: TMPBtnType); dynamic;
|
Реализует разрешение/запрещение кнопок компонента при установке в свойство AutoEnable значения True Перемещает текущую позицию в носителе информации назад на количество кадров, содержащихся В свойстве Frames |
procedure Back; |
По умолчанию вызывает обработчик события OnClick. |
procedure Click(Button: TMPBtnType; var DoDefault: eoolean); dynamic ; |
Предназначен для перекрытия в потомках |
procedure Close; |
Закрывает связанное с компонентом устройство |
procedure DoNotify; dynamic; |
По умолчанию вызывает обработчик события OnNotify. Предназначен для перекрытия в потомках |
procedure Eject; |
Выгружает носитель информации из устройства |
procedure MMNotify(var Message: TMessage); message :MCINOTIFY; |
Реализует отклик на сообщение Windows мм mcinotify. По умолчанию вызывает метод DoNotify |
procedure Next; |
Перемещает текущую позицию носителя на начало следующей дорожки, а если устройство не имеет дорожек - в конец носителя |
procedure Notification ( AComponent: TComponent; Operation: TOperation); override; |
Извещает компонент AComponent о том, что завершилась операция Operation |
procedure Open; |
Открывает мультимедийное устройство |
procedure Pause; |
Приостанавливает процесс приостановлено, восстанавливает процесс с помощью вызова метода Resume |
procedure PauseOnly;
|
Приостанавливает процесс или записи информации. Если устройство уже было приостановлено, ничего не делает |
procedure Play;
|
Начинает воспроизведение с позиции StartPos, а если это свойство не установлено - с текущей позиции position |
procedure PostClick (Button: TMPBtnType); dynamic; |
Реализует отклик на событие OnPostClick. По умолчанию вызывает соответствующий обработчик события |
procedure Previous;
|
Перемещает текущую позицию носителя на начало предыдущей дорожки, а если устройство не имеет дорожек - в начало носителя |
procedure Resume;
|
Восстанавливает процесс записи или воспроизведения. Вызывается при повторном щелчке по кнопке btPause |
procedure Rewind; |
Перемещает текущую позицию носителя к положению, определяемому свойством Start |
procedure Save; |
Сохраняет информацию в файле с именем FileName |
procedure StartRecording; |
Начинает запись информации с текущей позиции или позиции StartPos |
procedure Step;
|
Перемещает текущую позицию в носителе информации вперед на количество кадров, содержащихся В свойстве Frames |
procedure Stop; |
Прекращает запись или воспроизведение информации |
Для компонента определены следующие события: | |
EMPNotify = procedure (Sender: TObject; Button: TMPBtnType; var DoDefault: Boolean) of object; property OnClick: EMPNotify; |
Возникает после щелчка по кнопке Button компонента. Если DoDefault=True, вызывается метод, связанный с этой кнопкой
|
property OnNotify: TNotifу Event; |
Возникает после завершения вызова одного из методов Back, Close, Eject, Next, Open, Pause, PauseOnly, Play, Previous, Resume, Rewind, StartRecording, Step или Stop,если свойство Notify имеет значение True |
EMPPostNotify = procedure (Sender: TObject; Button: TMPBtnType) of object; property OnPostClick: EMPPost-Notify; |
Если wait=True, событие OnPostClick возникает только после завершения соответствующей операции, вызванной событием OnClick, в противном случае - немедленно после OnClick |