【文档说明】Delphi程序设计第10章.ppt,共(72)页,462.500 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-2259.html
以下为本文档部分文字说明:
第10章Delphi程序设计综合实例使用Delphi系统进行应用程序开发是学习本书的最终目的,通过前面章节的学习,读者具备了使用Delphi系统进行综合性应用程序开发的理论基础。本章将通过开发一个音乐点播系统,介绍使用Delphi系统
进行应用程序设计的详细步骤与方法。10.1程序设计流程通常情况下,程序设计需要经过需求分析、模块设计、代码编辑和维护4个阶段。1.需求分析在需求分析阶段,开发人员需要与客户进行充分的交流与沟通,了解客户
的实际需要,从而确定系统需要实现的目标。因此,在这个阶段,良好的沟通能力将起到决定性的作用。通常情况下,开发人员先快速开发出一个简单模型,然后与客户一起对该模型进行评估,根据评估意见进行修改,最终开发出真正符合需求的应用程序。2.模块设计在模块设计阶段,开发人员根据需
求分析的结果,设计实现结果的功能模块。模块设计阶段又分为总体设计和详细设计两个阶段。在详细设计阶段,需要确定实现各个模块功能的算法、数据结构和实现细节;在总体设计阶段,要规定模块与模块之间的通信方式,通
过模块之间的相互合作来最终实现程序的功能。3.代码编辑代码编辑阶段的工作是编写代码来实现模块功能。当编写完所有模块的代码后,还要将所有模块集成起来进行测试。4.运行维护阶段程序制作好,测试无误后即可以交付用户使用。至此进入程序的维护阶段。在该阶段要收集用户的反馈意
见,对程序进行维护和改进。10.2音乐点播系统介绍在日常生活中,人们经常使用电脑来播放歌曲。为了更好地管理歌曲和播放歌曲,本章将使用Delphi系统开发一个音乐点播系统,实现歌曲的管理与播放。本章制作的音乐点播系统是一个基于数据库的多媒体播放系统,通过数据
库来选择歌曲,并能播放选中的歌曲。10.3程序设计流程需求分析是程序开发的第一步,是其他所有工作的前提与基础,在整个开发流程中占有很重要的地位。只有充分理解和明确系统的需求,才能开发出符合客户需求的应用系统。音乐点播系统中有两种用户:系
统管理员和普通用户。系统管理员对系统中的所有用户和歌曲进行管理。普通用户可以在系统中选择和播放歌曲,并能将自己喜爱的歌曲保存到歌曲列表中。系统管理员通过播放次数来对歌曲进行排行。通过需求分析,可以得出音乐点播系统要实现的功能如下:1.用户管理音乐
点播系统的用户分系统管理员和普通用户两种。先设一个系统管理员,由其对所有用户进行管理,然后普通用户通过注册,将个人信息添加到数据库中,由系统管理员统一进行管理。2.歌曲管理系统管理员可以对系统中的所有音乐文件进行管理,如添加、移动和删除,并设置歌曲
的相关信息,如歌手、歌曲名称、歌曲分类和存放位置等。3.播放歌曲普通用户通过播放列表查看数据库中的歌曲,从中选择感兴趣的歌曲进行播放。4.歌曲收藏普通用户可以收藏自己喜爱的歌曲,而且能随时删除。5.其他需求针对不同的用户(管理员与普通用户)设置不同的操作界面。系统在Windows系统平台上运
行,要求界面美观。由于篇幅所限,这里设定的系统功能比较简单,读者可以根据需要增加或修改系统功能。10.4模块设计根据需求分析的结果,可以将音乐点播系统分为若干个功能模块,然后通过程序用例图来表示各个模块之间的关系。在用例图中,系统的每个功能模块称为一个实例,系统中
的用户称为角色。音乐点播系统中有系统管理员与普通用户两种角色。系统的实例包括用户信息管理、歌曲信息管理、歌曲浏览播放和个人曲库管理等。由此得出音乐点播系统用例图如下图所示。通过用例图可以大致了解系统的功能。这些功能只是大致划分,可以将系统功能模块进一步划分为
更小的功能子模块,如下图所示。音乐点播系统用例图消息对话框10.5数据库设计音乐点播系统是一个基于数据库的多媒体播放系统,在程序设计前要先建立数据库和数据表。在建立数据库和数据表前,应先分析数据信息,从而得出数据表的数据结构,然后在数据库中建立数据表。10.5.1实体—关系图通常情况下采用
实体—关系(E-R)图来描述数据信息。在E-R图中,每个对象称为一个实体。音乐点播系统中的实体包括系统管理员、普通用户和歌曲。其中,管理员可以普通用户和歌曲,普通用户可以选择、收藏和播放歌曲。音乐点播系统E-R图如下图所示。在上图所示的E-R图中,一个管理员可以管理多个用户和多首歌曲,因
而管理员与普通用户,管理员与歌曲之间都是一对多(1:n)的关系。一个用户可以选择多首歌曲,一首歌曲也可以被多个用户选择,因而它们之间是多对多的关系(m:n)。10.5.2数据表结构设计音乐点播系统中需要建立的数据表有以下几个:1.用户信息表用户信息(UsrInf)
表用于存放用户的基本信息,如用户名、类型和密码,其数据结构见下表。字段名称字段类型字段长度字段说明UsrNameAnsiString64主键,表示名称UsrTypeShortint系统定义0表示管理员
;1表示普通用户UsrPassWdAnsiString16密码,不可为空用户信息表的结构2.歌曲信息表(SongInf)歌曲信息(SongInf)表用于存放歌曲信息,如歌曲名称、歌手名称、存放位置和歌曲类别等,其数
据结构见下表。字段名称字段类型字段长度字段说明SongAddrAnsiString256主键,表示歌曲存放位置SongNameAnsiString128歌曲名称,不可为空SongTypeShortint系统定义歌曲类别
,缺省值为0•0:未确定•1:流行歌曲•2:古典歌曲•3:乡村音乐•4:校园歌曲•5:国外音乐SingerAnsiString64歌手名称,缺省值为“佚名”歌曲信息表的结构3.用户歌曲表用户歌曲(UsrSong)表用于存放用户收藏的
信息,包括用户名称、歌曲,包括名称、歌曲名称、歌曲位置和点播次数等,其数据结构见下表。歌曲表的结构字段名称字段类型字段长度字段说明UsrNameAnsiString64主键,表示名称SongAddrAnsiString256主键,表示歌曲
位置SongNameAnsiString128歌曲名称,不可为空SongCountLongint系统定义歌曲点播次数,默认值为010.5.3建立数据库与数据表设计好各个数据表的数据格式后,在数据库管理系统中建立数据库和数
据表,然后连接数据库与应用程序。具体的方法请参照第7章中相关内容,这里就不在赘述。10.6程序功能的实现音乐点播系统分为用户登录模块、管理员模块、歌曲管理模块和点播模块。下面将分模块介绍系统的实现过程。10.6.1用户登录模块在登录模块中输入用户名和密码进行登录,当密码出错时,系统提
示密码错误并要求重新输入。如果用户名不存在,则提示进行注册。1.界面设计在实现程序功能之前,应先设计程序界面,主要步骤如下:(1)执行File→New→Form命令,在当前项目中添加一个Form窗体,将其Name属性设置为Log
inForm;将Caption属性设置为“用户登录”。(2)在Form窗体中添加3个Labe组件,3个Edit组件和3个Button组件,设计界面如下图所示。将“确认密码”Label组件和右边的Edit组件以
及“确定”按钮的Visible属性值均设置为False;将“用户密码”、“确认密码”右边的Edit组件的PassWd属性均设置为“*”。(3)用户在登录时需要访问数据库,所以需要建立数据连接。执行File→New
→DataModule命令,在项目中添加一个DataModule窗体,用于存放数据组件,将该窗体的Name属性设置为DM。(4)在DM窗体中添加一个ADOConnection组件,将其ConnectionString属性值设置为UDL文件,将Login
Prompt属性设置为False;将Connected属性设置为True。再在DM窗体中添加一个ADOQuery组件和一个DataSource组件。将ADOQuery组件的Name属性值设置为query,Connection属性设置为ADOConnection组件;将DataSou
rce组件的DataSet属性设置为query。(5)按照步骤(1)的方法,在当前项目中添加两个Form窗体,分别命名为ManageForm和UsrForm,分别作为管理员和用户操作界面,窗体的具体设置将在下
文进行介绍。2.代码实现设计好“用户登录”界面后,接下来编写代码实现界面的功能。1)登录当用户单击“登录”按钮时,程序先判断用户名和密码是否为空,如果为空则提示输入用户名和密码,否则将用户输入的信息提交给数据
库,程序根据数据库的返回值给出以下3种处理结果:•不存在:提示错误信息,建议注册。•密码不正确:提示密码错误,要求重新输入密码。•登录成功:根据用户类型打开相应的界面,并关闭登录窗口。由于登录时需要查询数据库UsrInf表中的数据,所以需要利用DM窗体中的组件进行程序
设计。同时,要根据用户的类型分别打开管理员窗体(ManageForm)和用户窗体(UsrForm),因此,需要在登录模块中声明DM窗体,ManageForm窗体和UsrForm窗体。参考代码如下:procedur
eTLoginForm.Button1Click(Sender:TObject);varsqlstr:String;beginifEdit1.Text=''thenbeginMessageDlg('名不能为空。',mtWarning,[mbOK],0
);Edit1.SetFocusendelseifEdit2.Text=''thenbeginMessageDlg('密码不能为空。',mtWarning,[mbOK],0);Edit2.SetFocusendelsebegin
sqlstr:='select*fromUsrInfwhereUsrName=:inameandUsrPassWd=:ipasswd';DM.query.Close;DM.query.SQL.Clear;DM.query.SQL.
Add(sqlstr);DM.query.Parameters.ParamByName('iname').Value:=Edit1.Text;DM.query.Parameters.ParamByName('ipasswd').
Value:=Edit2.Text;DM.query.Open;ifDM.query.RecordCount=0thenbeginMessageDlg('用户名不存在,请重新登录。',mtError,[mbOK],0);Edit1.Text:='';Edit2.Text:='';E
dit1.SetFocusendelsebeginifDM.query.FieldByName('UsrType').Value=0thenbeginApplication.CreateForm(TManageForm,ManageForm);ManageForm.show;LoginFor
m.FreeendelsebeginApplication.CreateForm(TUsrForm,UsrForm);UsrForm.Show;LoginForm.Free;end;end;end;end;2)注册当单击“注册”按钮时,“确定”按钮、“确认密码”标签及其右边的Edit
组件的Visible属性均为True。设置好用户名和密码后,单击“确定”按钮,系统判断第一次输入密码与确认密码是否一致,如果一致,则将数据提交到数据库,否则提示密码错误。如果系统在数据库中没有发现有重复的用户名,
则提示注册成功,进入用户界面。否则提示重新输入用户名。实现注册功能的参考代码如下:procedureTLoginForm.Button3Click(Sender:TObject);varsqlstr:string;begin
ifEdit2.Text<>Edit3.TextthenbeginMessageDlg('两次输入的密码不同,请重新输入密码.',mtWarning,[mbOK],0);Edit2.Clear;;Edit2.SetFocus;Edit3.Cle
ar;endelsebeginsqlstr:='select*fromUsrInfwhereUsrName=:iname';DM.query.Close;DM.query.SQL.Clear;DM.query.SQL
.Add(sqlstr);DM.query.Parameters.ParamByName('iname').Value:=Edit1.Text;DM.query.Open;ifDM.query.RecordCount>0thenbeginMessageDl
g('用户名已经存在,请更换名称。',mtError,[mbOK],0);Edit1.Clear;Edit2.Clear;Edit3.Clear;Edit1.SetFocusendelsebeginsqlstr:='insertintoUsrInfValues(:iName
,:iType,:iPasswd)';DM.query.Close;DM.query.SQL.Clear;DM.query.SQL.Add(sqlstr);DM.query.Parameters.ParamByName('iname').Value:=Edit1.Text;DM.query.
Parameters.ParamByName('iType').Value:=0;DM.query.Parameters.ParamByName('iPasswd').Value:=Edit3.Text;Dm.que
ry.ExecSQL;MessageDlg('添加完成',mtInformation,[mbOK],0);Application.CreateForm(TUsrForm,UsrForm);UsrForm.Show;LoginForm.Free;end;end;end;10.6
.2管理员模块管理员模块需要实现用户信息管理和歌曲信息管理的功能。由于用户管理的功能比较简单,所有可以将这两个功能放置在一个界面中。1.界面设置设计管理员界面的操作步骤如下:(1)在前面创建的Manag
eForm窗体中添加两个GroupBox组件,将窗体分为“歌曲管理”与“用户管理”两部分。(2)在ManageForm窗体中添加一个DBGrid组件,3个Edit组件,3个ComboBox组件,7个Label组件,5个Button组件,一个OpenDialo
g组件和一个Timer组件。将OpenDialog组件Options属性集中的ofAllowMultiSelect属性设置为True。将Timer组件的Interval属性设置为1000。创建的“管理员”界面如下图所示。(3)在DM窗体中添加一个
ADODataSet组件,和一个DataSource组件(DataSource2)。将ADODataSet组件的Name属性设置为DataSet1,将Connection属性设置为ADOConnection组件,将CommandTe
xt属性设置为“select*fromSongInforderbySinger”,将Active属性设置为True。将DataSource2组件的DataSet属性设置为DataSet1,将DBGrid组件的DataSour
ce属性设置为DataSource2组件。2.功能实现管理员模块需要实现歌曲管理与管理用户的功能。具体操作步骤如下:(1)在ManageForm窗体的OnCreate事件中添加如下代码,对ComboBox2组件进行初始化。procedureTMana
geForm.FormCreate(Sender:TObject);beginComboBox2.Items.Add('未确定');ComboBox2.Items.Add('流行歌曲');ComboBox2.Items.Add('古典乐曲');Comb
oBox2.Items.Add('乡村音乐');ComboBox2.Items.Add('校园歌曲');ComboBox2.Items.Add('国外音乐');ComboBox2.ItemIndex:=0;end;(2)单击“添加歌曲”按钮,可以
在SongInf表中添加歌曲信息,在添加前,应先查看要添加的歌曲是否与SonInf表中的歌曲重复,如果要添加的歌曲已经存在则不能添加,否则将歌曲添加到数据表中,并刷新DBGrid组件的数据,实现这些功能的代码如下:procedureTManageForm.Button1C
lick(Sender:TObject);vari:integer;sqlstr:string;beginOpenDialog1.Execute;fori:=1toOpenDialog1.Files.Countdobeginsqlstr:='select*fromSongInfwhe
reSongAddr=:isongaddr';DM.query.Close;DM.query.SQL.Clear;DM.query.SQL.Add(sqlstr);DM.query.Parameters.ParamByName('isongaddr').Valu
e:=OpenDialog1.Files[i-1];DM.query.Open;ifDM.query.RecordCount>0thenMessageDlg('该曲目已经存在,不能添加。',mtError,[mbOK],0)elsebeginsqlstr:='InsertintoSongInf
(SongAddr)Values(:isongaddr)';DM.query.Close;DM.query.SQL.Clear;DM.query.SQL.Add(sqlstr);DM.query.Parameters.ParamByName('iso
ngaddr').Value:=OpenDialog1.Files[i-1];DM.query.ExecSQL;DM.DataSet1.Close;DM.DataSet1.Open;end;end;end;3)为DBGrid组件的OnDBClick事件添加如下代码,在DB
Grid组件中显示选中歌曲的信息。procedureTManageForm.DBGrid1DblClick(Sender:TObject);beginEdit1.Text:=Trim(DBGrid1.Data
Source.DataSet.FieldByName('SongName').AsString);ComboBox1.Text:=Trim(DBGrid1.DataSource.DataSet.FieldByName('Singer').AsString);C
omboBox2.ItemIndex:=DBGrid1.DataSource.DataSet.FieldByName('SongType').AsInteger;Edit2.Text:=IntToStr(DBGrid1.Da
taSource.DataSet.FieldByName('SongCount').AsInteger);Edit3.Text:=DBGrid1.DataSource.DataSet.FieldByName('SongAddr').AsStri
ng;end;(4)当激活“歌手名称”ComboBox组件时,程序将SongInf表中所有的歌手名字添加到该组件中供选择,也可以直接在该组件中输入歌手名称。实现这些功能的代码如下:procedureTManageForm.ComboBo
x1Enter(Sender:TObject);varsqlstr:string;i:integer;beginsqlstr:='selectdistinctsingerfromSongInf';DM.query.Close;DM.query.SQL.Clear;DM.query.SQL.Add
(sqlstr);DM.query.Open;DM.query.First;fori:=0toDM.query.RecordCount–1dobeginComboBox1.Items.Add(DM.query.Fiel
dValues['Singer']);DM.query.Next;end;end;(5)管理员修改好歌曲信息后,单击“修改信息”按钮,将修改后数据提交到数据库中,并刷新DBGrid组件中的数据。实现这些功能的代码如下:procedureTManageForm.
Button2Click(Sender:TObject);varsqlstr:string;beginsqlstr:='UpdateSongInfsetSongName=:iname,SongType=:itype,Singer=:isingerwhereSongAd
dr=:iaddr';DM.query.Close;DM.query.SQL.Clear;DM.query.SQL.Add(sqlstr);DM.query.Parameters.ParamByName('iname').Value:=Trim(Edit1.Te
xt);DM.query.Parameters.ParamByName('isinger').Value:=Trim(ComboBox1.Text);DM.query.Parameters.ParamByName('itype').Value:=ComboBox2
.ItemIndex;DM.query.Parameters.ParamByName('iaddr').Value:=Trim(Edit3.Text);DM.query.ExecSQL;DM.DataSet1.Close;DM.DataSet1.Op
en;end;(6)单击“删除歌曲”按钮,可以删除选中的歌曲信息并刷新DBGrid组件中的数据,实现该功能的代码如下:procedureTManageForm.Button3Click(Sender:TObject);varsqlstr:string;begin
sqlstr:='deletefromSongInfwhereSongAddr=:iaddr';DM.query.Close;DM.query.SQL.Clear;DM.query.SQL.Add(sqlstr);DM.query.Parameters.ParamBy
Name('iaddr').Value:=Trim(Edit3.Text);DM.query.ExecSQL;DM.DataSet1.Close;DM.DataSet1.Open;end;(7)在ComboBox3组件的OnEnter事
件中添加如下代码,当管理员选中该组件时,系统将UsrInf表中所有用户名添加到ComboBox3组件中供管理员选择,也可以直接在ComboBox组件中输入用户名。procedureTManageForm.ComboBox3Ente
r(Sender:TObject);varsqlstr:string;i:integer;beginsqlstr:='selectUsrNamefromUsrInforderbyUsrName';DM.query.Close;DM.quer
y.SQL.Clear;DM.query.SQL.Add(sqlstr);DM.query.Open;DM.query.First;ComboBox3.Clear;fori:=0toDM.query.RecordCount-1dobeginComboBox3.Items.Add(DM.que
ry.FieldValues['UsrName']);DM.query.Next;end;end;(8)单击“删除用户”按钮,可以删除在ComboBox3组件中选中用户,实现代码如下:procedureTMan
ageForm.Button4Click(Sender:TObject);varsqlstr:string;beginsqlstr:='deletefromUsrInfwhereUsrName=:iname
';DM.query.Close;DM.query.SQL.Clear;DM.query.SQL.Add(sqlstr);DM.query.Parameters.ParamByName('iname').Value:=Trim(ComboBox3.Te
xt);DM.query.ExecSQL;end;(9)单击“修改密码”按钮,可以将ComboBox3组件中选中用户的密码密设置为123456,实现代码如下:procedureTManageForm.Button5Cli
ck(Sender:TObject);varsqlstr:string;beginsqlstr:='UpdateUsrInfsetUsrPasswd=:ipasswdwhereUsrName=:iname';DM.query.Close;DM.q
uery.SQL.Clear;DM.query.SQL.Add(sqlstr);DM.query.Parameters.ParamByName('ipasswd').Value:='123456';DM.query.Parameters.ParamByNam
e('iname').Value:=Trim(ComboBox3.Text);DM.query.ExecSQL;end;(10)为Timer组件的OnTimer事件添加如下代码,在Form窗体中显示当前时间:procedureTManageFor
m.Timer1Timer(Sender:TObject);beginLabel7.Caption:=TimeToStr(Time);end;(11)在ManageForm窗体的OnClose事件中添加如下代码,关闭系
统。procedureTManageForm.FormClose(Sender:TObject;varAction:TCloseAction);beginApplication.Terminate;end;10.6.3点播模块点播模块需要实现的功能为选择歌曲、播放歌曲
和收藏歌曲。在实现这些功能前,需要先进行界面设计。1.界面设计操作步骤如下:(1)在UsrForm窗体中添加3个GroupBox组件,将窗体划分为“歌曲检索”、“收藏列表”和“歌曲播放”3个区域。(2)在“歌曲检索”区域中添加一个TreeV
iew组件,两个Label组件,两个Edit组件和3个Button组件。(3)在“收藏列表”区域添加一个ListBox组件。(4)在“歌曲播放”区域添加一个MediaPlayer组件,一个Timer组件,一个ProgressBar组件和5个Speed
Button组件。将MediaPlayer组件的Visible属性设置为False;将ProgressBar组件的Smooth属性设置为True;设置SpeedButton组件的Glyph属性,为该组件添加图标。设计好的用户界面如图下所示。2.功能实现完成程序界面设计后,即可以编写代码实现程序功能
。下面分别介绍如何实现各个模块的功能。用户界面(1)单击“歌曲检索”区域中的“全部”按钮时,清空TreeView组件,并遍历数据库中的歌曲,将所有歌曲按照歌手名称进行分类,然后添加到TreeView组件中
供用户选择。实现这些功能的参考代码如下:procedureTUsrForm.Button2Click(Sender:TObject);varsqlstr,tmpsinger,getsingername,getsongna
me,getsongaddr:string;root,curnode:TTreeNode;i:integer;begintmpsinger:='';sqlstr:='select*fromSongInforderbySinger';DM.query.Clos
e;DM.query.SQL.Clear;DM.query.SQL.Add(sqlstr);DM.query.Open;DM.query.First;TreeView1.Items.Clear;TreeView1.Items.AddFirst(nil,'所有歌曲');
root:=TreeView1.Items[0];fori:=0toDM.query.RecordCount-1dobegingetsingername:=DM.query.FieldValues['Singer'];getsongnam
e:=DM.query.FieldValues['SongName'];getsongaddr:=DM.query.FieldValues['SongAddr'];iftmpsinger<>getsingernamethenbegincurnode:=
TreeView1.Items.AddChild(root,getsingername);tmpsinger:=getsingernameendelsebeginTreeView1.Items.AddChild(curnode,getsongnam
e);DM.query.Next;end;end;end;(2)单击“歌曲检索”区域中的“检索”按钮时,程序开始检索数据表,查找符合歌曲名称或歌手名称的歌曲,然后清空TreeView组件中的信息,将查询结果添加到TreeView组件中。实现这些功能的参考代码如下:procedureT
UsrForm.Button1Click(Sender:TObject);varsqlstr,tmpsinger,getsingername,getsongname,getsongaddr:string;root,curnode
:TTreeNode;i:integer;begintmpsinger:='';sqlstr:='select*fromSongInfwheresinger=:isingerorSongName=:isongnameorde
rbySinger';DM.query.Close;DM.query.SQL.Clear;DM.query.SQL.Add(sqlstr);DM.query.Parameters.ParamByName('isinger').Value:=Trim(Edit1.Tex
t);DM.query.Parameters.ParamByName('isongname').Value:=Trim(Edit2.Text);DM.query.Open;ifDM.query.RecordC
ount=0thenbeginMessageDlg('数据信息不存在,请重新查找。',mtError,[mbOK],0);Edit1.Clear;Edit2.Clear;Edit1.SetFocusendelsebeg
inDM.query.First;TreeView1.Items.Clear;TreeView1.Items.AddFirst(nil,'所有歌曲');root:=TreeView1.Items[0];fori:=0toDM.query.RecordCount-1dobegingetsing
ername:=DM.query.FieldValues['Singer'];getsongname:=DM.query.FieldValues['SongName'];getsongaddr:=DM.query.FieldValues['SongAddr'];iftmps
inger<>getsingernamethenbegincurnode:=TreeView1.Items.AddChild(root,getsingername);tmpsinger:=getsingernameendelsebe
ginTreeView1.Items.AddChild(curnode,getsongname);DM.query.Next;end;end;end;end;(3)单击“歌曲检索”区域中的“用户收藏”按钮,可以将Tre
eView组件中选中的歌曲添加到列表中,并修改SongInf表中的歌曲数目,同时将收藏歌曲的信息添加到UsrSong表中。如果列表中已存在该歌曲,则提示“该歌曲已经收藏”。实现这些功能的参考代码如下:procedureTUsrForm.Button3Click(
Sender:TObject);varinflag:boolean;tmpNode:TTreeNode;i:integer;sqlstr:string;beginifTreeView1.Selected<>nilt
henbegininflag:=false;ifTreeView1.Selected.Level<>2thenMessageDlg('请选中歌曲名称。',mtError,[mbOK],0)elsebegi
nfori:=0toListBox1.Count-1dobeginifListBox1.Items[i]=TreeView1.Selected.Textthenbegininflag:=true;break;end;end;ifinflag=trueth
enMessageDlg('该歌曲已经收藏。',mtError,[mbOK],0)elsebeginsqlstr:='insertintoUsrSongvalues(:iname,:iaddr,:isong)';DM.query
.Close;DM.query.SQL.Clear;DM.query.SQL.Add(sqlstr);DM.query.Parameters.ParamByName('iname').Value:=localusrname;TmpNode:=TreeView1.Selected.get
FirstChild;DM.query.Parameters.ParamByName('iaddr').Value:=TmpNode.Text;DM.query.Parameters.ParamByNa
me('isong').Value:=TreeView1.Selected.Text;DM.query.ExecSQL;sqlstr:='updateSongInfsetSongCount=SongCount+1whereSon
gAddr=:iaddr';DM.query.Close;DM.query.SQL.Clear;DM.query.SQL.Add(sqlstr);DM.query.Parameters.ParamByName('iadd
r').Value:=TmpNode.Text;DM.query.ExecSQL;ListBox1.Items.Add(TreeView1.Selected.Text);end;end;end;end;(
4)为UsrForm窗体的OnShow事件添加如下代码,完成初始化工作,主要包括从“用户登录”界面获得用户名,从UsrSong表中获取收藏歌曲的信息。参考代码如下:procedureTUsrForm.FormShow(Sender:T
Object);varsqlstr,songname,songaddr:string;i:integer;beginlocalusrname:=UsrForm.Caption;sqlstr:='selec
t*fromUsrSongwhereUsrName=:inameorderbySongName';DM.query.Close;DM.query.SQL.Clear;DM.query.SQL.Add(sqlstr);DM.query.Paramete
rs.ParamByName('iname').Value:=localusrname;DM.query.Open;DM.query.First;ListBox1.Clear;fori:=0toDM.query.RecordCount-1d
obeginListBox1.Items.Add(DM.query.FieldValues['SongName']);ListBox1.Items.Add(DM.query.FieldValues['SongAdd
r']);DM.query.Next;end;ListBox1.ItemIndex:=0;end;(5)单击“播放”图标可以按顺序播放ListBox组件中选中的歌曲。ListBox组件的ItemIndex属性值为0,2,4,…,2n
时,表示歌曲名称,当ItemIndex属性的值为1,3,5,…,2n+1时,表示对应歌曲的存储位置。这样不需要根据歌曲名称就能查找歌曲在SongInf表中的位置。在播放过程中,进度条会显示歌曲播放进的进度。参考代码如
下:procedureTUsrForm.SpeedButton1Click(Sender:TObject);beginifListBox1.ItemIndexmod2<>0thenMessageDlg('请选中歌曲名称。',mtWarning,[mbOK],0)elsebegin
MediaPlayer1.Close;MediaPlayer1.FileName:=ListBox1.Items[ListBox1.itemIndex+1];ProgressBar1.Max:=MediaPlayer1.Length;MediaPlayer1.Play;end;en
d;(6)单击“暂停”图标,则暂停当前播放的曲目,再次单击“暂停”按钮,可以继续播放歌曲。参考代码如下:procedureTUsrForm.SpeedButton2Click(Sender:TObject);beginMediaPlayer1.
Pause;end;(7)单击“上一首”按钮,开始播放上一首歌曲,并自动选中ListBox组件中的上一首歌曲。如果已经是第一首歌曲了,则提示“已经是第一首歌曲了”。参考代码如下:procedureTUsrForm.SpeedButton4Click(Sen
der:TObject);beginifListBox1.ItemIndexmod2<>0thenListBox1.ItemIndex:=ListBox1.ItemIndex-1;ifListBox1.ItemIndex=0thenMess
ageDlg('已经是第一首歌曲了。',mtWarning,[mbOK],0)elsebeginListBox1.ItemIndex:=ListBox1.ItemIndex-2;MediaPlayer1.Close;MediaPlayer1.FileName:=ListBox1.Items
[ListBox1.ItemIndex+1];MediaPlayer1.Open;MediaPlayer1.Play;ProgressBar1.Max:=MediaPlayer1.Length;end;end;(8)单击“下一首”按钮,开始播放下一首歌曲,并自动选中Li
stBox组件中的下一首歌曲。如果已经最后一首曲目了,则提示“已经是最后一首歌曲了”。参考代码如下:procedureTUsrForm.SpeedButton5Click(Sender:TObject);beginifListBox1.ItemIndexmod2<>0
thenListBox1.ItemIndex:=ListBox1.ItemIndex-1;ifListBox1.ItemIndex=ListBox1.Count-2thenMessageDlg('已经是最后一首歌曲了。',mtWarning,[mbOK],0)elsebeginLi
stBox1.ItemIndex:=ListBox1.ItemIndex+2;MediaPlayer1.Close;MediaPlayer1.FileName:=ListBox1.Items[ListBox1.ItemIndex+
1];MediaPlayer1.Open;MediaPlayer1.Play;ProgressBar1.Max:=MediaPlayer1.Length;end;end;(9)单击“停止”按钮,可以停止播放歌曲。参考代码如下:p
rocedureTUsrForm.SpeedButton3Click(Sender:TObject);beginMediaPlayer1.Stop;end;(10)为了使进度条显示歌曲播放进度,在每次执行MediaPlayer组件的Pl
ay方法后都需添加下面语句:ProgressBar1.Max:=MediaPlayer1.Length;(11)在Timer组件的OnTimer事件中添加如下代码,使进度条随时间变化。procedureTUsrForm.Timer1Timer(Sen
der:TObject);beginprogressBar1.Position:=mediaplayer1.Position;end;第十章结束