BCB第九讲事件和事件处理函数

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

事件和事件处理函数

在上一讲中我们主要学习了如何设计用户界面,了解了向窗体中添加元件、设置元件属性和调整元件的布局的方法,到目前为止,音乐收藏小程序MP3Collect 的用户界面已经初具雏形了,但是界面上的元件还不能响应用户的输入,因此在本讲中,我们就来为元件添加事件响应函数,让程序真正活起来。

添加记录

MP3Collect 主要的用途是管理音乐文件,我们首先就来实现添加记录的功能。按照我们的设想,添加记录的功能是由用户按下“添加”按钮时启动的,那么怎样才知道用户按下了这个按钮呢?这就引出了今天要介绍的元件事件及其事件处理函数的问题。

讲座前面曾经强调过,CBuilder 开发的应用程序是事件驱动的,用户的操作、系统环境变化以及应用程序之间的相互作用都会触发一些事件,CBuilder 提供的元件可以对这些事件进行响应,每一种元件都有特定的事件集合,该集合与它所实现的功能有关。

选中“添加”命令按钮后,调出它在对象浏览器中的事件页

(图9-1),查看它的事件集合,我们可以发现一个简单的命令按

钮能够响应十多个事件,每种事件的名称都具有“OnXXXX ”的

格式,其中前缀“On ”表示这是事件的名称,而“XXXX ”则代

表了事件的性质。多数事件的名称都很好理解,如果想进一步了

解各个事件的详细含义,可以按F1键查看联机帮助,例如通过联

机帮助我们可以了解到:当用户按下命令按钮时,就会触发

OnClick 事件,因此我们需要响应OnClick 事件,从而实现添加记

录的功能。

所谓响应事件,是指为元件的某个事件指定一个且只能指定

一个处理函数,当该事件发生时,程序会自动执行该函数。

我们在对象浏览器中选中“添加”按钮对象的OnClick 事件,

并在事件名称右侧的编辑框中输入事件处理函数的名称

“BtnAddSongClick ”(可根据需要自行修改),然后按回车键,

CBuilder 集成开发环境就会在TMainForm 文件中自动添加一个空的事件处理函数:

void __fastcall TMainForm::BtnAddSongClick(TObject *Sender)

除了上述方法之外,还有好几种可以更方便地添加事件处理函数的方法。一种方法是双击事件名称右侧的空白输入框,便能自动添加一个事件处理函数,自动添加的函数的名称是由元件名称和事件名称组合而来的。另一种方法是直接双击放在窗体上的元件对象本身,CBuilder 就会自动为该元件添加缺省事件的处理函数,CBuilder 的每一种元件都有其缺省的事件。

下面我们来给TMainForm::BtnAddSongClick 添加程序代码,完成添加记录的功能。

每条MP3音乐记录由三个部分组成:“文件名称”、“歌曲名称”和“歌手名称”,其中“文件名称”是MP3歌曲文件所在的路径全名,它是每条记录必须有的内容,而“歌曲名称”和“歌手名称”允许为空字符串,即没有内容。上述三部分信息需要用户在三个编辑框中输入,因此在进行添加记录操作时,程序需要首先读取三个编辑框的内容,并检查其中的“文件名称”是否为空,如果为空,则提醒用户该项目不能为空,并中断添加记录的操作,如果不为空,则可以添加该记录。下面就是这部分代码的内容:

void __fastcall TMainForm::BtnAddSongClick(TObject *Sender)

图9-1:事件页

{

if(edtFileName->Text.IsEmpty())//判断文件名编辑框中是否为空

{

Application->MessageBox("文件名称不能为空,请重新输入文件名称","MP3Collect",MB_OK);

edtFileName->SetFocus();//让文件名编辑框获得键盘输入焦点

return;

}

TListItem *newItem=ListView1->Items->Add();//列表项集合中添加一个列表项

newItem->Caption = edtFileName->Text;//列表项的标题属性为文件名称

newItem->SubItems->Add(edtSongName->Text);//添加列表项的第一个子项:歌曲名称

newItem->SubItems->Add(edtSingerName->Text);// 添加列表项的第二个子项:歌手名称

}

其中,编辑框的内容可以通过读取其Text属性来Array获得,该属性的类型为AnsiString类,我们可以直接

利用AnsiString类的IsEmpty方法来判断该字符串是

否为空,如果为空则需要显示错误提示信息,为此我

们利用应用程序对象Application的MessageBox方法

来显示如图9-2所示的消息框,从消息框返回后,我

图9-2:消息框

们利用编辑框的SetFocus方法把键盘输入焦点直接移

到edtFileName编辑框处,以便让用户重新输入文件

名。

如果文件名不为空,就把三个编辑框中的内容添加到MP3音乐记录集合中去。我们应该用什么方法来管理和操作记录集合呢?学过数据结构的朋友知道该集合应该为一种双向链表,便于进行定位、添加、删除等操作,但是对于不熟悉数据结构的朋友来说,这种方法实现起来有一定的困难。好在我们使用的是ListView控件,它有一个属性为Items,即列表项的集合,也就是说,ListView本身就具有较强的操作和管理列表项的功能,这正好符合我们对操作和管理记录集合的要求。因此,我们可以简单地将新记录添加到ListView控件中,直接利用该控件的Items属性来代替记录集合。

Items属性的类型为TListItems *,我们利用它的Add方法可以添加一个列表项。Add方法返回新添加的列表项对象newItem,这是一个TListItem类型的指针。每一个列表项要显示三个字符串,其中第一个字符串为newItem的Caption属性,其它两个字符串为newItem的SubItems属性。Caption 属性为AnsiString类型,可以直接通过赋值操作符“=”把另外一个AnsiString变量赋给该属性。SubItems属性为TStrings类型,TStrings是字符串集合类,它的基本方法有添加Add、删除Delete 等,代码中就是利用Add方法来实现添加字符串的功能。

显示当前选中的记录

当用户在ListView1中选中某条记录时,三个编辑框应该能够显示选中记录的内容,用户便可以在此基础上进行修改,下面我们就来实现这一功能。

通过查阅联机帮助,我们得知,当用户在列表框中选择某条记录时,会触发ListView控件的OnSelectItem事件,于是我们就在对象浏览器中选中ListView控件的OnSelectItem事件,并双击该事件右侧的空白输入栏,添加该事件的处理函数,并编写如下代码。

void __fastcall TMainForm::ListView1SelectItem(TObject *Sender, TListItem *Item, bool Selected)

{

//参数Item为新选中的列表项,判断它是否为有效的列表项对象

if(Item)

{

相关文档
最新文档