

图1 歌曲播放模块界面
Fig 1 Interface of MP3 playing module
TOOLBAR类组件表示工具拦,所有与该模块相关的组件都置于该组件类之上;
COMBOBOX类组件表示下拉框,MP3的文件名在该类组件中显示;
TTIMER类组件执行与歌曲播放时间相关的操作;
TRACKBAR类组件表示歌曲播放的进度;
OPENDIALOG类组件执行打开MP3文件对话框;
LABLE1. CAPTION=“MP3设置:”
LABLE2. CAPTION=歌曲时间长度
TSPEEDBUTTON1.CAPTION=“打开”
TSPEEDBUTTON2.CAPTION=“播放”
TSPEEDBUTTON3.CAPTION=“暂停”
TSPEEDBUTTON4.CAPTION=“停止”
TSPEEDBUTTON5.CAPTION=“下一首”
TSPEEDBUTTON6.CAPTION=“上一首”
3.2.2 歌词显示模块界面设计
本模块窗体由1个LABLE类组件,1个TTIMER类组件。详细描述如下:
LABLE3. CAPTION中显示歌词内容;
TTIMER2验证编辑的歌词内容是否正确;
3.2.3 歌词编辑模块界面设计
2个TSPEEDBUTTON类组件,1个STRINGGRID类组件,6个LABLE类组件,5个EDIT类组件, 1个OPENDIALOG类组件, 1个SAVEDIALOG类组件。歌词编辑模块界面如图2所示。
图2 歌词编辑模块界面
Fig 2 Interface of Lyrics editing module
TSPEEDBUTTON7.CAPTION=“打开”
TSPEEDBUTTON8.CAPTION=“保存”
LABLE3. CAPTION=“歌词设置:”
LABLE4. CAPTION=“当前时间:”
LABLE5. CAPTION=“歌曲名称:”
LABLE6. CAPTION=“演唱者”
LABLE7. CAPTION=“专集名称:”
LABLE8. CAPTION=“偏移”
OPENDIALOG类组件执行打开“.TXT”或“LRC”文件对话框;
SAVEDIALOG类组件执行保存“.TXT”或“LRC”文件对话框;
STRINGGRID类组件即一个表格;
4 逻辑结构设计
逻辑结构设计的任务是将各个功能模块的逻辑流程图表示清楚,从而确定整个系统的逻辑结构关系,各个模块是如何相互联系作用的[17]。
4.1 系统流程图
首先打开一个MP3文件,再打开对应的歌词文件(TXT或LRC格式)。单击“播放”按钮,开始播放歌曲,播放歌曲时,在相应的时间标签上单击,即可将当前时间添加至时间标签。当歌曲播放结束时,此时单击时间标签,不会将当前时间添加至时间标签。
4.2 歌曲播放模块流程图
本模块的主要功能是得到文本对话框打开的MP3文件,如果该歌曲存在对歌曲进行播放,暂停,停止的操作,在播放歌曲的同时将与歌曲文件名相同的歌词文件读取,将歌词内容存入已定义的整型数组。如果不存在,则程序执行异常,跳出对话框“文件不存在”或“MCI设备正在使用”。如图3所示。
图3 歌曲播放模块流程图
Fig 3 Diagram of Song playing module
4.2 歌词显示模块流程图
图4 歌词显示模块流程图
Fig 4 Diagram of Lyrics displaying module
4.3 歌词编辑模块流程图
图5 歌词编辑模块流程图
5 详细设计
5.1 开发工具简介
Delphi[1]类可以粗略地分成两部分:一部分是组件类,这些组件类通常以某种方式出现在组件面板上,当用户从组件面板上点取一个类的图标后,在程序中就自动生成了该类的对象(非可视组件除外);另一部分是功能类,这此功能类的对象通常出现在程序代码中,起着不可代替的作用,但是这些功能类在组件面板上是找不到的。在Delphi中,每一个类的祖先都是Tobject类[3],整个类的层次结构就像一棵倒挂的树,在最顶层的树根即为Tobject类。这样,按照面向对象编程的基本思想,就使得用户可用Tobject类这个类型代替任何其它类的数据类型[12]。实际上在Delphi的类库中[13],Tobject类派生出了为数相当众多的子类,它们形成了一个庞大的体系,通常情况下,如果不自行开发组件,就不必了解整个类的体系结构,只用到类层次树的叶结点就足够了。组件在Delphi程序的开发中是最显眼的角色[14]。大家知道,在编写程序时一般都开始于在组件面板上选择组件并定义组件间的相互作用。但也有一些组件不在组件面板上,例如[15]Tform和Tapplication(典型的非可视组件)。组件是Tcomponents派生出来的子类[16],可以流的形式存放在DFM文件中,具有事件和Publish属性[20]。窗口组件类是窗口化的可视化组件类,在Delphi的类库中占有最大的份额[21]。在实际编程中,窗口组件类的对象都有句柄,可以接受输入焦点和包含其它组件。图形组件与窗口组件并列,是另一大类组件。图形组件不是基于窗口的,因而不能有窗口句柄,不能接受输入焦点和包含其它组件。图形组件的基类是TgraphicControl[21],在实际编程中,它们必须寄生于它们的宿主——窗口组件类的对象,由它们的拥有者负责其显示,而且它们还能触发一些和鼠标活动相关的事件。图形控件最典型的例子是Tlabel和TspeedButton[22]。由此可以看出图形组件的功能很弱,有读者会问图形组件的用处何在呢?其实使用图形组件的最大好处在于节省资源,正是因为它们的功能较弱,所以使用的系统资源就要少。在一个应用程序中,如果能在不影响其功能的前提下合理大量地使用图形组件,将会大减少程序对系统资源的消耗[23]。非可视组件是与可视组件相并列的另一类组件,非可视组件在程序运行中是不可见的。转贴于 酷文网-论文下载中心 http://www.coolwen.net