Предлагаю простенькое готовое расширение для DataExpress, которое добавляет две функции для взаимодействия с пользователем с помощью звуков и голоса. Обе функции работают в фоновом режиме (асинхронно) — программа не подвисает во время воспроизведения, и пользователь может сразу продолжать работу.
Основные фишки модуля:
- Умные относительные пути — функции не привязаны к конкретному диску или папке (базу можно носить на флешке).
- Всеядный синтаксис слэшей — модуль сам исправляет прямые веб-слэши / на обратные виндовые \.
- Синтез речи без файлов — робот говорит любой переданный текст встроенным голосом Windows (SAPI), искать и скачивать аудиофайлы больше не нужно.
- Защита от сбоев — если в операционной системе вырезан голосовой движок, программа не выдаст ошибку, а просто пропустит шаг.
Как использовать в проекте:
После добавления расширения функции появятся в Дизайнере выражений в группе «Мультимедиа».
Их можно использовать в действиях кнопок без написания кода формы или вызывать по условию.
Примеры вызовов:
Код: Выделить всё
// Проиграть файл ding.wav из папки tools, которая лежит рядом с DataExpress.exe
PLAY_SOUND('/tools/ding.wav')
// Озвучить событие голосом робота (используется стандартный русский голос Windows)
SAY_TEXT('Появилась новая информация')
Код расширения:
Код: Выделить всё
{@module
Author=
Version=1.0
Description=<b>Модуль Мультимедиа</b><p>Добавляет в систему функции фонового воспроизведения звуковых файлов (WAV) с автоматической обработкой относительных путей и голосового оповещения через встроенный синтезатор речи Windows (SAPI).
@}
{@function
OrigName=PLAY_SOUND
Name=PLAY_SOUND
Args=v
Result=
Group=Мультимедиа
Description=Процедура проигрывания звука с поддержкой относительных и абсолютных путей.<p><b>Параметры:</b> путь к имени аудиофайла (можно использовать / или \)<p><b>Пример:</b><p><code>PLAY_SOUND('/tools/ding.wav')</code><p><code>PLAY_SOUND('C:\Windows\Media\tada.wav')</code>
@}
function PlaySound(pszSound: PChar; hmod: WORD; fdwSound: integer): boolean;
external 'PlaySoundA@winmm.dll stdcall';
var GlobalVoice: Variant;
procedure PLAY_SOUND(v: variant);
var
FullPath: String;
i: Integer;
begin
if (v = Null) or (VarToStr(v) = '') then Exit;
FullPath := VarToStr(v);
for i := 1 to Length(FullPath) do
if FullPath[i] = '/' then FullPath[i] := '\';
if (Length(FullPath) > 0) and (FullPath = '\') then
Delete(FullPath, 1, 1);
if Pos(':', FullPath) = 0 then
FullPath := ExtractFilePath(Application.ExeName) + FullPath;
PlaySound(PChar(FullPath), 0, 1);
end;
{@function
OrigName=SAY_TEXT
Name=SAY_TEXT
Args=v
Result=
Group=Мультимедиа
Description=Голосовое оповещение (синтез речи Windows). Робот произнесет переданный текст.<p><b>Параметры:</b> Текст для озвучки<p><b>Пример:</b><p><code>SAY_TEXT('Появилась новая информация')</code>
@}
procedure SAY_TEXT(v: variant);
begin
if (v = Null) or (VarToStr(v) = '') then Exit;
try
if VarIsEmpty(GlobalVoice) then
GlobalVoice := CreateOleObject('SAPI.SpVoice');
GlobalVoice.Speak(VarToStr(v), 1);
except
end;
end;