为我点的歌 烙上标志

技术与开发

我原本是一家大公司的职员,年终时被裁掉了,现在一家KTV当管理人员。工作没有几天,我就发现了单位使用的练歌软件缺少人性化,客户点播的歌曲多了后,容易出现不知道当前播放的歌曲是谁点的情况,在人越多的时候这种情况越明显。我开发了一个练歌的小程序(下载地址:http://shudoo.com/bzsoft),能动态显示歌曲点播者的姓名,得到了老板和客人的大力称赞。

5-f9-1-2.jpg

练歌房需求:客人点歌时需要记录下歌曲名和对应的点播者姓名(比如王先生、李小姐,也可以是代号),歌曲点播完毕后客人可以对点播的歌曲进行排序,排序后自动依次播放歌曲(播放时在屏幕最左上角显示点播者的姓名和当前的歌曲名)。在自动播放时,允许客人对歌曲的播放顺序进行再次调整。

软件原理:软件有两个列表,一个是歌曲列表,另外一个是播放列表。先要读取歌曲文件路径,创建歌曲列表,当客户双击歌曲列表选中某首歌曲时,弹出一个输入框,输入点播者姓名或者代号后,该歌曲就被添加到播放列表中了。当歌曲播放时,会显示当前播放的点播者姓名和歌曲名。

技术要点:捕捉RealAudio控件播放当前歌曲完毕信息是本软件的核心,如果不能捕捉到歌曲播放完毕的信息就不能自动播放下一首歌曲。RealAudio控件有一个OnPlayStateChange事件,它有个系统变量lNewState,为0表示当前视频或者音频文件播放完毕,当不为0表示正在播放视频或者音频文件。因此要用一个时钟控件来扫描lNewState的值,并根据lNewState的值作相应的处理。

软件开发步骤

第一步:新建一个music.ini(存储歌曲文件的路径),然后启动Delphi7.0,新建一个工程,并在Form1窗体上添加一个FileListBox1控件(用于列举某个目录下所有歌曲文件)、四个Edit控件(用于输入歌曲的存储路径、显示当前播放的歌曲名和演唱者姓名等)、一个StringGrid控件(用于存储点播的歌曲列表)、九个Button控件(用于操作歌曲顺序等)、一个Timer控件(捕捉播放器是否完成当前歌曲的播放)。

接着,新建一个Form2窗体,在窗体上添加一个RealAudio控件,设置它的Controls属性为IMAGEWINDOW,CONTROLPANEL,STATUSBAR,添加一个StaticText控件(用于显示当前播放的歌曲名和演唱者姓名)。

第二步:创建歌曲列表,通过读写music.ini文件来搞定。需要让music.ini“记住”歌曲的存放路径。输入相关代码,其中关键代码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):

Edit3.Text:= MyIniFile.readstring('SqlConn','ConnString',''); //把music.ini文件内存储的文件路径读取出来

if key=13 then//在Edit中输入后按下回车键

begin

FileListBox1.Directory:=Edit3.Text;//设置路径

FileListBox1.Mask:='*.rmvb';//文件类型可以变

第三步:创建播放列表,然后对歌曲进行排序,例如上移或者下移等。输入相关代码,其中关键代码如下所示(完整代码下载地址:http://www.shudoo.com/

bzsoft):

i:=stringgrid1.Row;//取得选中的行的焦点

if i <=1 then Exit;//如果选中的行小于等于1则不操作,因为第一行不能上移了

s:=TStringList.Create;

s.Assign(stringgrid1.Rows[i-1]);//进行数据交换

第四步:客人点好歌后,就可以自动播放歌曲了。这里自定义一个过程,来实现播放歌曲。输入相关代码,其中关键代码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):

music :=stringgrid1.Cells[1,musicno];//取出播放列表的第一行的歌曲名和演唱者姓名

name := stringgrid1.Cells[2,musicno];

Edit4.Text:='下面是'+name+'演唱:'+music;//在点播窗口中显示歌曲名和演唱者姓名

Form2.StaticText1.Caption:=Edit4.Text ;//在播放窗口中显示歌曲名和演唱者姓名,这里不用Label控件的原因是StaticText1控件可以在RealAudio1之上不被覆盖,Label控件则没有这个功能

music:=edit3.Text+'\'+music+'.rmvb';

Form2.RealAudio1.source:=music;//指定播放的歌曲名

Form2.RealAudio1.doplay;//打开并启动播放器

第五步:当歌曲播放完毕后,自动播放下一首,利用playflag变量来实现。输入相关代码,其中关键代码如下所示(完整代码下载地址:http://www.shudoo.com/

bzsoft):

playflag:= lNewState;//把lNewState的值写给playflag,这个值为0表示播放完成

if (lNewState=0) then

begin

lNewState:=6;//如果播放完成就改变这个值,改变值后将再次触发事件,保证playflag的值不总是0状态

编后

在播放过程中RealAudio的lNewState的值是不固定的但肯定不是0,一旦播放结束,lNewState就变为0了。根据这个道理还可以设计自动播放功能,甚至可以设置播放2个或3个电影文件后暂停30分钟(休息和喝水时间),然后再继续播放电影文件。