使用DELPHI实现文本文件显示和声音同 步

earth田兵兵

earth田兵兵

2016-02-19 17:27

人生本是一个不断学习的过程,在这个过程中,图老师就是你们的好帮手,下面分享的使用DELPHI实现文本文件显示和声音同 步懂设计的网友们快点来了解吧!

  在一些语言教学软件中,经常使用文本显示和声音同步播放,我们可以用DEL PHI实现之。

  一、材料的制作

  首先,我们选择几篇文章,这里我们选择马丁路德金、林肯和里根的演说,每一篇文章分为若干句,在制作声音文件时,记下每个句子的开始时间和结束时间,然后将其记到一个数据表中,这个表有如下字段:NO、TEXT、STARTTIME,分别表示每句序号、内容、开始时间。

  二、 界面的制作

  在DELPHI中创建一个新工程,在FORM中放入多媒体控件,RTF编辑器,命令按钮,单选分组框,数据表,时钟和标签,如图所示

  三、各个控件的属性

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  1、 多媒体控件的AutoEnable和AutoOpen特性设置为False ,VisibleButtons特性设置Record、Eject、Step为不可见。

  2、 Table控件的DatabaseName设为存放表的目录,我们将应用程序、声音文件和表存放在myprog目录,因此这里将DatabaseName设为c:myprog,将TableName设为默认的播放文件对应的数据表的名字,这里设为ex1.dbf。

  3、 Radiogroup控件的Caption设为 ‘请选择播放内容’,Itmes特性中加上三行:马丁路德金,林肯,里根。

  4、 Richedit控件的Lines特性加上‘演讲内容。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  四、代码的编写

  1、变量声明

var isend:Boolean;CurrentButton:TMPBtnType;CurrentPlay,CurrentDisp:longint;
   其中isend表示播放是否已经到了末尾,CurrentButton表示当前MediaPlayer元件中按下了哪个按钮,CurrentPlay ,CurrentDisp表示当前播放记录及当前显示记录。

  2、在FormCreate事件中做一些必要的准备工作,其代码如下:

procedure TForm1.FormCreate(Sender: TObject);beginTable1.TableName:=ex1.dbf; Table1.Open;MediaPlayer1.FileName:=ex1.wav;MediaPlayer1.Open;  MediaPlayer1.TimeFormat:=tfMilliseconds;isend:=False;CurrentButton:=btStop;CurrentDisp:=1;CurrentPlay:=1;end;
   3、在单选分组框中加进如下代码:
procedure TForm1.RadioGroup1Click(Sender: TObject);beginMediaPlayer1.Close; Table1.Close;case radiogroup1.ItemIndex of0:begin MediaPlayer1.FileName:=ex1.wav;  Table1.TableName:=ex1.dbf;end;1:begin MediaPlayer1.FileName:=ex2.wav;  Table1.TableName:=ex2.dbf;end;2:begin MediaPlayer1.FileName:=ex  av;  Table1.TableName:=ex3.dbf; end;end;Table1.Open; MediaPlayer1.Open;end;  
   4、为了适当修改MediaPlayer元件中各个按钮的功能,需要编写MediaPlayer元件的click事件的代码,主要是修改快进及快退的功能,使其每次移动一句,且移动后直接播放,而不用再按播放按钮。为达到这个功能,在过程的一开始,设置DoDefault参数为False,表示不执行默认的动作,在过程的中间部分,加上必要的处理,在过程的结束处,写上根据按下的按钮执行相应功能语句。
procedure TForm1.MediaPlayer1Click(Sender: TObject;Button: TMPBtnType; var DoDefault: Boolean);beginDoDefault:=False;with MediaPlayer1 dobegincase Button ofbtPlay : beginif isend=true thenbeginTable1.first; Position:=start;CurrentPlay:=1; CurrentDisp:=1;isend:=False;RichEdit1.lines.clear; RichEdit1.lines.add  (演讲内容);end;CurrentButton:=btPlay;end;btStop : begin CurrentButton:=btStop;isend:=true;   end;btpause: if CurrentButton=btPlay thenCurrentButton:=btpauseelse if CurrentButton=btpause thenCurrentButton:=btPlay;btPrev: begin CurrentButton:=btPrev;Table1.Prior;Position:=Table1.fieldvalues[STARTTIME];CurrentButton:=btPlay;end;btBack: begin CurrentButton:=btBack;Table1.first; Position:=start;CurrentPlay:=1;  CurrentDisp:=1;RichEdit1.lines.clear;RichEdit1.lines.add  (演讲内容);CurrentButton:=btPlay;end;btNext: begin CurrentButton:=btNext;Table1.Next;Position:=Table1.fieldvalues[STARTTIME];CurrentButton:=btPlay;end;end;case CurrentButton ofbtPlay: Play;btpause:pause;btStop:Stop;end;end;end;  
   5、为了能同步显示文本,需要编写定时器OnTime事件的代码,如果当前播放的时间超过了当前记录的开始时间,则设置CurrentPlay为当前记录号,如果CurrentPlay超过了CurrentDisp ,则显示当前记录。
procedure TForm1.Timer1Timer(Sender: TObject);beginwith MediaPlayer1 dobeginif CurrentButton=btPlay thenbeginif not Table1.eof and (Position  $#@62;Table1.FieldValues[STARTTIME])thenbegin CurrentPlay:=Table1.recno;if CurrentPlay $#@62;=CurrentDisp thenbeginRichEdit1.Lines.add(Table1.fieldvalues[TEXT]);CurrentDisp:=CurrentDisp+1;end;Table1.Next;end;if Table1.eof thenbeginCurrentButton:=btStop;isend:=true;end;end;end;end;
   注:在MediaPlayer的click事件中,使用了btPrev,btNext等常量,为了能够通过编译,在uses子句中需将ComCtrls放在mPlayer之前,以免引起冲突。

展开更多 50%)
分享

猜你喜欢

使用DELPHI实现文本文件显示和声音同 步

编程语言 网络编程
使用DELPHI实现文本文件显示和声音同 步

Linux如何使用grep命令搜索文本文件

电脑入门
Linux如何使用grep命令搜索文本文件

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

INI参数(文本文件)的读写

编程语言 网络编程
INI参数(文本文件)的读写

Word文档批量转为文本文件

办公软件
Word文档批量转为文本文件

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

打开文本文件各种方法

编程语言 网络编程
打开文本文件各种方法

html读出文本文件内容

Web开发
html读出文本文件内容

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

在DELPHI程序中使用ADO对象存取ODBC数

在DELPHI程序中使用ADO对象存取ODBC数

Win8装 .NET 3.5 时出现0x800F081F错误怎么办?

Win8装 .NET 3.5 时出现0x800F081F错误怎么办?
下拉加载更多内容 ↓