DELPHI实现文本文件显示和声音同步播放
点击次数:50 次 发布日期:2008-11-09 08:40:38 作者:源代码网
|
源代码网推荐 源代码网推荐 ---- 在一些语言教学软件中,经常使用文本显示和声音同步播放,我们可以用DEL PHI实现之。 源代码网推荐 源代码网推荐 ---- 一、材料的制作 源代码网推荐 源代码网推荐 ---- 首先,我们选择几篇文章,这里我们选择马丁路德金、林肯和里根的演说,每一篇文章分为若干句,在制作声音文件时,记下每个句子的开始时间和结束时间,然后将其记到一个数据表中,这个表有如下字段:NO、TEXT、STARTTIME,分别表示每句序号、内容、开始时间。 源代码网推荐 源代码网推荐 ---- 二、 界面的制作 源代码网推荐 源代码网推荐 ---- 在DELPHI中创建一个新工程,在FORM中放入多媒体控件,RTF编辑器,命令按钮,单选分组框,数据表,时钟和标签,如图所示 源代码网推荐 源代码网推荐 ---- 三、各个控件的属性 源代码网推荐 源代码网推荐 ---- 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特性加上‘演讲内容。 源代码网推荐 源代码网推荐 ---- 四、代码的编写 源代码网推荐 源代码网推荐 ---- 1、变量声明 源代码网推荐 源代码网推荐 var isend:Boolean; 源代码网推荐 CurrentButton:TMPBtnType; 源代码网推荐 CurrentPlay,CurrentDisp:longint; 源代码网推荐 源代码网推荐 ---- 其中isend表示播放是否已经到了末尾,CurrentButton表示当前MediaPlayer元件中按下了哪个按钮,CurrentPlay ,CurrentDisp表示当前播放记录及当前显示记录。 源代码网推荐 ---- 2、在FormCreate事件中做一些必要的准备工作,其代码如下: 源代码网推荐 源代码网推荐 procedure TForm1.FormCreate(Sender: TObject); 源代码网推荐 begin 源代码网推荐 Table1.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); 源代码网推荐 begin 源代码网推荐 MediaPlayer1.Close; Table1.Close; 源代码网推荐 case radiogroup1.ItemIndex of 源代码网推荐 0: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:="ex3.wav"; 源代码网推荐 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); 源代码网推荐 begin 源代码网推荐 DoDefault:=False; 源代码网推荐 with MediaPlayer1 do 源代码网推荐 begin 源代码网推荐 case Button of 源代码网推荐 btPlay : begin 源代码网推荐 if isend=true then 源代码网推荐 begin 源代码网推荐 Table1.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 then 源代码网推荐 CurrentButton:=btpause 源代码网推荐 else if CurrentButton=btpause then 源代码网推荐 CurrentButton:=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 of 源代码网推荐 btPlay: Play; 源代码网推荐 btpause:pause; 源代码网推荐 btStop:Stop; 源代码网推荐 end; 源代码网推荐 end; 源代码网推荐 end; 源代码网推荐 源代码网推荐 源代码网推荐 ---- 5、为了能同步显示文本,需要编写定时器OnTime事件的代码,如果当前播放的时间超过了当前记录的开始时间,则设置CurrentPlay为当前记录号,如果CurrentPlay超过了CurrentDisp ,则显示当前记录。 源代码网推荐 procedure TForm1.Timer1Timer(Sender: TObject); 源代码网推荐 begin 源代码网推荐 with MediaPlayer1 do 源代码网推荐 begin 源代码网推荐 if CurrentButton=btPlay then 源代码网推荐 begin 源代码网推荐 if not Table1.eof and (Position 源代码网推荐 >Table1.FieldValues["STARTTIME"]) 源代码网推荐 then 源代码网推荐 begin CurrentPlay:=Table1.recno; 源代码网推荐 if CurrentPlay >=CurrentDisp then 源代码网推荐 begin 源代码网推荐 RichEdit1.Lines.add(Table1.fieldvalues["TEXT"]); 源代码网推荐 CurrentDisp:=CurrentDisp 1; 源代码网推荐 end; 源代码网推荐 Table1.Next; 源代码网推荐 end; 源代码网推荐 if Table1.eof then 源代码网推荐 begin 源代码网推荐 CurrentButton:=btStop; 源代码网推荐 isend:=true; 源代码网推荐 end; 源代码网推荐 end; 源代码网推荐 end; 源代码网推荐 end; 源代码网推荐 源代码网推荐 ---- 注:在MediaPlayer的click事件中,使用了btPrev,btNext等常量,为了能够通过编译,在uses子句中需将ComCtrls放在mPlayer之前,以免引起冲突。 源代码网推荐 源代码网供稿. |
