QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 17087|回复: 19
打印 上一主题 下一主题

BCB教程

[复制链接]
字体大小: 正常 放大
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 01:02 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<><b><FONT face=宋体 size=6> </FONT></b></P>% J7 a! J4 T2 E0 L+ c& l6 {6 e
< align=center>第一讲<FONT face="宋体, MS Song" size=6> C++ Builder</FONT><FONT face=宋体 size=6>简介</P></FONT><FONT face=宋体 size=3>3 G7 |' w- X% L* O8 y. e7 q! ~
< align=justify>“工欲善其事,必先利其器”,对于程序员来说,选择和掌握一门好的编程语言及其开发工具是至关重要的,然而这也正是困扰很多朋友的一个问题,随着心铃讲座的陆续刊出,越来越多的初学编程的读者朋友来信问到,“请问心铃,这么多种编程工具,到底哪一种更好呢?”对于这个问题,心铃一直都觉得很难回答清楚,只能说它们各有优缺点。其实,编程工具的选择要与具体的开发项目联系起来,如果项目是面向最终用户的</FONT><FONT face="宋体, MS Song" size=3>Windows</FONT><FONT face=宋体 size=3>应用程序,并且开发周期很短,那么心铃就要为大家推荐一种优秀的快速应用程序开发(</FONT><FONT face="宋体, MS Song" size=3>Rapid Application Development</FONT><FONT face=宋体 size=3>,简称</FONT><FONT face="宋体, MS Song" size=3>RAD</FONT><FONT face=宋体 size=3>)工具——</FONT><FONT face="宋体, MS Song" size=3>Borland C++ Builder</FONT><FONT face=宋体 size=3>,这也是本次讲座所要介绍的对象。</P>
% ?( m0 A, c4 ^; s  f<UL></FONT><B><FONT size=3>! Q8 m: Q  v: `
< align=justify>
" V8 O/ f; |) [1 ]<LI>C++ Builder</FONT><FONT face=宋体 size=3>的主要特点 1 h. ]6 y# {! a5 u
0 X* h: F& M0 C
</LI></UL></B></FONT><FONT size=3>4 O9 L+ M, p  ^6 h  ]
< align=justify>C++ Builder</FONT><FONT face=宋体 size=3>(以后简称</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>)是</FONT><FONT size=3>Borland</FONT><FONT face=宋体 size=3>公司在</FONT><FONT size=3>Delphi</FONT><FONT face=宋体 size=3>成功的基础上开发的可视化</FONT><FONT size=3>C++</FONT><FONT face=宋体 size=3>编程工具,什么?等等!也许有的朋友会问:</FONT><FONT size=3>Borland</FONT><FONT face=宋体 size=3>以前不是出了一个</FONT><FONT size=3>Borland C++</FONT><FONT face=宋体 size=3>吗,难道</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>不是从</FONT><FONT size=3>BC</FONT><FONT face=宋体 size=3>演变而来?不错,</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>确实也吸取了不少</FONT><FONT size=3>BC</FONT><FONT face=宋体 size=3>的好东西,但</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>可视化编程的关键——</FONT><FONT size=3>Visual Component Library</FONT><FONT face=宋体 size=3>(</FONT><FONT size=3>VCL</FONT><FONT face=宋体 size=3>,可视化元件库)却是从</FONT><FONT size=3>Delphi</FONT><FONT face=宋体 size=3>搬过来的,因此</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>象</FONT><FONT size=3>Delphi</FONT><FONT face=宋体 size=3>比象</FONT><FONT size=3>BC</FONT><FONT face=宋体 size=3>更多一些。</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>面世的时间虽然不长,但几乎是以最快速度成为最流行的</FONT><FONT size=3>C++</FONT><FONT face=宋体 size=3>编程工具之一,由于自身的优秀品质,它受到了越来越多的程序员的喜爱,目前最新版本已经出到了</FONT><FONT size=3>5.0</FONT><FONT face=宋体 size=3>。</P>
$ ~/ Z0 L! j( H" o% B< align=justify>与其它的可视化编程工具(如</FONT><FONT face="宋体, MS Song" size=3>VC</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>VB</FONT><FONT face=宋体 size=3>)相比,</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>的最大特点就在于其可视化程度更高,因此在开发面向用户的应用程序时更方便、更快捷。</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>集成了十分丰富的可视化元件库,其中的元件数量在百个以上,这些元件基本上覆盖了应用程序开发的各个方面,如:基本应用程序主窗口、菜单、工具栏、对话框、数据库、</FONT><FONT face="宋体, MS Song" size=3>Internet</FONT><FONT face=宋体 size=3>等等,利用这些元件,设计和开发</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>程序就象搭积木一样简单有趣。相比之下,</FONT><FONT face="宋体, MS Song" size=3>VC</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>VB</FONT><FONT face=宋体 size=3>中提供的控件在数量和种类上都是非常有限的,</FONT><FONT face="宋体, MS Song" size=3>VC</FONT><FONT face=宋体 size=3>中除了</FONT><FONT face="宋体, MS Song" size=3>Windows</FONT><FONT face=宋体 size=3>基本控件之外,只提供了少数几个自有控件。在</FONT><FONT face="宋体, MS Song" size=3>VB</FONT><FONT face=宋体 size=3>中使用控件虽然也很方便,但由于</FONT><FONT face="宋体, MS Song" size=3>Basic</FONT><FONT face=宋体 size=3>语言的局限性(不支持指针、不是真正的编译型语言),使其底层控制能力大受影响,</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>则充分体现了面向对象编程工具的优势,即不仅具有传统</FONT><FONT face="宋体, MS Song" size=3>C++</FONT><FONT face=宋体 size=3>开发工具高效和强大的底层控制能力,而且大大提高了应用程序开发的速度和可视化程度。</P>
; P7 O" g, l9 E- s3 T9 _< align=justify>在</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>中,元件的应用不仅提高了程序的开发速度,其高可重用性也使程序员受益菲浅。</FONT><FONT face="宋体, MS Song" size=3>VCL</FONT><FONT face=宋体 size=3>兼容</FONT><FONT face="宋体, MS Song" size=3>ActiveX</FONT><FONT face=宋体 size=3>和</FONT><FONT face="宋体, MS Song" size=3>DCOM</FONT><FONT face=宋体 size=3>技术,并且是完全基于对象的,因此在代码重用方面非常容易,例如,对于设计好的窗体或者控件,只要将其保存到对象仓库(</FONT><FONT face="宋体, MS Song" size=3>Repository</FONT><FONT face=宋体 size=3>)中,就可以在其它应用程序中使用。而在</FONT><FONT face="宋体, MS Song" size=3>VC</FONT><FONT face=宋体 size=3>中,虽然也可以将自定义类添加到</FONT><FONT face="宋体, MS Song" size=3>VC</FONT><FONT face=宋体 size=3>的组件库中,但只能添加代码,要添加对话框模板等资源却还不太容易。</P></FONT><FONT size=3>
2 S# k# A$ Z6 r# }  b3 n4 b! Q0 ^< align=justify>Borland</FONT><FONT face=宋体 size=3>公司充分认识到数据库在应用软件中的重要性,在</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>中提供了大量的用于数据库操作的元件,可以实现从数据库访问、数据浏览到制作报表的各种功能,可以很方便地根据需要定制自己的数据库应用程序,改变了以往数据库应用程序编制过程的复杂和繁琐,使开发人员可以把更多的精心放在程序总体功能设计上来。</P>
! z2 M8 h% \+ l+ p, y6 n< align=justify>同样,面向</FONT><FONT face="宋体, MS Song" size=3>Internet</FONT><FONT face=宋体 size=3>的应用也是应用软件的发展趋势之一,因此,</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>中提供了</FONT><FONT face="宋体, MS Song" size=3>WebBroker</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>WebBridge</FONT><FONT face=宋体 size=3>等</FONT><FONT face="宋体, MS Song" size=3>25</FONT><FONT face=宋体 size=3>个</FONT><FONT face="宋体, MS Song" size=3>Internet</FONT><FONT face=宋体 size=3>元件,可以帮助用户方便地开发</FONT><FONT face="宋体, MS Song" size=3>Internet</FONT><FONT face=宋体 size=3>应用程序,如</FONT><FONT face="宋体, MS Song" size=3>Web</FONT><FONT face=宋体 size=3>浏览器、</FONT><FONT face="宋体, MS Song" size=3>Email</FONT><FONT face=宋体 size=3>管理器、</FONT><FONT face="宋体, MS Song" size=3>FTP</FONT><FONT face=宋体 size=3>及</FONT><FONT face="宋体, MS Song" size=3>BBS</FONT><FONT face=宋体 size=3>程序等。</P></FONT><FONT size=3>  Z  d& [- G+ q0 D2 u9 [& N
< align=justify>CBuilder</FONT><FONT face=宋体 size=3>兼容许多流行的</FONT><FONT size=3>Windows</FONT><FONT face=宋体 size=3>编程技术。例如</FONT><FONT size=3>Delphi</FONT><FONT face=宋体 size=3>和</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>是同一个公司的产品,又同样采用了</FONT><FONT size=3>VCL</FONT><FONT face=宋体 size=3>技术,</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>可以很好地兼容</FONT><FONT size=3>Delphi</FONT><FONT face=宋体 size=3>,它不仅可以直接使用由</FONT><FONT size=3>Delphi</FONT><FONT face=宋体 size=3>产生的窗体和</FONT><FONT size=3>.OBJ</FONT><FONT face=宋体 size=3>文件,还可在项目中包含</FONT><FONT size=3>Delphi</FONT><FONT face=宋体 size=3>的</FONT><FONT size=3>.PAS</FONT><FONT face=宋体 size=3>源文件,大大扩展了</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>程序员可利用的资源。除此之外,</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>还兼容</FONT><FONT size=3>VC</FONT><FONT face=宋体 size=3>开发的</FONT><FONT size=3>MFC</FONT><FONT face=宋体 size=3>程序代码,因此具有一定</FONT><FONT size=3>VC</FONT><FONT face=宋体 size=3>基础的朋友也不用担心学习</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>会荒废以前的手艺了。</P></FONT><FONT size=3>
# Z/ }, v$ B; q4 R< align=justify>CBuilder</FONT><FONT face=宋体 size=3>的</FONT><FONT size=3>IDE</FONT><FONT face=宋体 size=3>(集成开发环境的缩写,内含了编辑、编译、连接以及调试工具)提供了强大的编辑、编译和调试功能。与同类编程工具相比,</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>的编译连接速度是相当快的,它内建的调试功能不仅可以实现一般的设置断点、单步执行、运行时变量监视等功能,还提供有</FONT><FONT size=3>CodeGuard</FONT><FONT face=宋体 size=3>功能,该功能可以在运行时查找内存越界、资源未释放、句柄使用不正确等常见的一些编程错误。</P>* F/ q7 M" X; z3 h# @
< align=justify>上面为大家介绍了</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>的主要特点,相信这么棒的软件开发工具已经让你心动了吧?下面心铃就带领大家进入奇妙的</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>编程世界。</P># }# m  g, L+ E
<UL><B>" j, a" G9 a+ Y. ?2 x
< align=justify>
% e- Y7 ^5 n8 h5 f<LI>所需的预备知识 1 h( n8 h/ C+ M7 R( ]0 Q  r
<p></LI></UL></B>2 ~/ ]6 s. h( J8 v5 \
< align=justify>我们的讲座是介绍编程工具的使用方法,而不是介绍单纯的编程语言,虽然</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>具有易学易用的特点,但如果朋友们熟悉以下一些基础的编程知识,学习起来会事半功倍的:</FONT><FONT face="宋体, MS Song" size=3>C/C++</FONT><FONT face=宋体 size=3>语言、</FONT><FONT face="宋体, MS Song" size=3>Windows</FONT><FONT face=宋体 size=3>编程基本知识、面向对象编程基础以及一定的软件工程基础知识。不过,目前还不太了解这些知识的朋友也不用着急,俗话说“只要工夫深,铁杆磨成针”,只要在今后的学习中多花一些时间和精力,相信没有什么能够难倒聪明的你。</P>
  q' H1 q$ s* y! n/ R  D& e! x<UL><B>; S" D+ T$ y! l) O! G
< align=justify>
  D1 o3 ^9 l5 ~! N6 V$ ^<LI>安装</FONT><FONT size=3><FONT face="宋体, MS Song">C++ Builder </FONT>
8 G/ X8 d7 B) T<p></LI></UL></B></FONT><FONT face=宋体 size=3>
- _4 B& G% ]! ~+ J( z* l. i/ ]< align=justify>下面以</FONT><FONT face="宋体, MS Song" size=3>CBuilder 5.0</FONT><FONT face=宋体 size=3>企业版为例来介绍一下安装过程。安装</FONT><FONT face="宋体, MS Song" size=3>CBuilder 5</FONT><FONT face=宋体 size=3>所需要的系统基本配置为:奔腾</FONT><FONT face="宋体, MS Song" size=3>90MHz</FONT><FONT face=宋体 size=3>以上</FONT><FONT face="宋体, MS Song" size=3>C</FONT><FONT face=宋体 size=3>机、至少</FONT><FONT face="宋体, MS Song" size=3>32MB</FONT><FONT face=宋体 size=3>内存、以及至少</FONT><FONT face="宋体, MS Song" size=3>250MB</FONT><FONT face=宋体 size=3>的磁盘空间。当然,这只是最低配置,但如果真的在这样的机器上运行</FONT><FONT face="宋体, MS Song" size=3>CBuilder 5</FONT><FONT face=宋体 size=3>,那种感觉,恐怕就只能用“等你等到我心痛”来形容了。因此,心铃还是推荐大家使用自己最快的机器,安装尽量多的内存以及留出大量的硬盘自由空间,这样方可提高</FONT><FONT face="宋体, MS Song" size=3>CBuilder 5</FONT><FONT face=宋体 size=3>的运行效率,节约宝贵的时间。另外,</FONT><FONT face="宋体, MS Song" size=3>CBuilder 5</FONT><FONT face=宋体 size=3>可运行在</FONT><FONT face="宋体, MS Song" size=3>Windows 2000</FONT><FONT face=宋体 size=3>,</FONT><FONT face="宋体, MS Song" size=3>Windows 9x</FONT><FONT face=宋体 size=3>以及</FONT><FONT face="宋体, MS Song" size=3>Windows NT4</FONT><FONT face=宋体 size=3>(至少安装了</FONT><FONT face="宋体, MS Song" size=3>SP3</FONT><FONT face=宋体 size=3>)上。</P>) K+ S2 d% `: e! X; N6 O
< align=justify>安装前首先关闭系统中所有不需要的程序,特别是可能和</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>安装程序发生冲突的软件,例如</FONT><FONT face="宋体, MS Song" size=3>Outlook 98</FONT><FONT face=宋体 size=3>和一些实时病毒监测程序等。</P>
# U5 |; u" f4 U9 Y: F( N; R< align=justify>将安装盘放入光驱内,并启动</FONT><FONT face="宋体, MS Song" size=3>Install.exe</FONT><FONT face=宋体 size=3>程序。首先出现的是欢迎消息,第</FONT><FONT face="宋体, MS Song" size=3>2</FONT><FONT face=宋体 size=3>步要求输入序列号,第</FONT><FONT face="宋体, MS Song" size=3>3</FONT><FONT face=宋体 size=3>步显示软件使用许可协议,第</FONT><FONT face="宋体, MS Song" size=3>4</FONT><FONT face=宋体 size=3>步会出现安装信息对话框,仔细阅读该部分内容对解决安装过程中出现的问题会有所帮助。</P>2 B# e; E/ S4 d, s: I$ r
< align=justify>第</FONT><FONT face="宋体, MS Song" size=3>5</FONT><FONT face=宋体 size=3>步选择安装类型(图</FONT><FONT face="宋体, MS Song" size=3>1-1</FONT><FONT face=宋体 size=3>),所列的安装类型包括典型、简洁、自定义和完全安装四种类型。其中完全安装(</FONT><FONT face="宋体, MS Song" size=3>Full</FONT><FONT face=宋体 size=3>)的内容最完整,包括</FONT><FONT face="宋体, MS Song" size=3>CBuilder IDE</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>BDE</FONT><FONT face=宋体 size=3>(</FONT><FONT face="宋体, MS Song" size=3>Borland</FONT><FONT face=宋体 size=3>数据库引擎)、数据库桌面等,典型安装(</FONT><FONT face="宋体, MS Song" size=3>Typical</FONT><FONT face=宋体 size=3>)只比完全安装缺少</FONT><FONT face="宋体, MS Song" size=3>MFC</FONT><FONT face=宋体 size=3>支持和微软</FONT><FONT face="宋体, MS Song" size=3>SDK</FONT><FONT face=宋体 size=3>帮助文档,简洁安装(</FONT><FONT face="宋体, MS Song" size=3>Compact</FONT><FONT face=宋体 size=3>)则只包括</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>的主程序和</FONT><FONT face="宋体, MS Song" size=3>ITE</FONT><FONT face=宋体 size=3>(</FONT><FONT face="宋体, MS Song" size=3>Internet Translate Environment</FONT><FONT face=宋体 size=3>)、</FONT><FONT face="宋体, MS Song" size=3>CodeGuard</FONT><FONT face=宋体 size=3>等少数工具。自定义安装(</FONT><FONT face="宋体, MS Song" size=3>Custom</FONT><FONT face=宋体 size=3>)是由用户选择安装内容。另外还有一个“仅配置注册信息”的选项,用于修复以前的安装信息,如果选取了该选项,则仅仅对安装过程中搜集到的信息进行注册,安装过程中不拷贝或只拷贝很少的必需文件,在第一次安装时不要选中该选项。为了能够充分体验</FONT><FONT face="宋体, MS Song" size=3>CBuilder 5</FONT><FONT face=宋体 size=3>的强大功能,心铃建议大家在这一步选择完全安装,大约需要</FONT><FONT face="宋体, MS Song" size=3>388MB</FONT><FONT face=宋体 size=3>的硬盘空间。</P>
9 ?2 K! z, p1 o/ z$ _# Z+ J< align=justify>如果在第</FONT><FONT face="宋体, MS Song" size=3>5</FONT><FONT face=宋体 size=3>步中选择了完全安装,那么安装内容将包括</FONT><FONT face="宋体, MS Song" size=3>Office</FONT><FONT face=宋体 size=3>控件集,第</FONT><FONT face="宋体, MS Song" size=3>6</FONT><FONT face=宋体 size=3>步需要选择一种版本(</FONT><FONT face="宋体, MS Song" size=3>Office 97</FONT><FONT face=宋体 size=3>还是</FONT><FONT face="宋体, MS Song" size=3>Office 2000</FONT><FONT face=宋体 size=3>)的</FONT><FONT face="宋体, MS Song" size=3>Office</FONT><FONT face=宋体 size=3>控件集进行安装。</P>
8 u/ b/ U  y, u. d3 R< align=justify>如果系统中以前曾安装过其它的</FONT><FONT face="宋体, MS Song" size=3>C++</FONT><FONT face=宋体 size=3>开发工具,如</FONT><FONT face="宋体, MS Song" size=3>VC</FONT><FONT face=宋体 size=3>或</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>的早期版本,第</FONT><FONT face="宋体, MS Song" size=3>7</FONT><FONT face=宋体 size=3>步会让你选择是否重新设置文件关联,该对话框中会列出</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>中常用的文件类型,如</FONT><FONT face="宋体, MS Song" size=3>.cpp</FONT><FONT face=宋体 size=3>(</FONT><FONT face="宋体, MS Song" size=3>C++</FONT><FONT face=宋体 size=3>源程序文件)、</FONT><FONT face="宋体, MS Song" size=3>.bpr</FONT><FONT face=宋体 size=3>(</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>工程文件)等等,如果选择关联某种文件类型,那么今后在资源管理器中双击该类型的文件时,就可以自动调用</FONT><FONT face="宋体, MS Song" size=3>CBuilder 5</FONT><FONT face=宋体 size=3>来打开该文件。心铃建议大家将所有的文件类型都选中,然后按下一步。</P>
* h9 n" W& R& _! y) G/ j< align=justify>第</FONT><FONT face="宋体, MS Song" size=3>8</FONT><FONT face=宋体 size=3>步是关于远程数据库应用的许可协议,接受它,进入第</FONT><FONT face="宋体, MS Song" size=3>9</FONT><FONT face=宋体 size=3>步。</P>
5 Q+ H  t$ l, l0 b4 x" W: e< align=justify>第</FONT><FONT face="宋体, MS Song" size=3>9</FONT><FONT face=宋体 size=3>步选择安装目录,如图</FONT><FONT face="宋体, MS Song" size=3>1-2</FONT><FONT face=宋体 size=3>所示。如果硬盘自由空间不多,你可以考虑将</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>的程序文件、共享文件、</FONT><FONT face="宋体, MS Song" size=3>BDE</FONT><FONT face=宋体 size=3>与</FONT><FONT face="宋体, MS Song" size=3>SQL</FONT><FONT face=宋体 size=3>连接、数据库桌面分别安装在不同的硬盘上。心铃建议在安装时选择一个足够大的硬盘,将上述四部分内容全部安装到该盘,并保持缺省的目录关系。另外在修改目录名时要注意,路径名中最好不要有中文或其它双字节字符(如全角字母),否则有可能出现问题。</P>1 f7 ?& ]; e) ^: ]
< align=justify>第</FONT><FONT face="宋体, MS Song" size=3>10</FONT><FONT face=宋体 size=3>步设置启动菜单名称。第</FONT><FONT face="宋体, MS Song" size=3>11</FONT><FONT face=宋体 size=3>步是开始拷贝文件对话框,其中显示了用户在前几步中选择的安装选项,如果你认为一切正确,则可以按下“</FONT><FONT face="宋体, MS Song" size=3>Install</FONT><FONT face=宋体 size=3>”按钮,开始文件拷贝、安装过程。</P>
" }9 Q( S8 G/ t6 D0 I& y5 C: g< align=justify>整个文件拷贝过程大约需要</FONT><FONT face="宋体, MS Song" size=3>20</FONT><FONT face=宋体 size=3>分钟。拷贝完毕后,根据提示重新启动计算机。安装过程再进行最后的配置工作。如果一切顺利,配置完成后整个安装过程就结束了。</P>( F9 ~% u& r2 h4 _4 P" k& b, \9 D
<UL></FONT><B><FONT size=3>
9 @+ x# p: K0 Q7 H< align=justify>
% K: |) M7 i7 j3 h<LI>C++ Builder</FONT><FONT face=宋体 size=3>的组成 2 d+ k0 g% {& q+ I6 t; F$ i$ L
<p></LI></UL></B>
5 {1 t* G9 |1 I: @& I3 b+ s< align=justify>了解和熟悉</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>的文件组织和程序组织对大家今后的学习会有不小的帮助。表</FONT><FONT face="宋体, MS Song" size=3>1-1</FONT><FONT face=宋体 size=3>是</FONT><FONT face="宋体, MS Song" size=3>CBuilder 5</FONT><FONT face=宋体 size=3>的文件组织关系。</P><B>
6 e8 p5 }9 J) h  x$ e3 u< align=center>表</FONT><FONT face="宋体, MS Song" size=3>1-1 C++ Builder 5.0</FONT><FONT face=宋体 size=3>的文件组织</P>
3 W; N5 ]% N) c( [<></B></FONT>* V2 e  p; I& u8 i
<TABLE borderColor=#000000 cellSpacing=2 cellPadding=7 width=568 border=1>
0 t1 c: `& N: ^- B! N: K' X
& `8 G( Q- Y' [9 h$ [+ v+ D<TR>. r0 C' T8 p: X  D/ ~4 N2 S
<TD vAlign=top width="32%"><B><FONT face=宋体 size=3>" f* }# {0 y! ^# L, l8 z
<P align=justify>路</FONT><FONT face="宋体, MS Song" size=3> </FONT><FONT face=宋体 size=3>径</B></FONT></P></TD>
) j* I9 `- X! X& P6 Q0 b<TD vAlign=top width="68%"><B><FONT face=宋体 size=3>+ H0 Q) }/ G0 z* U; a- x4 t( f7 T3 W
<P align=justify>说</FONT><FONT face="宋体, MS Song" size=3> </FONT><FONT face=宋体 size=3>明</B></FONT></P></TD></TR>
7 `5 l3 d) {' ~0 e" ^<TR>4 h1 [, T6 r, g: g% e. N! }; A
<TD vAlign=top width="32%"><FONT size=3>+ i- K/ ]% n* n* X
<P align=justify>Borland\CBuilder5\Bin</FONT></P></TD>
2 }- u' y/ U9 [# O/ \( x5 R7 e<TD vAlign=top width="68%"><FONT size=3>
( A+ ?1 k% W8 ~3 c$ u<P align=justify>IDE</FONT><FONT face=宋体 size=3>的主要工具软件,如编译器、连接器、资源编程器等</FONT></P></TD></TR>
: t/ ]& ^* E3 R9 u5 v& k9 ^( {5 h<TR>. E: I& q( s+ c1 _+ b- f
<TD vAlign=top width="32%"><FONT size=3>3 t8 `: t% u9 |+ O! U
<P align=justify>Borland\CBuilder5\Examples</FONT></P></TD>
" Y8 r0 P$ t: @$ h<TD vAlign=top width="68%"><FONT face=宋体 size=3>) f/ R" _, H! M
<P align=justify>应用程序例程</FONT></P></TD></TR>
" `! c& r9 ?( C1 }: \$ E8 {2 t<TR>
9 \9 b, Q. n  w- W+ G* }<TD vAlign=top width="32%"><FONT size=3>( U% W! H4 r& e1 r5 B) U9 t
<P align=justify>Borland\CBuilder5\Help</FONT></P></TD>
% V0 w; `2 ]" c3 J# h6 B<TD vAlign=top width="68%"><FONT face=宋体 size=3>1 B2 q8 {: s3 W8 I% V# Z
<P align=justify>帮助文档</FONT></P></TD></TR>
2 U: t. w( g; z" i3 q9 y<TR>
, _0 \! V% c, X/ K<TD vAlign=top width="32%"><FONT size=3>
3 F9 i3 N5 L2 h1 I7 h8 }<P align=justify>Borland\CBuilder5\Include</FONT></P></TD>
7 W% c+ E& p6 F3 B5 g* e/ T<TD vAlign=top width="68%"><FONT size=3>- C& F  @  M8 `/ T
<P align=justify>C++ Builder</FONT><FONT face=宋体 size=3>标准头文件</FONT></P></TD></TR>
2 E0 [- x& w2 S0 }1 h<TR>' J# Q6 N9 U4 n4 a
<TD vAlign=top width="32%"><FONT size=3>
7 w6 b; Y  Q# P( c7 j2 }<P align=justify>Borland\CBuilder5\Lib</FONT></P></TD>
% o' h+ Q9 U5 Z1 h<TD vAlign=top width="68%"><FONT size=3>
% A. [% T$ `! b* y3 B0 H: O5 W- ?2 s<P align=justify>C++ Builder</FONT><FONT face=宋体 size=3>标准库文件</FONT></P></TD></TR>
& l  x  r' ~$ E* p" o/ \3 A<TR>
7 d0 M! z# h$ E5 G3 {<TD vAlign=top width="32%"><FONT size=3>
9 z! X$ P% b5 c" S1 g' c<P align=justify>Borland\CBuilder5\ObjRepos</FONT></P></TD>
& N5 F) ]/ R2 K' m$ v8 v* F<TD vAlign=top width="68%"><FONT face=宋体 size=3>' C0 Y4 [! M: h+ C" f2 T" o% A
<P align=justify>对象仓库</FONT></P></TD></TR>
" M$ d$ w% X4 K' B9 j<TR>
. v+ U9 C" V% Y2 H+ V<TD vAlign=top width="32%"><FONT size=3>
1 X; m! L0 F1 O3 ^<P align=justify>Borland\CBuilder5\Ocx</FONT></P></TD>
9 y! H( u0 H* k% @$ e<TD vAlign=top width="68%"><FONT size=3>( v9 m4 w6 m' P8 D, s
<P align=justify>OCX</FONT><FONT face=宋体 size=3>控件库</FONT></P></TD></TR>; c* {7 t7 E- v1 U4 E" G: J
<TR>" T+ \, l6 E4 ?$ |7 C
<TD vAlign=top width="32%"><FONT size=3>
7 I; O) L0 a2 i7 E<P align=justify>Borland\CBuilder5\Projects</FONT></P></TD>
4 w. x: N# i) ?<TD vAlign=top width="68%"><FONT face=宋体 size=3>1 j" d$ }9 i& H& \5 W4 }
<P align=justify>用户工程存放目录</FONT></P></TD></TR>
7 }. @0 h# x) n4 I; r<TR>
9 P% a; I& K4 R* u<TD vAlign=top width="32%"><FONT size=3>
2 ^4 H9 R( u! t<P align=justify>Borland\CBuilder5\Source</FONT></P></TD>
( f: _! S8 D& k8 s<TD vAlign=top width="68%"><FONT size=3>2 _* G: K# a  |; N" M
<P align=justify>VCL</FONT><FONT face=宋体 size=3>类及其他标准的源代码</FONT></P></TD></TR>
; `8 Z- F% w$ c( p' @<TR>3 f8 b# g$ W" M/ o6 @2 s. u; z
<TD vAlign=top width="32%"><FONT size=3>( Z/ N  U6 Q9 |- y. |
<P align=justify>Borland\Database Desktop</FONT></P></TD>
9 \4 C  E& D4 T) E& [; T+ {<TD vAlign=top width="68%"><FONT face=宋体 size=3>+ x6 D6 k: p8 E: a) s% z0 y  `
<P align=justify>数据桌面工具软件及其运行目录</FONT></P></TD></TR>
9 Y! g1 [% m; A, y8 t3 |<TR>- Q1 A2 v9 N1 q, e
<TD vAlign=top width="32%"><FONT size=3>; e% g8 ^9 ?( W) b
<P align=justify>Borland Shared\Bde</FONT></P></TD>% q( c% E" ~3 p* ^1 r; ]
<TD vAlign=top width="68%"><FONT size=3>" _! \/ P% Q  s% I; z
<P align=justify>Borland</FONT><FONT face=宋体 size=3>数据库引擎驱动程序</FONT></P></TD></TR>6 O4 _, {+ J) M1 f& h
<TR>
* V1 J  k- a. Y( v( A! I1 j<TD vAlign=top width="32%"><FONT size=3>
+ p5 r4 h7 i% m  G7 w<P align=justify>Borland Shared\Data</FONT></P></TD># U$ f* s+ z: w7 Z: q
<TD vAlign=top width="68%"><FONT face=宋体 size=3>
: ]8 |, b4 l9 V6 Y, O' ], @<P align=justify>样例数据库</FONT></P></TD></TR>
! \5 d$ w7 B6 q0 U7 x<TR>. [  Y3 T/ w9 t+ L# b
<TD vAlign=top width="32%"><FONT size=3>
% m3 H+ Z( x: ]' d5 f& s* ?<P align=justify>Borland Shared\Images</FONT></P></TD>
; Y8 B" W9 W* k5 l; r0 H' i) E<TD vAlign=top width="68%"><FONT face=宋体 size=3>) l, t  i0 ]: B
<P align=justify>图象库</FONT></P></TD></TR>
2 K- [. M$ D: n, y. B<TR>8 g2 C' K" G& Z4 F& X9 E6 N0 U4 S
<TD vAlign=top width="32%"><FONT size=3>
2 _. v( a0 V  E: U0 Y3 G4 ^. X; J<P align=justify>Borland Shared\MSHelp</FONT></P></TD>
* z# u: B/ h4 k9 |<TD vAlign=top width="68%"><FONT face=宋体 size=3>
) I4 b5 c. z& [, @7 T<P align=justify>微软帮助文档</FONT></P></TD></TR></TABLE><FONT face=宋体 size=3></P>2 a+ @$ l1 K9 T% f$ B9 ~
<P align=justify>开始菜单中</FONT><FONT face="宋体, MS Song" size=3>CBuilder 5</FONT><FONT face=宋体 size=3>程序组包括的工具软件如表</FONT><FONT face="宋体, MS Song" size=3>1-2</FONT><FONT face=宋体 size=3>所示:</P><B>
, Y; m, v" n" G: U<P align=center>表</FONT><FONT face="宋体, MS Song" size=3>1-2 C++ Builder 5</FONT><FONT face=宋体 size=3>包含的主要工具软件</P>( ^9 y- a  `: B
<P></B></FONT>+ m( H$ K) D" w4 e
<TABLE borderColor=#000000 cellSpacing=2 cellPadding=7 width=568 border=1>% {/ v' A5 H* D1 |2 z: a6 E3 D
. R4 M9 F' }4 T3 I6 v- B' C6 N
<TR>3 W9 G. v+ r) b
<TD vAlign=top width="25%"><B><FONT face=宋体 size=3>2 d7 B& t9 C. s) k7 N; G2 j( S
<P align=justify>名</FONT><FONT face="宋体, MS Song" size=3> </FONT><FONT face=宋体 size=3>称</B></FONT></P></TD>4 {# Y; I* h2 z1 l& A( w+ i
<TD vAlign=top width="75%"><B><FONT face=宋体 size=3>
$ W7 W5 [4 Z. N" m9 y" f  i2 Q<P align=justify>说</FONT><FONT face="宋体, MS Song" size=3> </FONT><FONT face=宋体 size=3>明</B></FONT></P></TD></TR>
  [: A3 E1 k7 J9 l5 W, d9 l<TR>
. q4 Y6 R$ R. S- o& A9 c<TD vAlign=top width="25%"><FONT size=3>
! H$ ?1 |: K. Y6 W6 `0 @( q<P align=justify>BDE Administrator</FONT></P></TD>
- N, s2 H2 E8 Z; r) L) A: c# @1 o<TD vAlign=top width="75%"><FONT size=3>
! a! X1 {% p+ L3 h% W<P align=justify>Borland</FONT><FONT face=宋体 size=3>数据库引擎管理器</FONT></P></TD></TR>) d5 @" \+ M; ?
<TR>% J4 d  y' v" p" {4 F3 L, H& R
<TD vAlign=top width="25%"><FONT size=3>: W3 O% A6 V: A  b' Q# G+ E( `
<P align=justify>C++ Builder 5</FONT></P></TD>3 B( j9 g( N+ |$ `
<TD vAlign=top width="75%"><FONT size=3>) R6 L& G- P; Z/ y3 d7 `( E/ X
<P align=justify>C++ Builder 5</FONT><FONT face=宋体 size=3>主程序(集成开发环境及内含的工具软件)</FONT></P></TD></TR>
0 @: \" I' u6 d6 C& _; {1 e8 j<TR>% r8 {; Z$ {7 C$ G& d# q* g( W
<TD vAlign=top width="25%"><FONT size=3>2 I7 M, R9 J! {; m9 \5 @
<P align=justify>Data pump</FONT></P></TD>) G( \. V; V. X5 u. H# v
<TD vAlign=top width="75%"><FONT face=宋体 size=3>
0 z. F) R  @$ O, E7 s3 f" |<P align=justify>在数据库之间移动和拷贝数据。</FONT></P></TD></TR>4 e3 l' @5 a  M# H+ j. M4 k0 x
<TR>& k" N0 R$ R. a- A
<TD vAlign=top width="25%"><FONT size=3>* m, K5 O& G7 o$ Q$ m- M2 a8 V
<P align=justify>Image Editor</FONT></P></TD>- Y* S1 J: c1 d& b, D7 o/ R
<TD vAlign=top width="75%"><FONT face=宋体 size=3>% M; l) @2 L1 A" D$ G0 A
<P align=justify>图象编辑器</FONT></P></TD></TR>
( v* T4 I3 e" r% R. F( m<TR>8 h2 Q4 H. w8 ]7 Z; F4 |, c5 F: x
<TD vAlign=top width="25%"><FONT size=3>
0 E# Y2 m  I; ^% f2 _+ b% V<P align=justify>SQL Explorer</FONT></P></TD>3 w3 `0 [) X; O- f
<TD vAlign=top width="75%"><FONT face=宋体 size=3>
* G7 y1 C0 J- h6 `: [<P align=justify>数据库浏览器,可列出所有本地数据库、</FONT><FONT face="宋体, MS Song" size=3>ODBC</FONT><FONT face=宋体 size=3>数据库及建立了</FONT><FONT face="宋体, MS Song" size=3>SQL Link</FONT><FONT face=宋体 size=3>的远程</FONT><FONT face="宋体, MS Song" size=3>SQL</FONT><FONT face=宋体 size=3>数据库</FONT></P></TD></TR>
1 k3 b$ A6 M0 N* O0 L9 M<TR># _7 W" }( c+ r# I" }) V
<TD vAlign=top width="25%"><FONT size=3>
- N. `7 J9 t: N8 H" c<P align=justify>SQL Monitor</FONT></P></TD>6 l/ @8 S3 z8 m* }& n2 c: o
<TD vAlign=top width="75%"><FONT face=宋体 size=3>
7 A4 I" Z6 x" ]. w- R# ?: t& t<P align=justify>监视对远程</FONT><FONT face="宋体, MS Song" size=3>SQL</FONT><FONT face=宋体 size=3>数据库的访问</FONT></P></TD></TR>
$ k' W) l$ d; h* }! [9 l* Q6 y/ g<TR>, [) D, o4 y& e4 g
<TD vAlign=top width="25%"><FONT size=3>
+ p0 |$ P& w$ }8 X  @2 j! |<P align=justify>WinSight32</FONT></P></TD>/ K6 w" d. a( ?* j, x' n% b
<TD vAlign=top width="75%"><FONT face=宋体 size=3>) X: Y0 H3 s7 v
<P align=justify>监视系统中的所有进程、线程、窗口、消息传递的工具软件</FONT></P></TD></TR></TABLE><FONT face=宋体 size=3></P>8 D; w! T( ~0 r' O( E2 R
<P align=justify> </P></FONT>
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

<b><FONT size=6> </FONT></b>< align=center>C++ Builder<FONT face=宋体 size=6>集成开发环境(上)</P></FONT><FONT face=宋体 size=3>< align=justify>介绍一个新软件,总免不了要介绍该软件的用户界面,如菜单、工具条等等的使用方法,也许有的朋友会说“我的</FONT><FONT face="宋体, MS Song" size=3>E</FONT><FONT face=宋体 size=3>文不错,又有过使用</FONT><FONT face="宋体, MS Song" size=3>IDE</FONT><FONT face=宋体 size=3>编程开发的经验,所以这一步可以省了。”,但所谓“磨刀不误砍柴功”,</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>集成开发环境具有相当丰富的功能,如果能够熟练掌握这些功能,势必会大大提高我们的工作效率。当然,仅仅通过短短的讲座没有办法在短时间内对</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>集成开发环境进行详细的介绍,但心铃仍然希望借此大家能对</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>的使用和操作有一个初步的了解,并为进一步学习打下一个良好的基础。</FONT><FONT size=3><FONT face="宋体, MS Song"> </FONT></P>< align=justify>CBuilder </FONT><FONT face=宋体 size=3>集成开发环境采用了浮动式窗口</FONT><FONT size=3>/</FONT><FONT face=宋体 size=3>工具条的界面风格,如图</FONT><FONT size=3>2-1</FONT><FONT face=宋体 size=3>所示。缺省的集成开发环境由主菜单、工具条、元件面板、对象浏览器、窗体编辑器、代码编辑器和类浏览器组成,用户还可以通过</FONT><FONT size=3>View</FONT><FONT face=宋体 size=3>菜单中的一系列命令来定制自己习惯的窗口布局。</P><UL><B>< align=justify><LI>菜单
( s( q! U3 U/ w3 `% O</LI></UL></B></FONT><FONT size=3>< align=justify>CBuilder</FONT><FONT face=宋体 size=3>的菜单命令非常多,主菜单就有</FONT><FONT size=3>10</FONT><FONT face=宋体 size=3>个菜单栏,上百个菜单项,另外还有众多右键关联菜单。主菜单和关联菜单一起涵盖了</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>集成开发环境支持的所有操作命令。许多常用菜单命令都有加速键,如</FONT><FONT size=3>F9</FONT><FONT face=宋体 size=3>(调试运行)、</FONT><FONT size=3>Ctrl+S</FONT><FONT face=宋体 size=3>(保存文件)等,熟练使用这些加速键可以提高编程时的工作效率。</P>< align=justify>主菜单按不同用途分为</FONT><FONT face="宋体, MS Song" size=3>10</FONT><FONT face=宋体 size=3>个菜单栏。</FONT><FONT face="宋体, MS Song" size=3>File</FONT><FONT face=宋体 size=3>菜单中主要包括与文件操作有关的命令,其中最常用的是新建工程(</FONT><FONT face="宋体, MS Song" size=3>New Application</FONT><FONT face=宋体 size=3>)、打开工程(</FONT><FONT face="宋体, MS Song" size=3>Open Project</FONT><FONT face=宋体 size=3>)、打开文件(</FONT><FONT face="宋体, MS Song" size=3>Open</FONT><FONT face=宋体 size=3>)和保存(</FONT><FONT face="宋体, MS Song" size=3>Save</FONT><FONT face=宋体 size=3>)。另外一个非常有用的命令是新建对象(</FONT><FONT face="宋体, MS Song" size=3>New</FONT><FONT face=宋体 size=3>),它会调出如图</FONT><FONT face="宋体, MS Song" size=3>2-2</FONT><FONT face=宋体 size=3>所示的对话框。</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>中有许多预先建立的对象模版和向导,如各种类型的工程、不同用途的窗体等等,从</FONT><FONT face="宋体, MS Song" size=3>New Items</FONT><FONT face=宋体 size=3>对话框中选择一种对象模版或向导,可以让你按照向导的指示生成一个新的对象,许多高级的功能都可以通过这种方式实现,从而避免了大量手工重复性的劳动。如图</FONT><FONT face="宋体, MS Song" size=3>2-2</FONT><FONT face=宋体 size=3>所示,</FONT><FONT face="宋体, MS Song" size=3>New Items</FONT><FONT face=宋体 size=3>对话框将对象模版和向导分成了多个页,除了少数几页外,大部分的对象模版都保存在对象仓库(</FONT><FONT face="宋体, MS Song" size=3>Object Repository</FONT><FONT face=宋体 size=3>)中,通过对象仓库保存和重用一些已建立的对象是</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>代码重用技术中的重要内容。在讲座的后面,心铃还要介绍如何向对象仓库中的添加、编辑和删除对象的方法。</P></FONT><FONT size=3>< align=justify>Edit</FONT><FONT face=宋体 size=3>菜单列出了与编辑有关的命令。在</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>中,编辑不仅仅指代码编辑,也包括窗体编辑。</FONT><FONT size=3>Edit</FONT><FONT face=宋体 size=3>菜单中常用命令有:撤消</FONT><FONT size=3>/</FONT><FONT face=宋体 size=3>重复操作(</FONT><FONT size=3>Undo/Redo</FONT><FONT face=宋体 size=3>)、剪贴板操作(</FONT><FONT size=3>Copy</FONT><FONT face=宋体 size=3>、</FONT><FONT size=3>aste</FONT><FONT face=宋体 size=3>、</FONT><FONT size=3>Cut</FONT><FONT face=宋体 size=3>等)、布局操作(</FONT><FONT size=3>Align</FONT><FONT face=宋体 size=3>、</FONT><FONT size=3>Scale</FONT><FONT face=宋体 size=3>、</FONT><FONT size=3>Size</FONT><FONT face=宋体 size=3>);根据心铃的一点点实际经验,如果要让程序的用户界面设计得整齐美观,用好布局操作命令是很重要的。</P></FONT><FONT size=3>< align=justify>Search</FONT><FONT face=宋体 size=3>菜单包括在代码中查找和定位的有关命令,其中常用的有查找(</FONT><FONT size=3>Find</FONT><FONT face=宋体 size=3>)、在多个文件中查找(</FONT><FONT size=3>Find in Files</FONT><FONT face=宋体 size=3>)、替换(</FONT><FONT size=3>Replace</FONT><FONT face=宋体 size=3>)和按行号定位(</FONT><FONT size=3>Go to Line Number</FONT><FONT face=宋体 size=3>)等命令。</P></FONT><FONT size=3>< align=justify>View</FONT><FONT face=宋体 size=3>菜单中的命令用来调整集成开发环境的窗口布局。</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>内含许多具有特殊用途的工具窗口,如果全部同时显示出来,集成开发环境中的窗口就太多了,而且显得十分混乱,因此可以通过</FONT><FONT size=3>View</FONT><FONT face=宋体 size=3>菜单调出或隐藏这些窗口。例如,我们可以用</FONT><FONT size=3>roject Manager</FONT><FONT face=宋体 size=3>命令打开工程管理器,查看当前所有打开的工程;在运行时,可以打开各种调试功能窗口,如变量监视窗口(</FONT><FONT size=3>Watches</FONT><FONT face=宋体 size=3>)、调用堆栈窗口(</FONT><FONT size=3>Call Stack</FONT><FONT face=宋体 size=3>),以方便调试和排错;通过</FONT><FONT size=3>Toggle Form/Unit</FONT><FONT face=宋体 size=3>命令可以在窗体和其代码之间进行切换。</FONT><FONT size=3>View</FONT><FONT face=宋体 size=3>系列菜单命令很有用,心铃建议大家自己动手试一试每一项命令,调出这些特殊工具窗口,仔细了解它们的用途和用法。</P></FONT><FONT size=3>< align=justify>roject</FONT><FONT face=宋体 size=3>菜单列出了与工程有关的命令,包括:向工程中添加文件(</FONT><FONT size=3>Add to Project</FONT><FONT face=宋体 size=3>)、从工程中删除文件(</FONT><FONT size=3>Remove from Project</FONT><FONT face=宋体 size=3>)、把当前工程添加到对象仓库中(</FONT><FONT size=3>Add to Repository</FONT><FONT face=宋体 size=3>)、编译源代码(</FONT><FONT size=3>Compile Unit</FONT><FONT face=宋体 size=3>)、生成可执行文件(</FONT><FONT size=3>Make</FONT><FONT face=宋体 size=3>)、修改工程的设置(</FONT><FONT size=3>Option</FONT><FONT face=宋体 size=3>)等等,其中</FONT><FONT size=3>Option</FONT><FONT face=宋体 size=3>命令可以调出工程设置对话框,修改编译连接参数、设置启动窗口等,具体使用还会在后面的讲座中介绍。另外,</FONT><FONT size=3>Add to Repository</FONT><FONT face=宋体 size=3>命令可以把当前工程的所有内容(包括所有的窗体和源程序文件)添加到对象仓库中,如图</FONT><FONT size=3>2-3</FONT><FONT face=宋体 size=3>所示,“</FONT><FONT size=3>Add to Repository</FONT><FONT face=宋体 size=3>”对话框中需要输入的参数有对象名称,对象描述,以及目标页。目标页可以为对象仓库中已有的页,也可以输入新名字来建立一个新的对象仓库页。除了工程之外,还可以把窗体添加到对象仓库中,添加方法是编辑状态下,在某一窗体上单击右键,在弹出的关联菜单中选择(</FONT><FONT size=3>Add to Repository</FONT><FONT face=宋体 size=3>)命令。</P></FONT><FONT size=3>< align=justify>Run</FONT><FONT face=宋体 size=3>菜单用于调试工程,其中常用的命令包括运行(</FONT><FONT size=3>Run</FONT><FONT face=宋体 size=3>)、设置命令行参数(</FONT><FONT size=3>arameter</FONT><FONT face=宋体 size=3>)、单步(</FONT><FONT size=3>Step</FONT><FONT face=宋体 size=3>)、添加变量监视(</FONT><FONT size=3>Add Watch</FONT><FONT face=宋体 size=3>)和添加断点(</FONT><FONT size=3>Add Breakpoint</FONT><FONT face=宋体 size=3>)等。</P></FONT><FONT size=3>< align=justify>Component</FONT><FONT face=宋体 size=3>菜单中是元件有关的命令,包括建立元件、引入一个</FONT><FONT size=3>ActiveX</FONT><FONT face=宋体 size=3>控件等。在</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>中,编译好的元件存在于包文件中。包文件是</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>特有的一种动态连接库,其文件扩展名为</FONT><FONT size=3>BPL</FONT><FONT face=宋体 size=3>,一个</FONT><FONT size=3>BPL</FONT><FONT face=宋体 size=3>库中可以包含许多元件,常用的</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>元件位于</FONT><FONT size=3>dclstd50.bpl</FONT><FONT face=宋体 size=3>中,新建的元件一般位于</FONT><FONT size=3>dclusr50.bpl</FONT><FONT face=宋体 size=3>中。建立元件的过程就是将元件的源代码编译成</FONT><FONT size=3>BPL</FONT><FONT face=宋体 size=3>库的过程,用来定义</FONT><FONT size=3>BPL</FONT><FONT face=宋体 size=3>库编译选项的文件为其工程文件</FONT><FONT size=3>.BPK</FONT><FONT face=宋体 size=3>文件。</P></FONT><FONT size=3>< align=justify>Database</FONT><FONT face=宋体 size=3>菜单为数据库有关的命令,包括数据库浏览器(</FONT><FONT size=3>Explorer</FONT><FONT face=宋体 size=3>)、</FONT><FONT size=3>SQL</FONT><FONT face=宋体 size=3>监视器(</FONT><FONT size=3>SQL Monitor</FONT><FONT face=宋体 size=3>)和数据窗生成向导(</FONT><FONT size=3>Form Wizard</FONT><FONT face=宋体 size=3>)等。</P>< align=justify>从</FONT><FONT face="宋体, MS Song" size=3>Tools</FONT><FONT face=宋体 size=3>菜单可以启动许多有用的工具,如图象编辑器(</FONT><FONT face="宋体, MS Song" size=3>Image Editor</FONT><FONT face=宋体 size=3>)、数据库桌面(</FONT><FONT face="宋体, MS Song" size=3>Database Desktop</FONT><FONT face=宋体 size=3>)等,还可以对</FONT><FONT face="宋体, MS Song" size=3>CBuilder IDE</FONT><FONT face=宋体 size=3>的各项设置进行调整。例如,你对白底黑字看厌吗?通过</FONT><FONT face="宋体, MS Song" size=3>Editor Option</FONT><FONT face=宋体 size=3>修改代码编辑器的颜色方案,就可以给你的</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>换上更个性的彩妆。又如,在缺省情况下,</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>在启动时会创建新的工程,如果我们希望它自动调入上次编辑的工程,并恢复以前的编程状态,可以通过</FONT><FONT face="宋体, MS Song" size=3>Environment Option</FONT><FONT face=宋体 size=3>命令调出环境设置对话框,并在其</FONT><FONT face="宋体, MS Song" size=3>reference</FONT><FONT face=宋体 size=3>选项页中将</FONT><FONT face="宋体, MS Song" size=3>Autosave Options-&gtroject Desktop</FONT><FONT face=宋体 size=3>设置为选中状态,这样</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>在退出时会自动保存编辑状态,并在下次打开时自动调入上次编辑的工程。另外,</FONT><FONT face="宋体, MS Song" size=3>Tools-&gt;Repository</FONT><FONT face=宋体 size=3>命令可以打开</FONT><FONT face="宋体, MS Song" size=3>Object Repository</FONT><FONT face=宋体 size=3>对话框(图</FONT><FONT face="宋体, MS Song" size=3>2-4</FONT><FONT face=宋体 size=3>),以便添加、删除和更名对象仓库中的页和对象,这些更改都会在</FONT><FONT face="宋体, MS Song" size=3>New Items</FONT><FONT face=宋体 size=3>对话框中反映出来。</P></FONT><FONT size=3>< align=justify>Help</FONT><FONT face=宋体 size=3>菜单列出了与获取帮助相关的命令,包括</FONT><FONT size=3>C++ Builder Help</FONT><FONT face=宋体 size=3>、</FONT><FONT size=3>C++ Builder Tools</FONT><FONT face=宋体 size=3>、</FONT><FONT size=3>Windows SDK Help</FONT><FONT face=宋体 size=3>以及</FONT><FONT size=3>Borland</FONT><FONT face=宋体 size=3>公司的</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>主页链接。其中</FONT><FONT size=3>C++ Builder Help</FONT><FONT face=宋体 size=3>包括了集成开发环境的使用方法、函数的语法规则、各种元件的使用说明等等相当丰富的帮助内容,这些都是我们在学习和使用</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>过程中最常用的好帮手。除了通过菜单获取帮助之外,</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>还支持</FONT><FONT size=3>F1</FONT><FONT face=宋体 size=3>快捷键激活帮助,</FONT><FONT size=3>F1</FONT><FONT face=宋体 size=3>帮助会根据用户当前进行的操作快速定位用户所需的内容。例如,在代码编辑器中,将光标插入点放在某个函数或关键字上,按下</FONT><FONT size=3>F1</FONT><FONT face=宋体 size=3>键就可以直接查阅到该函数的帮助;再如,选中某个元件后按下</FONT><FONT size=3>F1</FONT><FONT face=宋体 size=3>键可查阅该元件的帮助;又如,当某一菜单命令被高亮度选中时,</FONT><FONT size=3>F1</FONT><FONT face=宋体 size=3>键还可查该菜单命令的功能,十分方便快捷。除此之外,互联网上还有许多优秀的</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>编程站点和论坛,在那里有很多热心的高手可以帮助大家答疑解惑,当然,心铃的信箱也总是向大家开放,愿意和大家一起分享学习的烦恼与乐趣。</P><UL><B>< align=justify><LI>工具条 <p></LI></UL></B></FONT><FONT size=3>< align=justify>CBuilder</FONT><FONT face=宋体 size=3>工具条可浮动、可停靠、可以任意调整位置,另外,通过</FONT><FONT size=3>View-&gt;Toolbars</FONT><FONT face=宋体 size=3>菜单命令还可以调出或隐藏不同的工具条,或者自定义工具条上的功能按钮。工具条按钮是菜单命令的快捷方式,标准的工具条命令包括新建对象(对应</FONT><FONT size=3>File-&gt;New</FONT><FONT face=宋体 size=3>)、打开文件(</FONT><FONT size=3>File-&gt;Open</FONT><FONT face=宋体 size=3>)、存盘(</FONT><FONT size=3>File-&gt;Save</FONT><FONT face=宋体 size=3>)、向工程中添加文件(</FONT><FONT size=3>roject-&gt;Add to Project</FONT><FONT face=宋体 size=3>)、打开帮助(</FONT><FONT size=3>Help-&gt;C++ Builder Help</FONT><FONT face=宋体 size=3>)、运行(</FONT><FONT size=3>Run-&gt;Run</FONT><FONT face=宋体 size=3>)、单步运行(</FONT><FONT size=3>Run-&gt;Step Over</FONT><FONT face=宋体 size=3>)等等。另外,打开文件工具按钮的右侧有一个下拉箭头,打开该箭头,会出现最近操作的文件(或工程)的列表,利用该列表可以快速打开最近操作的文件(或工程)。工具条中各种按钮命令都是最常用的</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>操作命令。因此,心铃建议大家熟练掌握这些工具条的使用。</P><UL><B>< align=justify><LI>元件面板 <p></LI></UL></B>< align=justify>丰富的元件库可以说是</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>中最精彩的部分了,缺省的可视化控件有</FONT><FONT face="宋体, MS Song" size=3>130</FONT><FONT face=宋体 size=3>多个,通过</FONT><FONT face="宋体, MS Song" size=3>Component</FONT><FONT face=宋体 size=3>菜单中的命令还可以很容易地添加其它控件,可以利用的资源是非常丰富的。众多的可视化元件就象橱窗里精美的货品,分门别类摆放在元件面板中,使用时,只要用鼠标选中某个元件,将其放置在窗体的合适位置上即可,使用相当方便。根据不同的功能,元件面板又分为多个元件栏,用鼠标点取某个元件栏标签,可以调出该栏的所有元件。如果窗口比较小,可能会有一些元件栏标签不可见,这时可以通过元件面板右上角的一对箭头来滚动查看。同样,有些元件栏的元件数量比较多,栏内显示不下,则该栏的左右会各有一个箭头以供浏览。另外,每个元件栏的最左边为一个鼠标箭头符号,它不是元件,只是用于取消对某一元件的选中状态。</P>< align=justify>缺省的元件栏包括</FONT><FONT face="宋体, MS Song" size=3>Standard</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>Additional</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>Win32</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>System</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>Data Access</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>Data Controls</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>ADO</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>Internet</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>QReport</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>Dialogs</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>Win3.1</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>Samples</FONT><FONT face=宋体 size=3>和</FONT><FONT face="宋体, MS Song" size=3>ActiveX</FONT><FONT face=宋体 size=3>。通过</FONT><FONT face="宋体, MS Song" size=3>Component-&gt;Configure Pallete</FONT><FONT face=宋体 size=3>命令可以添加、删除或更改元件栏的标签名称,也可以隐藏元件栏中的元件。如果要增加新的元件,有三种方式,即新建元件(</FONT><FONT face="宋体, MS Song" size=3>Component-&gt;New Component</FONT><FONT face=宋体 size=3>)、建立元件(</FONT><FONT face="宋体, MS Song" size=3>Component-&gt;Install Component</FONT><FONT face=宋体 size=3>)和引入</FONT><FONT face="宋体, MS Song" size=3>ActiveX</FONT><FONT face=宋体 size=3>控件(</FONT><FONT face="宋体, MS Song" size=3>Import ActiveX Control</FONT><FONT face=宋体 size=3>)。</P>< align=justify>在今后的编程实践中,很大一部分编程工作都是使用元件来完成所需要的功能,从某种意义上来说,使用元件的熟练程度是</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>编程者水平高低的标志之一。由于</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>中的元件数量太多,不可能在讲座全部介绍,只有靠大家自己通过查阅资料和帮助文档,至少要做到了解各个元件的大致用途。另外,在互联网上有大量现成的</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>Delphi</FONT><FONT face=宋体 size=3>及</FONT><FONT face="宋体, MS Song" size=3>ActiveX</FONT><FONT face=宋体 size=3>控件(其中有不少是免费的!),都是可以利用的元件资源,心铃建议大家注意收集并加以利用。</P>< align=justify>通过本讲的学习,相信大家已经对</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>集成开发环境的组成和基本操作命令有了一个感性的认识,希望大家多动手实践,熟悉集成开发环境各部分的功能和使用方法。</P>< align=justify> </P><B><P align=justify>名词解释:</P><P align=justify>对象仓库(</FONT><FONT face="宋体, MS Song" size=3>Object Repository</FONT><FONT face=宋体 size=3>):</B>是许多预建的项目、窗体、对象模版与向导的集合,是</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>中共享和重用对象的工具。</P><B><P align=justify>包文件(</FONT><FONT face="宋体, MS Song" size=3>Package</FONT><FONT face=宋体 size=3>):</B>包文件是</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>特有的一种动态连接库,其后缀为</FONT><FONT face="宋体, MS Song" size=3>.bpl</FONT><FONT face=宋体 size=3>。包文件的工程文件定义了源代码文件的组成与的编译选项,其后缀为</FONT><FONT face="宋体, MS Song" size=3>.bpk</FONT><FONT face=宋体 size=3>。</P><B><P align=justify>元件(</FONT><FONT face="宋体, MS Song" size=3>Component</FONT><FONT face=宋体 size=3>):</B>元件是</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>可视化对象的基本元素,有时又翻译成组件或控件,在本讲座中使用“元件”的名称,而将</FONT><FONT face="宋体, MS Song" size=3>ActiveX</FONT><FONT face=宋体 size=3>控件仍称为“控件”,从可视化对象的角度来说,</FONT><FONT face="宋体, MS Song" size=3>ActiveX</FONT><FONT face=宋体 size=3>控件也属于元件,但较为特殊,因此保留其常用称法。</P></FONT>
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

<b><FONT size=6> </FONT></b>< align=center>C++ Builder<FONT face=宋体 size=6>集成开发环境(下)</P></FONT><FONT face=宋体 size=3>< align=justify>上一讲介绍了</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>集成开发环境中的菜单、工具条和元件面板,本讲心铃将继续为大家介绍</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>集成开发环境中几个主要工具的功能和使用方法,这些工具包括代码编辑器、窗体编辑器、对象浏览器、类浏览器、消息窗口和图象编辑器。</P><UL><B>< align=justify><LI>单元与窗体
! t" ?% h/ {  r/ N</LI></UL></B>< align=justify>在介绍这几个工具之前,首先介绍一下</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>中单元与窗体的概念以及它们之间的关系。</P>< align=justify>在</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>中,</FONT><FONT face="宋体, MS Song" size=3>C++</FONT><FONT face=宋体 size=3>(或其它语言)的源代码文件被称为单元文件(</FONT><FONT face="宋体, MS Song" size=3>Unit</FONT><FONT face=宋体 size=3>)。窗体是</FONT><FONT face="宋体, MS Song" size=3>Windows</FONT><FONT face=宋体 size=3>应用程序中的基本界面,在</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>中,窗体的设计是完全可视化和所见即所得的,一个窗体总是和三个文件相关联:一个窗体文件(扩展名为</FONT><FONT face="宋体, MS Song" size=3>.dfm</FONT><FONT face=宋体 size=3>)、一个头文件(扩展名为</FONT><FONT face="宋体, MS Song" size=3>.h</FONT><FONT face=宋体 size=3>)和一个单元文件(扩展名为</FONT><FONT face="宋体, MS Song" size=3>.cpp</FONT><FONT face=宋体 size=3>),这三个文件的名字相同,但扩展名不同。</P>< align=justify>窗体文件定义了窗体的大小、形状以及其它各种属性,</FONT><FONT face="宋体, MS Song" size=3>CBuilder 5</FONT><FONT face=宋体 size=3>的窗体文件比老版本做了较大的改进,由以前的二进制格式改成了文本格式,大大增强了其可读性。为了在代码中对窗体进行操作,每个窗体又用一个</FONT><FONT face="宋体, MS Song" size=3>C++</FONT><FONT face=宋体 size=3>类来封装,窗体类的声明位于头文件中,而类的实现位于相应的单元文件中。</P>< align=justify>由此可见,</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>的每个窗体都包含了一个单元文件,但单元文件的应用范围并不仅仅局限于窗体。</P><UL><B>< align=justify><LI>代码编辑器 <p></LI></UL></B>< align=justify>代码编辑器是编写源代码的地方,除了</FONT><FONT face="宋体, MS Song" size=3>C/C++</FONT><FONT face=宋体 size=3>源文件之外,</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>代码编辑器还可以编辑</FONT><FONT face="宋体, MS Song" size=3>Delphi</FONT><FONT face=宋体 size=3>单元文件(</FONT><FONT face="宋体, MS Song" size=3>.pas</FONT><FONT face=宋体 size=3>文件)以及其它以文本格式来保存的文件。代码编辑器除了具有很强的文本编辑功能之外,还具有语法检查、查找定位、智能化代码生成等功能,它同时也是程序调试的主要场所。</P></FONT><FONT size=3>< align=justify>CBuilder</FONT><FONT face=宋体 size=3>代码编辑器(图</FONT><FONT size=3>3-1</FONT><FONT face=宋体 size=3>)由标题条、标签区、标志区、文本编辑区和状态条组成。其中标题条显示了当前正在编辑的文件名。</P>< align=justify>代码编辑器采用分页式窗口,每一个打开的源文件即为一页,每页都有一个标签,标签上显示了相应的文件名,用户可以单击标签以便在不同的文件之间切换。如果代码编辑器中打开的页过多,标签区显示不下所有的标签时,用户可以通过点击标签区右侧的一对箭头来滚动标签。</P></FONT><FONT size=3>< align=justify>CBuilder</FONT><FONT face=宋体 size=3>代码编辑器不支持分割窗口、多窗口重排等功能,但它支持通过</FONT><FONT size=3>View-&gt;New Edit Window</FONT><FONT face=宋体 size=3>菜单命令打开一个新的代码编辑器窗口,并且在任何一个代码编辑器窗口中所做的修改会立即反映到其它所有代码编辑器窗口之中。</P>< align=justify>代码编辑器的文本编辑区使用不同的颜色和字体来显示程序中的不同内容,例如,蓝色文字表示注释,</FONT><FONT face="宋体, MS Song" size=3>C/C++</FONT><FONT face=宋体 size=3>定义的关键字则采用黑色粗体字符来显示,断点用红底白字来显示,这种显示方法比较醒目,增强了程序的易读性,也有助于减少输入错误,例如我们本想输入一个关键字“</FONT><FONT face="宋体, MS Song" size=3>int</FONT><FONT face=宋体 size=3>”,却不小心敲成了“</FONT><FONT face="宋体, MS Song" size=3>itn</FONT><FONT face=宋体 size=3>”,此时文本编辑器不会将它显示成粗体,由此我们就能及时发现输入错误。</P>< align=justify>代码编辑器的配色方案还可以根据个人的喜好在</FONT><FONT face="宋体, MS Song" size=3>Editor Properties</FONT><FONT face=宋体 size=3>对话框中的</FONT><FONT face="宋体, MS Song" size=3>Colors</FONT><FONT face=宋体 size=3>属性页中进行修改,该对话框可以通过</FONT><FONT face="宋体, MS Song" size=3>Tools-&gt;Editor Option</FONT><FONT face=宋体 size=3>菜单命令或关联菜单中的</FONT><FONT face="宋体, MS Song" size=3>roperties</FONT><FONT face=宋体 size=3>命令调出来。</P>< align=justify>文本编辑区的左侧是标志区,其用途是显示各种标志,如书签、断点,以及调试过程中的下一条要执行的语句等。代码编辑器下端的状态条主要用来显示当前行号、列号等信息。</P>< align=justify>在代码编辑器中打开文件有几种方式,标准的方法是通过</FONT><FONT face="宋体, MS Song" size=3>File-&gt;Open</FONT><FONT face=宋体 size=3>菜单命令选择一个源代码文件,如果该文件是和窗体相关联的单元文件,那么</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>会首先在窗体编辑器中打开该窗体,这时可以通过</FONT><FONT face="宋体, MS Song" size=3>View-&gt;Toggle Form/Unit</FONT><FONT face=宋体 size=3>命令切换到代码编辑器中,从而打开该源文件。另一种方法是在</FONT><FONT face="宋体, MS Song" size=3>roject Manager</FONT><FONT face=宋体 size=3>或</FONT><FONT face="宋体, MS Song" size=3>View Units</FONT><FONT face=宋体 size=3>窗口中双击某个单元文件,就可以在代码编辑器中将其打开。</FONT><FONT face="宋体, MS Song" size=3>roject Manager</FONT><FONT face=宋体 size=3>或</FONT><FONT face="宋体, MS Song" size=3>View Units</FONT><FONT face=宋体 size=3>窗口中不会显示头文件,如果需要打开头文件,可以在代码编辑器中按鼠标右键弹出关联菜单,选择其中的</FONT><FONT face="宋体, MS Song" size=3>Open Source/Header Files</FONT><FONT face=宋体 size=3>命令来打开相应的头文件。除此之外,关联菜单里还有一个“</FONT><FONT face="宋体, MS Song" size=3>Open File at Cursor</FONT><FONT face=宋体 size=3>”命令,可以快速打开代码中包含的文件名对应的文件,例如,正在编辑的源代码中有一行语句如下:</P></FONT><FONT size=3>< align=justify>#include &lt;vcl.h&gt;</P></FONT><FONT face=宋体 size=3>< align=justify>那么将光标移到“</FONT><FONT face="宋体, MS Song" size=3>vcl.h</FONT><FONT face=宋体 size=3>”处并按鼠标右键,选择“</FONT><FONT face="宋体, MS Song" size=3>Open File at Cursor</FONT><FONT face=宋体 size=3>”命令,便会在代码编辑器中打开</FONT><FONT face="宋体, MS Song" size=3>vcl.h</FONT><FONT face=宋体 size=3>文件。</P>< align=justify>在代码编辑器中关闭某个文件,可以选择</FONT><FONT face="宋体, MS Song" size=3>File-&gt;Close</FONT><FONT face=宋体 size=3>命令或关联菜单中的</FONT><FONT face="宋体, MS Song" size=3>Close Page</FONT><FONT face=宋体 size=3>命令,代码编辑器标题条上的关闭按钮是用来关闭整个代码编辑器的,不能用来关闭某个编辑页,另外,当代码编辑器中的所有页被关闭后,编辑器窗口也会自动关闭。</P></FONT><FONT size=3>< align=justify>CBuilder</FONT><FONT face=宋体 size=3>代码编辑器集成了一个非常有用的功能——</FONT><FONT size=3>Code Insight</FONT><FONT face=宋体 size=3>,它相当于</FONT><FONT size=3>VC</FONT><FONT face=宋体 size=3>的</FONT><FONT size=3>IntelliSense</FONT><FONT face=宋体 size=3>功能,是一个智能化的辅助编程工具,能够根据当前编辑状态进行类成员提示、函数参数提示、自动代码补全、查看变量取值以及标识声明信息提示。</FONT><FONT size=3>Code Insight</FONT><FONT face=宋体 size=3>可以大大减轻编写源代码的工作量,并降低输入出错的概率。</P>< align=justify>图</FONT><FONT face="宋体, MS Song" size=3>3-2</FONT><FONT face=宋体 size=3>显示了</FONT><FONT face="宋体, MS Song" size=3>Code Insight</FONT><FONT face=宋体 size=3>的类成员提示功能,当正在编辑的代码需要引用一个对象的属性或成员函数时,</FONT><FONT face="宋体, MS Song" size=3>Code Insight</FONT><FONT face=宋体 size=3>会自动将对象所属类的成员信息显示在一个列表框中,且自动匹配与用户输入最接近的条目,用户只要选择列表框中的某个条目,并按下回车键后,</FONT><FONT face="宋体, MS Song" size=3>Code Insight</FONT><FONT face=宋体 size=3>就会自动用该条目来补全代码。</P>< align=justify>图</FONT><FONT face="宋体, MS Song" size=3>3-3</FONT><FONT face=宋体 size=3>显示了</FONT><FONT face="宋体, MS Song" size=3>Code Insight</FONT><FONT face=宋体 size=3>的函数参数提示功能,用户输入了函数名称之后,</FONT><FONT face="宋体, MS Song" size=3>Code Insight</FONT><FONT face=宋体 size=3>自动弹出一个提示条,显示函数各参数的类型信息,并且在输入过程中会自动检测用户输入的参数类型是否正确,不正确时该提示条将自动消失。函数参数提示功能可以减少一些常见的输入错误和编程错误,例如函数名拼写错误、变量未定义等等。</P>< align=justify>查看变量取值功能是指在调试状态下,把鼠标移动到某个变量处并停留片刻,</FONT><FONT face="宋体, MS Song" size=3>Code Insight</FONT><FONT face=宋体 size=3>就会自动弹出一个提示条,里面显示了变量的当前值,如图</FONT><FONT face="宋体, MS Song" size=3>3-4</FONT><FONT face=宋体 size=3>所示。</P>< align=justify>标识声明信息提示功能是指在编辑状态下,把鼠标移到某个标识上,</FONT><FONT face="宋体, MS Song" size=3>Code Insight</FONT><FONT face=宋体 size=3>就会自动弹出一个提示条来显示该标识声明所在的文件及位置,例如图</FONT><FONT face="宋体, MS Song" size=3>3-1</FONT><FONT face=宋体 size=3>中的提示条显示了</FONT><FONT face="宋体, MS Song" size=3>TForm</FONT><FONT face=宋体 size=3>类的声明位于</FONT><FONT face="宋体, MS Song" size=3>Unit1.cpp</FONT><FONT face=宋体 size=3>的第</FONT><FONT face="宋体, MS Song" size=3>11</FONT><FONT face=宋体 size=3>行。</P><UL><B>< align=justify><LI>窗体编辑器和对象浏览器 <p></LI></UL></B>< align=justify>窗体编辑器是</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>集成开发环境的另一个重要组成部分。传统意义上的编程的绝大部分工作都是编写源代码,但对于</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>来说,很大一部分“编程”工作都是在窗体编辑器中通过可视化的操作来设计和实现的,另外,窗体编辑器还必须与它的搭档——对象浏览器一起,才能在设计阶段发挥其强大的功能。</P>< align=justify>窗体编辑器和代码编辑器不同,它没有统一的窗口,每一个设计中的窗体就是一个窗体编辑器窗口。窗体在设计状态下可以任意改变大小和位置,可以通过窗体标题上的按钮进行最大化、最小化以及关闭操作。窗体又是元件的载体,从元件面板上选取一个元件,再用鼠标在窗体适当位置上画一个区域,就可以向窗体添加一个元件,并且元件的大小和位置也与指定的区域一致(当然,对某些运行时不可见的控件来说,其大小和位置并不重要的)。窗体上一般都有等间隔的网格点,用来对齐元件,使窗体界面显得整齐美观,网格的大小可以在</FONT><FONT face="宋体, MS Song" size=3>Enviroment Options</FONT><FONT face=宋体 size=3>对话框中调节。用户在窗体编辑器中进行的主要操作包括添加、删除元件、以及改变元件的布局等。</P><P align=justify>窗体编辑器的另一个作用是选取对象,用鼠标左键单击窗体上的某个元件或窗体本身,就可以选中单个元件或窗体对象,被选中对象的属性就显示在对象浏览器中。按住鼠标左键并拖动出一个矩形框,可以同时选中矩形框内的多个对象,此时对象浏览器将显示出这些对象相同的属性。</P><P align=justify>对象浏览器如图</FONT><FONT face="宋体, MS Song" size=3>3-5</FONT><FONT face=宋体 size=3>所示,它包括有一个对象选择列表(</FONT><FONT face="宋体, MS Song" size=3>Object Selector</FONT><FONT face=宋体 size=3>)、一个属性页(</FONT><FONT face="宋体, MS Song" size=3>Properties</FONT><FONT face=宋体 size=3>)和一个事件页(</FONT><FONT face="宋体, MS Song" size=3>Events</FONT><FONT face=宋体 size=3>)。对象浏览器在程序设计中,特别是窗体编辑阶段,是常用并且十分重要的一个工具,如果不希望它被其它窗口遮盖住,可以通过它的关联菜单中的</FONT><FONT face="宋体, MS Song" size=3>Stay on Top</FONT><FONT face=宋体 size=3>命令使其总是浮在最上层。由于</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>提供的元件数量众多,每种元件又有多种属性,即使一个熟练的程序员也很难记住所有元件的所有属性的意义和用法,而通过对象浏览器,当我们想了解某一属性(或事件)的意义和用法时,可以选中该属性(或事件),按</FONT><FONT face="宋体, MS Song" size=3>F1</FONT><FONT face=宋体 size=3>键就能够迅速获得相关的帮助信息。</P><P align=justify>对象浏览器中的内容是随着所选对象的不同而自动变化的。选择对象可以在窗体编辑器中选取,也可以在对象选择列表中选取。对象选择列表中列出了当前窗体中的所有可视化对象(包括窗体本身)。</P><P align=justify>属性页用于浏览和设置对象的属性。在</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>中,每一个对象都有自己的属性,属性页列出的部分属性是大多数可视化对象都有的,如长、宽等等,而有些属性是某一类对象特有的,如</FONT><FONT face="宋体, MS Song" size=3>TForm::BorderIcons</FONT><FONT face=宋体 size=3>属性等等。属性页中的属性通常是按属性名称的字母顺序来排列的,如果需要的话,可以切换成按类别排列,还可以将某些类别的属性隐藏起来,方法是选择属性页关联菜单中的</FONT><FONT face="宋体, MS Song" size=3>Arrange</FONT><FONT face=宋体 size=3>和</FONT><FONT face="宋体, MS Song" size=3>View</FONT><FONT face=宋体 size=3>命令。</P><P align=justify>用鼠标选中某一项属性后,它的属性值单元格会变成可修改的输入框,我们可以在其中修改属性的值。修改属性值有三种方式:第一种是直接输入,例如修改</FONT><FONT face="宋体, MS Song" size=3>TForm::Height</FONT><FONT face=宋体 size=3>属性时,属性值单元格是一个编辑框,我们可以在此直接输入高度的数值;第二种方法从下拉式列表框中选取,例如修改</FONT><FONT face="宋体, MS Song" size=3>TForm::BorderStyle</FONT><FONT face=宋体 size=3>属性时,属性值单元格是一个下拉式列表框,我们可以从中选择一个值;第三种方法是通过相应的对话框来设置属性,例如修改</FONT><FONT face="宋体, MS Song" size=3>TForm::Icon</FONT><FONT face=宋体 size=3>属性时,输入框的右侧有一个“…”号按钮,单击该按钮就能调出相应的对话框,我们可以从中选择图标文件。</P><P align=justify>有些属性的左侧有个加号,如</FONT><FONT face="宋体, MS Song" size=3>TForm::BorderIcon</FONT><FONT face=宋体 size=3>,表示该属性由多个子属性复合而成,我们可以对每个子属性进行分别设置。当对象的某个属性被修改之后,窗体编辑器会立即反映出该对象在修改之后的效果。</P><P align=justify>事件页用于创建或定位对象的事件处理函数。在</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>的编程模型中,应用程序是基于事件驱动的,事件处理函数决定了应用程序想做什么以及怎么实现。事件页中的左栏是所选对象可响应的事件,右栏是实际的事件处理函数。并不是所有的事件都有事件处理函数,空白右栏表示该事件目前还没有处理函数。利用对象浏览器,我们可以很容易地为某个事件添加处理函数,方法是双击空白的事件处理函数栏。对已有的处理函数的事件来说,双击操作可以快速定位到该函数的实现代码。在后面的讲座中心铃还要详细介绍如何创建事件处理函数,以及如何利用事件处理函数实现所需要的功能。</P><UL><B><P align=justify><LI>类浏览器 <p></LI></UL></B><P align=justify>图</FONT><FONT face="宋体, MS Song" size=3>3-6</FONT><FONT face=宋体 size=3>是类浏览器(</FONT><FONT face="宋体, MS Song" size=3>Class Explorer</FONT><FONT face=宋体 size=3>),其中显示了工程中的所有自定义类及其类成员。类是</FONT><FONT face="宋体, MS Song" size=3>C++</FONT><FONT face=宋体 size=3>中封装对象的基本数据结构,一个较大的开发项目可能会包含几百个甚至上千个类,类浏览器能够帮助开发者快速查阅这些类,通过查看类的方法和属性来了解各个类的功能,定位类的声明以及实现代码,此外,通过类浏览器还能方便地添加新的类成员函数及变量。类浏览器中的信息是实时更新的,当程序员编辑和修改程序时,类浏览器将自动检测出类的变化并刷新窗口。</P><P align=justify>除了</FONT><FONT face="宋体, MS Song" size=3>C++</FONT><FONT face=宋体 size=3>类之外,类浏览器还列出了工程中的结构、接口等数据类型和全局函数,这些数据类型、函数,以及类或结构中不同类型的属性和方法都由不同的图标来表示。</P><P align=justify>在类浏览器中双击类的名称,可以快速定位到类的声明,双击类的成员函数,可以快速定位到该成员函数的实现代码处。通过类浏览器中的关联菜单可以添加三种类型的类成员:域(</FONT><FONT face="宋体, MS Song" size=3>Field</FONT><FONT face=宋体 size=3>)、属性(</FONT><FONT face="宋体, MS Song" size=3>Property</FONT><FONT face=宋体 size=3>)和方法(</FONT><FONT face="宋体, MS Song" size=3>Method</FONT><FONT face=宋体 size=3>)。</P></FONT><FONT size=3><P align=justify>CBuilder</FONT><FONT face=宋体 size=3>集成开发环境还提供了一个功能与类浏览器相似的工具——类层次窗口(</FONT><FONT size=3>Class Hierarchy</FONT><FONT face=宋体 size=3>),它们的不同之处在于显示类成员的方式,类浏览器以树和节点的方式来显示类成员,而类层次窗口将类成员显示在一个列表中。类层次窗口可以通过选择类浏览器的关联菜单中的</FONT><FONT size=3>Class Hierarchy</FONT><FONT face=宋体 size=3>命令来激活。</P><UL><B><P align=justify><LI>消息窗口 <p></LI></UL></B><P align=justify>消息窗口(</FONT><FONT face="宋体, MS Song" size=3>Messages</FONT><FONT face=宋体 size=3>)用于显示编译时的警告或错误消息。消息窗口平时不可见,只有在编译、连接、生成可执行文件时,如果出现了警告或错误才会显示出来。在消息窗口中双击一条警告或错误消息,就可以快速定位到产生警告或错误的代码处。</P><UL><B><P align=justify><LI>图象编辑器 <p></LI></UL></B><P align=justify>图象编辑器(</FONT><FONT face="宋体, MS Song" size=3>Image Editor</FONT><FONT face=宋体 size=3>)用来创建和编辑位图(</FONT><FONT face="宋体, MS Song" size=3>.BMP</FONT><FONT face=宋体 size=3>)、图标(</FONT><FONT face="宋体, MS Song" size=3>.ICO</FONT><FONT face=宋体 size=3>)、光标(</FONT><FONT face="宋体, MS Song" size=3>.CUR</FONT><FONT face=宋体 size=3>)等一些图象资源文件,它可以脱离集成开发环境单独启动,也可以通过集成开发环境的</FONT><FONT face="宋体, MS Song" size=3>Tools-&gt;Image Editor</FONT><FONT face=宋体 size=3>命令来调用。图像编辑器的使用方法并不复杂,读者朋友不妨自已试着编辑几幅图像。</P><P align=justify> </P><P align=justify>在上一讲和本讲中,心铃为大家介绍了</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>集成开发环境的组成及其使用方法,相信大家对</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>集成开发环境已经比较熟悉了,下一讲心铃要为大家介绍</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>的编程模型。</P></FONT>
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

<b><FONT size=6> </FONT></b>< align=center>C++ Builder<FONT face=宋体 size=6>的编程模式</P></FONT><FONT face=宋体 size=3>< align=justify>我们知道,</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>是一个可视化的</FONT><FONT face="宋体, MS Song" size=3>Windows</FONT><FONT face=宋体 size=3>应用程序开发工具,并且它以</FONT><FONT face="宋体, MS Song" size=3>C/C++</FONT><FONT face=宋体 size=3>语言作为基础,对初学编程的朋友来说,这意味着在学习使用</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>的同时也要学习</FONT><FONT face="宋体, MS Song" size=3>Windows</FONT><FONT face=宋体 size=3>编程、</FONT><FONT face="宋体, MS Song" size=3>C/C++</FONT><FONT face=宋体 size=3>编程和面向对象程序设计方面的知识,除此之外,要成为一位真正的软件开发高手,还需要了解一些软件工程方面的知识。因此,心铃准备结合有关</FONT><FONT face="宋体, MS Song" size=3>Windows</FONT><FONT face=宋体 size=3>应用程序运行的特点、面向对象编程、</FONT><FONT face="宋体, MS Song" size=3>C++</FONT><FONT face=宋体 size=3>类和软件工程等方面的一些简单的理论知识来介绍</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>编程特点,这些内容虽然显得很枯燥,但相信今后大家会发现它们相当有用,因为它们可以帮助大家建立起良好的程序设计指导思想,当然,讲座中介绍的只是少量的基本概念,有志于搞软件开发的朋友可以自己通过不断的学习和实践来深入地掌握相关的知识。</P><UL></FONT><B><FONT size=3>< align=justify><LI>Windows</FONT><FONT face=宋体 size=3>系统及其应用程序的特点
1 R! N  p% G4 N4 I</LI></UL></B>< align=justify>使用</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>来编写</FONT><FONT face="宋体, MS Song" size=3>Windows</FONT><FONT face=宋体 size=3>应用程序时,</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>已经为我们隐藏了许多与</FONT><FONT face="宋体, MS Song" size=3>Windows</FONT><FONT face=宋体 size=3>操作系统内部有关的细节,使得我们无需深入了解操作系统的运行机制就可以进行编程工作,不过,多数程序员都不会只满足于这种“知其然,不知其所以然”的程序开发模式,对编程的热爱将促使他们学习更多更深入的知识。就</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>而言,如果能够了解</FONT><FONT face="宋体, MS Song" size=3>Windows</FONT><FONT face=宋体 size=3>系统及其应用程序的运行机制,将有助于我们更好地理解</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>程序的结构,也更有助于我们在已有工具的基础上开发出具有更强大功能的应用程序。</P>< align=justify>在介绍</FONT><FONT face="宋体, MS Song" size=3>Windows</FONT><FONT face=宋体 size=3>应用程序的运行机制之前,首先让我们来看看</FONT><FONT face="宋体, MS Song" size=3>MS-DOS</FONT><FONT face=宋体 size=3>应用程序的特点。</P></FONT><FONT size=3>< align=justify>MS-DOS</FONT><FONT face=宋体 size=3>与</FONT><FONT size=3>Windows</FONT><FONT face=宋体 size=3>最大的不同点在于,</FONT><FONT size=3>MS-DOS</FONT><FONT face=宋体 size=3>是一个单任务的操作系统,同一时刻只有一个应用程序在运行,该应用程序可以独占整个计算机系统的硬件和软件资源,如</FONT><FONT size=3>CPU</FONT><FONT face=宋体 size=3>、内存、屏幕、鼠标和键盘等。因此,稍微复杂一点的</FONT><FONT size=3>MS-DOS</FONT><FONT face=宋体 size=3>应用程序中,大都包括设置屏幕模式、分配内存、接管鼠标、扫描键盘等操作,并负责对系统中所发生的多数事件进行响应和处理。除此之外,</FONT><FONT size=3>MS-DOS</FONT><FONT face=宋体 size=3>应用程序的另一个特点是,从程序的启动入口点到程序运行结束退出的过程中,几乎每一步都有明确的调用关系(中断服务例程除外,这类代码的执行可以在任意时刻由中断触发),这正是单任务操作系统下应用程序的典型运行模式。</P></FONT><FONT size=3>< align=justify>Windows</FONT><FONT face=宋体 size=3>是目前</FONT><FONT size=3>C</FONT><FONT face=宋体 size=3>机上最流行的操作系统,它是一个多任务的操作系统,同一时刻允许多个应用程序并行运行,计算机的资源被</FONT><FONT size=3>Windows</FONT><FONT face=宋体 size=3>中的所有应用程序所共享,其中包括鼠标、键盘等输入设备。为了顺利实现共享,</FONT><FONT size=3>Windows</FONT><FONT face=宋体 size=3>负责接收所有的输入事件,并将这些事件转换成一条条消息后送入到相应的应用程序的消息队列中,而应用程序将从自己的消息队列中获得消息,并作出响应或进行处理,这种消息处理过程被称为“消息驱动机制”,它与</FONT><FONT size=3>MS-DOS</FONT><FONT face=宋体 size=3>程序截然不同。</P>< align=justify>“消息驱动”是理解</FONT><FONT face="宋体, MS Song" size=3>Windows</FONT><FONT face=宋体 size=3>应用程序运行机制的最重要的概念。在消息驱动下的</FONT><FONT face="宋体, MS Song" size=3>Windows</FONT><FONT face=宋体 size=3>应用程序有一类称为回调函数的执行代码,它们不是由应用程序本身调用的,而是由</FONT><FONT face="宋体, MS Song" size=3>Windows</FONT><FONT face=宋体 size=3>操作系统调用的,例如窗口的消息处理函数</FONT><FONT face="宋体, MS Song" size=3>WndProc</FONT><FONT face=宋体 size=3>,就是由操作系统在接收到属于该窗口的消息时调用的。</P></FONT><FONT size=3>< align=justify>CBuilder</FONT><FONT face=宋体 size=3>采用了在消息驱动的基础上发展出来的事件驱动编程模式,事件可以理解成消息的延伸,通常一条消息可以看作一个事件的发生,但有的消息有可能会引发几个相关的事件。在事件驱动编程模式下,事件处理函数代替了原来的消息处理函数,从而改变了传统</FONT><FONT size=3>Windows</FONT><FONT face=宋体 size=3>编程中窗口的消息处理代码都在</FONT><FONT size=3>WndProc</FONT><FONT face=宋体 size=3>中实现的模式,使得不同事件的处理函数可以相互独立开来。总的来说,事件驱动编程模式是面向对象的编程思想成功运用到</FONT><FONT size=3>Windows</FONT><FONT face=宋体 size=3>应用程序开发中的结果。</P><UL><B>< align=justify><LI>面向对象编程 <p></LI></UL></B></FONT><FONT size=3>< align=justify>CBuilder</FONT><FONT face=宋体 size=3>是面向对象的开发工具,那什么是对象(</FONT><FONT size=3>Object</FONT><FONT face=宋体 size=3>)呢?广义地说,客观世界的一切事物都是对象,在计算机软件领域中,对象是客观实体在计算机中的抽象,它是由代表客观实体的属性和行为的一个封装。具体到</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>的窗体编辑器中,对象是一个个可视化的或非可视化的元件,而在</FONT><FONT size=3>C++</FONT><FONT face=宋体 size=3>程序代码中,对象是类的一个实例(有时指向对象的指针也称为对象)。</P>< align=justify>到目前为止,人们主要使用两种方式对客观世界进行描述,一种是过程式描述,另一种是对象式描述,因此产生了过程式程序设计和面向对象程序设计两种主要的程序设计方法。过程式描述将问题分解为一系列顺序执行的过程,这种描述方式特别符合计算机本身的构造和运算模式,因此在处理计算性的操作时特别有效,根据操作系统的特点,过程式描述的应用程序比较适合单任务的</FONT><FONT face="宋体, MS Song" size=3>MS-DOS</FONT><FONT face=宋体 size=3>操作系统。</P>< align=justify>但是,客观世界的事物往往是复杂的、并发的,很难用一串连续的过程加以描述,因此产生了对象式描述。面向对象设计方法最基本的思想就是把客观世界看成一个个相对独立而又相互联系的实体,即对象。每个对象都有自己的状态和行为,能够完成一定的功能。</P>< align=justify>在面向对象的程序设计中,状态称为属性,对应</FONT><FONT face="宋体, MS Song" size=3>C++</FONT><FONT face=宋体 size=3>类的数据成员;行为称为方法,对应</FONT><FONT face="宋体, MS Song" size=3>C++</FONT><FONT face=宋体 size=3>类的成员函数。面向对象的思想就是把方法和属性结合起来,把它们看成一个有机整体,这个结合的过程被称为封装。封装把发生关联的所有属性和方法捆绑在一起,从而使对象内部有了明确的范围和清楚的外部边界。封装是面向对象理论中十分重要的概念,因为封装实现了数据隐藏,保护了对象的数据不被外界随意改变,并且封装使对象成了相对独立的功能模块,提高了软件设计的结构化和模块化程序,如果需要改变某个对象时,只要它对外的接口保持不变,系统的其它部分就可以不受影响。</P>< align=justify>面向对象的描述方式符合客观事物的本来面貌,也符合人的思维习惯,因此非常适合于开发大型应用程序和解决复杂问题,当然,这并不是说大型应用程序中不需要过程式程序设计方法,过程式程序设计方法有其特有的优点,在解决局部问题,特别是偏重计算的问题时,采用过程式程序设计方法还是特别有效的。</P>< align=justify>另外,根据单任务操作系统与多任务操作系统的不同,对象式程序设计方法特别适合于多任务操作系统,以</FONT><FONT face="宋体, MS Song" size=3>Windows</FONT><FONT face=宋体 size=3>为例,</FONT><FONT face="宋体, MS Song" size=3>Windows</FONT><FONT face=宋体 size=3>的消息驱动机制就比较适合于面向对象编程,应用程序的各对象之间可以通过消息相互作用,例如触发对象的方法。</P><UL></FONT><B><FONT size=3>< align=justify><LI>C++</FONT><FONT face=宋体 size=3>语言中的类 <p></LI></UL></B>< align=justify>前面介绍了面向对象程序设计的少量理论知识,在程序开发过程中,我们还需要使用支持面向对象的编程语言来将理论运用到实际的工作中。</FONT><FONT face="宋体, MS Song" size=3>C++</FONT><FONT face=宋体 size=3>是目前较流行的面向对象编程语言,学习使用</FONT><FONT face="宋体, MS Song" size=3>C++</FONT><FONT face=宋体 size=3>进行面向对象编程时,应该首先了解</FONT><FONT face="宋体, MS Song" size=3>C++</FONT><FONT face=宋体 size=3>中类的概念。</P>< align=justify>类是对象的一个抽象,是同类对象的总称。在</FONT><FONT face="宋体, MS Song" size=3>C++</FONT><FONT face=宋体 size=3>语言中,类又是一种特殊的数据类型,类的定义包括三个方面的内容:类标识符、类体和类成员函数的实现。</P>< align=justify>下面给出</FONT><FONT face="宋体, MS Song" size=3>C++</FONT><FONT face=宋体 size=3>中类声明的一般形式:</P></FONT><FONT size=3>< align=justify>class </FONT><FONT face=宋体 size=3>类名</FONT><FONT size=3> </FONT><FONT face=宋体 size=3>{</P><DIR></FONT><FONT size=3>< align=justify>private:</P></FONT><FONT face=宋体 size=3>< align=justify>私有的数据成员</FONT><FONT size=3><FONT face="宋体, MS Song">;</FONT></P></FONT><FONT face=宋体 size=3>< align=justify>私有的成员函数</FONT><FONT size=3><FONT face="宋体, MS Song">;</FONT></P></DIR>< align=justify>protected:</P><DIR></FONT><FONT face=宋体 size=3>< align=justify>被保护的数据成员</FONT><FONT size=3><FONT face="宋体, MS Song">;</FONT></P></FONT><FONT face=宋体 size=3>< align=justify>被保护的成员函数</FONT><FONT size=3><FONT face="宋体, MS Song">;</FONT></P></DIR>< align=justify>public:</P><DIR></FONT><FONT face=宋体 size=3>< align=justify>公共的数据成员</FONT><FONT size=3><FONT face="宋体, MS Song">;</FONT></P></FONT><FONT face=宋体 size=3><P align=justify>公共的成员函数</FONT><FONT size=3><FONT face="宋体, MS Song">;</FONT></P></DIR></FONT><FONT face=宋体 size=3><P align=justify>}</FONT><FONT size=3><FONT face="宋体, MS Song">;</FONT></P><P align=justify>class</FONT><FONT face=宋体 size=3>是</FONT><FONT size=3>C++</FONT><FONT face=宋体 size=3>的关键字,它引入了类的声明。类名称的命名应遵循方便好记的原则,匈牙利命名原则是一种目前</FONT><FONT size=3>Windows</FONT><FONT face=宋体 size=3>编程中使用得最广泛的一种命名原则,心铃建议大家尽量按照该原则来命名类标识符,以增加代码的可读性。</P><P align=justify>类声明体包含在一对大括号中,其中定义了类的数据成员和成员函数。根据外界对成员的存取权限,类的成员分为</FONT><FONT face="宋体, MS Song" size=3>3</FONT><FONT face=宋体 size=3>种类型:私有的、保护的和公共的,分别用关键字</FONT><FONT face="宋体, MS Song" size=3>private</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>protected</FONT><FONT face=宋体 size=3>和</FONT><FONT face="宋体, MS Song" size=3>public</FONT><FONT face=宋体 size=3>来表示。</P><P align=justify>除了类的声明以外,完整的类定义还需要类成员函数的实现。类成员函数实现代码的一般形式如下所示:</P><P align=justify>数据类型</FONT><FONT face="宋体, MS Song" size=3> </FONT><FONT face=宋体 size=3>类名</FONT><FONT face="宋体, MS Song" size=3>::</FONT><FONT face=宋体 size=3>成员函数名</FONT><FONT face="宋体, MS Song" size=3>(</FONT><FONT face=宋体 size=3>参数说明</FONT><FONT size=3><FONT face="宋体, MS Song">) {</FONT></P><DIR></FONT><FONT face=宋体 size=3><P align=justify>函数体</P></DIR><P align=justify>}</P><P align=justify>其中双冒号“</FONT><FONT face="宋体, MS Song" size=3>::</FONT><FONT face=宋体 size=3>”是作用域运算符,它标明类名称后面的函数是该类的成员函数,并且成员函数的作用域只在该类中才有效。</P></FONT><FONT size=3><P align=justify>C++</FONT><FONT face=宋体 size=3>类支持继承性和多态性,继承性是指通过已有的类派生出新的类,新的类(称为子类或派生类)将继承和使用原有类(称为父类或基类)的代码,并有自己新的数据成员或成员函数。多态性描述了</FONT><FONT size=3>C++</FONT><FONT face=宋体 size=3>依据程序的运行情况而产生不同动作的能力,例如,基类定义了一种成员函数,其派生出的新类也定义了名字相同的成员函数,它们的实现互不相同,应用程序在运行时能够确定什么时候调用哪个成员函数,这种现象称作多态性。</P><P align=justify>许多朋友在初学阶段都会对类和对象的联系与区别感到困惑,其实,类和对象的关系就象普通数据类型与变量的关系一样,我们定义了一个类后,在使用它之前还必须生成一个对象实例。类只是对象的抽象,程序在运行过程中操作的必须是对象的实例,而不是类,对象实例是根据类的定义来分配的一块实实在在的内存区域。程序访问对象成员的方法是在对象名后加上引用符“</FONT><FONT face="宋体, MS Song" size=3>.</FONT><FONT face=宋体 size=3>”,再引用其数据成员或成员函数,另外也可以通过指向对象的指针来访问对象,只是引用符要改用“</FONT><FONT face="宋体, MS Song" size=3>-&gt;</FONT><FONT face=宋体 size=3>”。</P><P align=justify>在</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>中,应用程序的窗体及窗体上的元件都是可视化的对象,这些对象的生成和释放通常由</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>自动生成的代码来完成,而我们在程序代码中通常使用指向这些对象的指针,即用对象指针来访问对象的方法和属性。</P><UL><B><P align=justify><LI>软件开发的要求 <p></LI></UL></B><P align=justify>无论使用何种编程工具,正规的软件开发工作总要以软件工程的有关理论作为指导。软件工程理论指出在软件开发过程中,系统分析和系统设计是关键的两个环节。</P><P align=justify>结合到面向对象程序设计中,系统分析可以分为下面五个关键步骤:需求分析、识别类和对象、定义属性和方法、识别结构、识别主题。</P><P align=justify>需求分析是要确定系统要完成什么样的功能以及确定系统的边界,明确系统边界上的接口,这时是将系统整体作为一个对象来看待。识别类和对象是指将系统的功能进一步细分,确定系统可能需要的全部对象。定义属性和方法是根据识别出来的对象,定义其属性和方法。识别结构是确定各个对象之间的关系,如继承关系、包容关系、关联关系等。识别主题是指确定能完成独立功能的子系统,描述其中各对象之间的关系。</P><P align=justify>面向对象的系统分析着重于弄清系统是什么样,有什么功能,而面向对象的系统设计着重于类的实现,解决系统如何工作的问题。一个好的系统设计应遵循以下几个基本原则:</P><OL><P align=justify><LI>高度的凝聚性 <p><P align=justify>即类和类的的继承必须具有高度的凝聚性。所谓凝聚性是指类应具有单一的用途,如果某个类具有多个用途,应将其分解为多个专用的类。</P><P align=justify></P><LI>松散的耦合 <p><P align=justify>即类与类之间的耦合应很松散。所谓耦合,是指系统的各组成部分之间的相互依赖性。象方法和类这样的要素,设计时应尽可能互相独立。如果某个类过于依赖其他类来完成其工作,那么就必然要牺牲可重用性与可移植性。</P><P align=justify></P><LI>数据隐藏 <p><P align=justify>类的数据实现细节对于别的类来说应该是不可见的。因此在设计</FONT><FONT face="宋体, MS Song" size=3>C++</FONT><FONT face=宋体 size=3>类时,应尽量避免下列情况:在一个类中有大量公用数据元素;类的实现依赖于全局变量;类中含有大量友元(其它特定类能够直接访问的成员变量)。</P><P align=justify></P><LI>尽可能重复使用现有代码 <p><P align=justify>设计类时,首先应尽可能从所用的开发环境提供的类库中选择最合适的类作为基类,可以从要设计的多个类中抽象出新基类,同样,设计函数时,应尽可能使用函数库中的函数。</P><P align=justify></P><LI>设计类时保持类接口的稳定性 <p></LI></OL><P align=justify>类接口也就是类的</FONT><FONT face="宋体, MS Song" size=3>public</FONT><FONT face=宋体 size=3>部分,对派生类来说,还包括其基类的</FONT><FONT face="宋体, MS Song" size=3>protect</FONT><FONT face=宋体 size=3>部分。类接口定义了该类怎样同外部世界交流,保持其稳定性是实现兼容性的必需要求。</P><P align=justify>以上是</FONT><FONT face="宋体, MS Song" size=3>C++</FONT><FONT face=宋体 size=3>开发面向对象系统的一般原则,在编程实践中,需要根据具体情况加以运用,对有些不太复杂的应用程序可以省去其中某些步骤。</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>作为快速应用程序开发工具,具有高度模块化和可视化的特点,即符合软件工程化的要求,又可大大简化系统分析与系统设计的工作。</P><UL></FONT><B><FONT size=3><P align=justify><LI>CBuilder</FONT><FONT face=宋体 size=3>编程的特点 <p></LI></UL></B><P align=justify>开发</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>应用程序一般需要完成两个阶段的工作。第一阶段,根据应用程序的要求,以可视化的方式设计应用程序窗口界面,此阶段不需要编写任何编程代码,只需要创建应用程序窗体,设置窗体的属性参数,在应用程序窗体中放置可视化或非可视化的元件并设置元件的属性参数。第二阶段,根据应用程序功能的要求,使窗体及其包含的元件对某些特定事件进行响应,事件响应处理函数可通过对象监视器的事件页进行添加,函数体的代码则需要手工编写。</P></FONT><FONT size=3><P align=justify>CBuilder</FONT><FONT face=宋体 size=3>用来设计和实现应用程序的基本单元是元件,元件是一个具有特定功能的软件模块,每个元件都对应一个</FONT><FONT size=3>C++</FONT><FONT face=宋体 size=3>封装类,最常用的元件有</FONT><FONT size=3>Application</FONT><FONT face=宋体 size=3>元件、窗体和放置在窗体中的各种元件,如按钮、编辑控件、列表控件、对话框和菜单等。</P><P align=justify>在运行时,</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>应用程序首先会创建一个</FONT><FONT face="宋体, MS Song" size=3>Application</FONT><FONT face=宋体 size=3>对象,</FONT><FONT face="宋体, MS Song" size=3>Application</FONT><FONT face=宋体 size=3>对象负责创建窗体和从操作系统消息队列中接收消息,并将其发送到相应的窗体中。窗体对象一般包含了多个可视化或不可视化的元件,它从</FONT><FONT face="宋体, MS Song" size=3>Application</FONT><FONT face=宋体 size=3>对象接收到消息后,由窗体根据消息类型确定由哪一个元件对象或是由窗体本身对其进行处理,并将此消息发送到相应的对象,后者负责完成具体的功能。</P><P align=justify> </P><P align=justify>本讲心铃简要地介绍了一些关于</FONT><FONT face="宋体, MS Song" size=3>Windows</FONT><FONT face=宋体 size=3>应用程序的特点、面向对象的编程原理、</FONT><FONT face="宋体, MS Song" size=3>C++</FONT><FONT face=宋体 size=3>语言的特点和软件工程等方面的基础知识,它们构成了</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>编程的理论基础,估计不少朋友可能会感到很不好理解,这没有关系,因为这些知识不是短短的讲座所能涵盖,也不是一朝一夕就能学会的,需要朋友们下一番苦工作才能真正理解和掌握。从下一讲开始,我们就要实际动手编写一个应用程序了,下星期再见吧。</P></FONT>
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

<b><FONT face=宋体 size=6> </FONT></b>< align=center>设计一个<FONT face="宋体, MS Song" size=6>MP3</FONT><FONT face=宋体 size=6>收藏程序</P></FONT><FONT face=宋体 size=3>< align=justify>从这一讲开始,我们要进入真正的程序设计阶段了。今天为大家介绍的是如何创建一个工程,以及工程设置的有关问题。</P><B>< align=justify>·确定应用程序的功能</P></B>< align=justify>在动手编程之前,首先应该弄清楚程序所需要完成的功能。在这里,心铃要和大家一起编制一个</FONT><FONT face="宋体, MS Song" size=3>MP3</FONT><FONT face=宋体 size=3>收藏程序,它可以用来搜集整理我们喜爱的</FONT><FONT face="宋体, MS Song" size=3>MP3</FONT><FONT face=宋体 size=3>音乐。读者朋友们中一定有不少是</FONT><FONT face="宋体, MS Song" size=3>MP3</FONT><FONT face=宋体 size=3>发烧友吧,心铃也不例外,平时工作的时候,心铃最喜欢一边放着</FONT><FONT face="宋体, MS Song" size=3>MP3</FONT><FONT face=宋体 size=3>,一边随着音乐的旋律敲击着键盘,灵感来时,还要哼上两句(经常跑调,遭遇不少抗议),真是其乐无穷。除了喜欢听,心铃还经常从网上搜集各种好听的</FONT><FONT face="宋体, MS Song" size=3>MP3</FONT><FONT face=宋体 size=3>,可是数量多了,有时想找一首歌却很麻烦,就产生了编写一个程序来分门别类地管理这些</FONT><FONT face="宋体, MS Song" size=3>MP3</FONT><FONT face=宋体 size=3>音乐的念头。这个程序应该能够记录</FONT><FONT face="宋体, MS Song" size=3>MP3</FONT><FONT face=宋体 size=3>音乐的文件路径、歌曲名称和歌手名称,能够按照这几种条件查找所需要的文件,能够方便地增加、删除和修改</FONT><FONT face="宋体, MS Song" size=3>MP3</FONT><FONT face=宋体 size=3>记录,并且具有</FONT><FONT face="宋体, MS Song" size=3>MP3</FONT><FONT face=宋体 size=3>播放功能。</P><B>< align=justify>·确定核心数据结构</P></B>< align=justify>程序功能清楚了,接下来要考虑具体的实现细节。首先确定程序中记录的数据结构。根据前面分析的程序功能,我们认为,对收藏的</FONT><FONT face="宋体, MS Song" size=3>MP3</FONT><FONT face=宋体 size=3>文件,我们主要关心的是它的文件路径、歌曲名称和歌手名称这三类信息,因此,我们用一个类</FONT><FONT face="宋体, MS Song" size=3>TMP3</FONT><FONT face=宋体 size=3>(根据</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>中的惯例,类名称的第一个字母用</FONT><FONT face="宋体, MS Song" size=3>T</FONT><FONT face=宋体 size=3>来表示这是一个类)来封装该记录:</P></FONT><FONT size=3>< align=justify>class TMP3 {</P>< align=justify>public:</P><DIR>< align=justify>AnsiString PathName;</P>< align=justify>AnsiString SongName;</P>< align=justify>AnsiString SingerName;</P></DIR></FONT><FONT face=宋体 size=3>< align=justify>}</FONT><FONT size=3><FONT face="宋体, MS Song">;</FONT></P>< align=justify>TMP3</FONT><FONT face=宋体 size=3>类中定义了</FONT><FONT size=3>3</FONT><FONT face=宋体 size=3>个</FONT><FONT size=3>AnsiString</FONT><FONT face=宋体 size=3>类型的数据成员变量,且</FONT><FONT size=3>3</FONT><FONT face=宋体 size=3>个数据成员都为公共型的成员,这虽然不太符合数据隐藏的设计原则,但方便了外界的访问,对于目前这个功能本来就不是特别复杂的程序来说是比较适用的。</FONT><FONT size=3>AnsiString</FONT><FONT face=宋体 size=3>是</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>中的字符串类,该类提供了字符串赋值、字符串相加、字符串截断、字符串比较、格式化字符串等功能,是</FONT><FONT size=3>VCL</FONT><FONT face=宋体 size=3>库函数中常用的数据类型。</FONT><FONT size=3>AnsiString</FONT><FONT face=宋体 size=3>类对字符串操作非常方便,在后面的程序代码部分会通过实际的例子介绍它的使用。</P><B>< align=justify>·创建工程</P></B>< align=justify>接下来,我们要通过一个具体的工程将上述的程序设计思想付诸实现。工程(</FONT><FONT face="宋体, MS Song" size=3>roject</FONT><FONT face=宋体 size=3>)是与一个应用程序有关的所有文件的有机组合。</FONT><FONT face="宋体, MS Song" size=3>CBuilder IDE</FONT><FONT face=宋体 size=3>中可以同时打开多个工程(即工程项目组</FONT><FONT face="宋体, MS Song" size=3>roject Group</FONT><FONT face=宋体 size=3>),但其中只有一个是活动工程,即同一时刻只有一个工程可以编译连接和调试运行。</P>< align=justify>创建工程的方法有很多种,最简单的方法是通过</FONT><FONT face="宋体, MS Song" size=3>File|New Application</FONT><FONT face=宋体 size=3>菜单命令,创建包含一个空白窗体的工程,这也是本例子程序中所采用的工程类型。除此之外,</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>还提供了其他一些工程模板和向导,可以用于定制某些特殊功能的工程。启动这些工程模板或向导的方法是通过</FONT><FONT face="宋体, MS Song" size=3>File|New</FONT><FONT face=宋体 size=3>命令,调出“</FONT><FONT face="宋体, MS Song" size=3>New Items</FONT><FONT face=宋体 size=3>”对话框,该对话框中有专门的工程模板向导(</FONT><FONT face="宋体, MS Song" size=3>rojects</FONT><FONT face=宋体 size=3>)页,其中包括单文档应用程序、多文档应用程序、应用程序向导等,除此之外,新对象(</FONT><FONT face="宋体, MS Song" size=3>New</FONT><FONT face=宋体 size=3>)页中还有控制台程序向导、</FONT><FONT face="宋体, MS Song" size=3>DLL</FONT><FONT face=宋体 size=3>向导等工程向导。用户可以根据需要选择其中合适的工程模板或向导。</P>< align=justify>通过</FONT><FONT face="宋体, MS Song" size=3>File|New Application</FONT><FONT face=宋体 size=3>菜单命令创建的新工程名称缺省为</FONT><FONT face="宋体, MS Song" size=3>roject1</FONT><FONT face=宋体 size=3>,生成文件的缺省路径为“</FONT><FONT face="宋体, MS Song" size=3>CBuilder5\Projects\</FONT><FONT face=宋体 size=3>”目录,为了便于管理,我们要将其保存到指定的目录下,并为新工程起一个好记的名称。保存工程的方法是通过</FONT><FONT face="宋体, MS Song" size=3>File|Save Project As</FONT><FONT face=宋体 size=3>命令或工具栏上的“</FONT><FONT face="宋体, MS Song" size=3>Save All</FONT><FONT face=宋体 size=3>”工具按钮,这时会首先弹出“</FONT><FONT face="宋体, MS Song" size=3>Save Unit1 As</FONT><FONT face=宋体 size=3>”对话框,</FONT><FONT face="宋体, MS Song" size=3>Unit1</FONT><FONT face=宋体 size=3>是新工程中主窗体对应的源代码文件(有关单元与窗体的关系,可以参考第三讲中的相关论述),在这个对话框中我们指定该单元的保存路径和文件名为</FONT><FONT face="宋体, MS Song" size=3>C:\MP3Collect\MainForm.cpp</FONT><FONT face=宋体 size=3>。这时我们可以看到,</FONT><FONT face="宋体, MS Song" size=3>C:\MP3Collect\</FONT><FONT face=宋体 size=3>目录下除了</FONT><FONT face="宋体, MS Song" size=3>MainForm.cpp</FONT><FONT face=宋体 size=3>之外,同时也保存了该窗体的窗体文件</FONT><FONT face="宋体, MS Song" size=3>MainForm.dfm</FONT><FONT face=宋体 size=3>和头文件</FONT><FONT face="宋体, MS Song" size=3>MainForm.h</FONT><FONT face=宋体 size=3>。保存了窗体后,接着会弹出“</FONT><FONT face="宋体, MS Song" size=3>Save Project1 As</FONT><FONT face=宋体 size=3>”对话框,在这里我们指定工程的保存路径和文件名为</FONT><FONT face="宋体, MS Song" size=3>C:\MP3Collect\MP3Collect.bpr</FONT><FONT face=宋体 size=3>。保存了工程文件后,我们可以看到</FONT><FONT face="宋体, MS Song" size=3>C:\MP3Collect\</FONT><FONT face=宋体 size=3>目录下又新增加了</FONT><FONT face="宋体, MS Song" size=3>MP3Collect.bpr</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>MP3Collect.cpp</FONT><FONT face=宋体 size=3>和</FONT><FONT face="宋体, MS Song" size=3>MP3Collect.res</FONT><FONT face=宋体 size=3>三个文件,</FONT><FONT face="宋体, MS Song" size=3>CBuilder IDE</FONT><FONT face=宋体 size=3>中显示的工程名称也从</FONT><FONT face="宋体, MS Song" size=3>roject1</FONT><FONT face=宋体 size=3>变为</FONT><FONT face="宋体, MS Song" size=3>MP3Collect</FONT><FONT face=宋体 size=3>。</P><B>< align=justify>·工程编译连接与运行</P></B>< align=justify>到现在为此,一个空白的工程框架就已经搭好了,我们可以试运行一下,看看效果。</P>< align=justify>运行程序之前,还需要对工程进行编译连接,生成可执行文件。选择</FONT><FONT face="宋体, MS Song" size=3>roject|Make MP3Collect</FONT><FONT face=宋体 size=3>菜单命令,启动</FONT><FONT face="宋体, MS Song" size=3>IDE</FONT><FONT face=宋体 size=3>中的编译连接工具,这时会弹出“</FONT><FONT face="宋体, MS Song" size=3>Background Compiling</FONT><FONT face=宋体 size=3>”对话框显示编译连接的进度,连接完成后对话框自动消失。由于我们还未对</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>自动生成的程序框架作任何修改,应该不会有任何错误或警告,在</FONT><FONT face="宋体, MS Song" size=3>C:\MP3Collect\</FONT><FONT face=宋体 size=3>目录下成功生成</FONT><FONT face="宋体, MS Song" size=3>MP3Collect.exe</FONT><FONT face=宋体 size=3>。即使是第一次编译连接,我们还是可以感受到,</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>的编译连接速度还是相当快的,以后的</FONT><FONT face="宋体, MS Song" size=3>Make</FONT><FONT face=宋体 size=3>操作还会更快,因为以后的编译连接会自动检查工程中哪些部分进行了修改,从而只对改变了的部分进行处理。除了</FONT><FONT face="宋体, MS Song" size=3>Make</FONT><FONT face=宋体 size=3>命令以外,</FONT><FONT face="宋体, MS Song" size=3>roject|Build MP3Collect</FONT><FONT face=宋体 size=3>命令同样可以编译连接工程,只不过该命令总是处理所有的文件,所以比较慢。</P>< align=justify>生成了可执行文件,便可以运行该程序。在</FONT><FONT face="宋体, MS Song" size=3>IDE</FONT><FONT face=宋体 size=3>中按下</FONT><FONT face="宋体, MS Song" size=3>F9</FONT><FONT face=宋体 size=3>热键(对应</FONT><FONT face="宋体, MS Song" size=3>Run|Run</FONT><FONT face=宋体 size=3>菜单命令或工具栏中的“</FONT><FONT face="Courier New" size=3>►</FONT><FONT face=宋体 size=3>”按钮),便可在调试状态下开始运行该程序了(如果运行工程之前,程序没有编译连接好,“</FONT><FONT face="宋体, MS Song" size=3>Run</FONT><FONT face=宋体 size=3>”命令会自动启动“</FONT><FONT face="宋体, MS Song" size=3>Make</FONT><FONT face=宋体 size=3>”操作)。运行中的程序和我们在窗体编辑状态下看到的一样,是一个空白的窗体,今后我们就要在这个空白的窗体上添加需要的功能。根据心铃的经验,每添加一项功能,最好马上试运行一下看看效果如何,因为尽管</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>是所见即所得的编程工具,可是程序的许多功能还是只有在运行时的动态行为中体现,这样做的另一个好处是可以早点发现和排除错误。因此,修改程序、保存工程、编译运行,是我们在编程中需要不断重复的三部曲。</P><B>< align=justify>·工程设置</P></B>< align=justify>工程设置可以修改工程的属性和编译选项。通过</FONT><FONT face="宋体, MS Song" size=3>Project|Options</FONT><FONT face=宋体 size=3>菜单,或</FONT><FONT face="宋体, MS Song" size=3>Ctrl+Shift+F11</FONT><FONT face=宋体 size=3>快捷键,便可启动工程设置对话框,如图</FONT><FONT face="宋体, MS Song" size=3>5-1</FONT><FONT face=宋体 size=3>所示。工程设置对话框由多个选项页组成,每个选项页代表工程某一方面的设置选项。选项页的下方有三个按钮,“</FONT><FONT face="宋体, MS Song" size=3>OK</FONT><FONT face=宋体 size=3>”表示确定,“</FONT><FONT face="宋体, MS Song" size=3>Cancel</FONT><FONT face=宋体 size=3>”表示取消,“</FONT><FONT face="宋体, MS Song" size=3>Help</FONT><FONT face=宋体 size=3>”可以获取当前选项页中选项的说明。选项页的下方还有一个</FONT><FONT face="宋体, MS Song" size=3>Default</FONT><FONT face=宋体 size=3>复选框,选中该复选框,表示改变今后新工程的缺省设置,取消该复选框,则所作的改变只对当前活动工程有效。不同类型的工程,其选项页的数量的内容会有所不同,下面我们以</FONT><FONT face="宋体, MS Song" size=3>MP3Collect</FONT><FONT face=宋体 size=3>应用程序工程为例,分别介绍一下各个工程设置选项页的功能和含义。</P></FONT><B><FONT size=3><P align=justify>Forms</B></FONT><FONT face=宋体 size=3>选项页决定工程中的哪些窗体对象是自动创建的,以及哪一个窗体是程序的主窗体。第四讲中讲过,</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>应用程序中的窗体的生成和释放由</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>生成的代码自动完成的,其实这只是缺省情况下如此。在</FONT><FONT size=3>Forms</FONT><FONT face=宋体 size=3>选项页中列出了自动创建的窗体和非自动创建的窗体,缺省情况下,工程中所有窗体都是自动创建的,有时为了节约内存,我们可以指定某些窗体为非自动创建(反之亦然),使用非自动创建的窗体之前,需要通过代码创建其对象实例。本选项页中还可以指定哪一个窗体为应用程序的主窗体,主窗体总是自动创建的。</P></FONT><B><FONT size=3><P align=justify>Application</B></FONT><FONT face=宋体 size=3>选项页可以设置应用程序的标题、帮助文件的路径和文件名、应用程序的图标文件名,以及编译连接输出的文件后缀。标题和图标是指程序最小化后显示在系统工具栏中文字和图标。对于应用程序来说,输出的文件后缀通常为</FONT><FONT size=3>exe</FONT><FONT face=宋体 size=3>。</P></FONT><B><FONT size=3><P align=justify>Compiler</B></FONT><FONT face=宋体 size=3>选项页用于设置编译器的一般选项。如编译器优化选项、警告消息选项、调试信息选项、预编译选项等。编译选项内容比较多,好在</FONT><FONT size=3>CBuilder 5</FONT><FONT face=宋体 size=3>根据调试程序和发布程序的不同要求,预定义了两种编译设置:</FONT><FONT size=3>Full Debug</FONT><FONT face=宋体 size=3>和</FONT><FONT size=3>Release</FONT><FONT face=宋体 size=3>,我们一般只需要用到这两种设置就可以了。</P></FONT><B><FONT size=3><P align=justify>Advanced Compiler</B></FONT><FONT face=宋体 size=3>设置编译器的高级选项。其中,指令集(</FONT><FONT size=3>Instruction set</FONT><FONT face=宋体 size=3>)选项组可以选择执行代码的指令集,一般用缺省值</FONT><FONT size=3>80386</FONT><FONT face=宋体 size=3>即可。数据对齐(</FONT><FONT size=3>Data alignment</FONT><FONT face=宋体 size=3>)选项组可以设置数据在内存中的对齐方式,缺省值为</FONT><FONT size=3>4</FONT><FONT face=宋体 size=3>字节。函数调用规则(</FONT><FONT size=3>Calling convention</FONT><FONT face=宋体 size=3>)可以设置函数调用时参数的传递方式,缺省方式是</FONT><FONT size=3>C</FONT><FONT face=宋体 size=3>方式(有兴趣的朋友可以了解一下所列的几种调用规则的不同之处)。寄存器变量(</FONT><FONT size=3>Register variables</FONT><FONT face=宋体 size=3>)设置程序中是否使用寄存器变量。输出(</FONT><FONT size=3>Output</FONT><FONT face=宋体 size=3>)选项组设置</FONT><FONT size=3>.Obj</FONT><FONT face=宋体 size=3>文件中是否包含头文件的路径信息,以及函数名是否添加下划线作为前缀。浮点(</FONT><FONT size=3>Floating point</FONT><FONT face=宋体 size=3>)选项设置对浮点运算的优化开关,例如,其中的“</FONT><FONT size=3>Correct Pentium FDIV flaw</FONT><FONT face=宋体 size=3>”开关可以改正早期奔腾芯片中的</FONT><FONT size=3>FDIV</FONT><FONT face=宋体 size=3>浮点错误。语言兼容性(</FONT><FONT size=3>Language compliance</FONT><FONT face=宋体 size=3>)用来设置程序代码中与那种</FONT><FONT size=3>C++</FONT><FONT face=宋体 size=3>语言版本兼容,缺省值为</FONT><FONT size=3>Borland</FONT><FONT face=宋体 size=3>。代码(</FONT><FONT size=3>Source</FONT><FONT face=宋体 size=3>)选项可以设置代码中是否支持注释嵌套,是否支持</FONT><FONT size=3>MFC</FONT><FONT face=宋体 size=3>代码风格,还可以设置代码中标识符(变量名称或宏名称等都属于标识符)的最大有效长度,</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>支持的最大标识符长度为</FONT><FONT size=3>250</FONT><FONT face=宋体 size=3>。</P></FONT><B><FONT size=3><P align=justify>C++</B></FONT><FONT face=宋体 size=3>选项页是与</FONT><FONT size=3>C++</FONT><FONT face=宋体 size=3>语言有关的编译选项。其中成员指针(</FONT><FONT size=3>Member pointers</FONT><FONT face=宋体 size=3>)选项组可以设置指针引用类成员及其基类成员时的限制,缺省设置为无限制(</FONT><FONT size=3>All Cases</FONT><FONT face=宋体 size=3>)。兼容(</FONT><FONT size=3>Compatibility</FONT><FONT face=宋体 size=3>)选项用于与老版本的</FONT><FONT size=3>ANSI C++</FONT><FONT face=宋体 size=3>语言保持兼容。通用(</FONT><FONT size=3>General</FONT><FONT face=宋体 size=3>)选项用于与</FONT><FONT size=3>MFC</FONT><FONT face=宋体 size=3>类库中长度为</FONT><FONT size=3>0</FONT><FONT face=宋体 size=3>的基类兼容。</FONT><FONT size=3>Templates</FONT><FONT face=宋体 size=3>选项决定如何实例化</FONT><FONT size=3>Templates</FONT><FONT face=宋体 size=3>。异常处理(</FONT><FONT size=3>Exception handling</FONT><FONT face=宋体 size=3>)是有关运行时异常的处理方式。虚拟表(</FONT><FONT size=3>Virtula table</FONT><FONT face=宋体 size=3>)可用于优化虚拟函数表的大小。本选项页中的选项涉及到一些</FONT><FONT size=3>C++</FONT><FONT face=宋体 size=3>术语,可能令大家感到比较陌生,不过不要紧,因为我们目前还很难得用到它,以后需要的时候只要知道在这里进行设置就可以了。</P></FONT><B><FONT size=3><P align=justify>Linker</B></FONT><FONT face=宋体 size=3>选项页设置连接选项。连接和编译一样,是生成程序的必须步骤,其选项的内容也很丰富。心铃在这里只介绍其中几个选项的意义,想了解更多的内容可以参考联机帮助。生成调试信息(</FONT><FONT size=3>Create debug information</FONT><FONT face=宋体 size=3>)是指在可执行文件中加入调试信息。使用动态</FONT><FONT size=3>RTL</FONT><FONT face=宋体 size=3>(</FONT><FONT size=3>Use dynamic RTL</FONT><FONT face=宋体 size=3>)是指以动态连接的方式使用</FONT><FONT size=3>RTL.DLL</FONT><FONT face=宋体 size=3>,这种方式可以使执行文件较小,但在发布程序时必须同时发布该</FONT><FONT size=3>DLL</FONT><FONT face=宋体 size=3>。使用调试版本的</FONT><FONT size=3>VCL</FONT><FONT face=宋体 size=3>库文件(</FONT><FONT size=3>Use debug libraries</FONT><FONT face=宋体 size=3>)会使生成的文件较大,但允许调试时跟踪到</FONT><FONT size=3>VCL</FONT><FONT face=宋体 size=3>库的源程序中,心铃建议有对编程较有兴趣的朋友可以打开该选项,深入了解</FONT><FONT size=3>VCL</FONT><FONT face=宋体 size=3>库的实现。不生成连接状态文件(</FONT><FONT size=3>Don't generate state files</FONT><FONT face=宋体 size=3>)令每次连接时间同样长,一般不打开该选项。最大连接错误(</FONT><FONT size=3>Max errors</FONT><FONT face=宋体 size=3>)允许的最大错误数从</FONT><FONT size=3>0</FONT><FONT face=宋体 size=3>到</FONT><FONT size=3>255</FONT><FONT face=宋体 size=3>,超过最大错误时连接操作会自动停止。连接警告可以打开所有警告,也可以屏蔽部分警告。</P></FONT><B><FONT size=3><P align=justify>Advanced Linker</B></FONT><FONT face=宋体 size=3>设置高级连接选项。其中大小写敏感(</FONT><FONT size=3>Case-insensitive link</FONT><FONT face=宋体 size=3>)是指连接时对全局或外部的符号(变量、函数名等)大小写敏感,因为</FONT><FONT size=3>C/C++</FONT><FONT face=宋体 size=3>是大小写敏感的语言,所以一般应打开该选项。其它几个选项编程中较少涉及,就不细述了。</P></FONT><B><FONT size=3><P align=justify>Version Info</B></FONT><FONT face=宋体 size=3>选项页可以让生成的执行文件中包含版本信息,并设置版本信息的内容。查看</FONT><FONT size=3>EXE</FONT><FONT face=宋体 size=3>文件的版本信息,可以在资源管理器中用右键单击该文件,并在关联菜单中选择“属性”,如果该</FONT><FONT size=3>EXE</FONT><FONT face=宋体 size=3>文件包含版本信息,则属性对话框中会出现“版本”属性页。</P></FONT><B><FONT size=3><P align=justify>Package</B></FONT><FONT face=宋体 size=3>选项页如图</FONT><FONT size=3>5-2</FONT><FONT face=宋体 size=3>所示,它可以设置工程的设计时有效的包以及运行时所需要的包。第二讲中介绍过,包是</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>特有的动态连接库,后缀是</FONT><FONT size=3>.bpl</FONT><FONT face=宋体 size=3>。</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>的元件大部分都位于包文件中,所以选择设计时包文件,可以决定设计时能够使用的元件种类。如图</FONT><FONT size=3>2</FONT><FONT face=宋体 size=3>所示,选项页的上部用于选择设计时有效的包。其中列表框列出了所有</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>中已安装的包,每个包的右侧都有一个复选框,显示该包是否为设计时有效。列表框的下方显示当前选中包的路径名。“</FONT><FONT size=3>Add</FONT><FONT face=宋体 size=3>”、“</FONT><FONT size=3>Remove</FONT><FONT face=宋体 size=3>”按钮可以安装和卸载</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>中的包,“</FONT><FONT size=3>Edit</FONT><FONT face=宋体 size=3>”按钮可以编辑包的源文件,“</FONT><FONT size=3>Components</FONT><FONT face=宋体 size=3>”按钮可显示当前选中包中的元件。选项页的下半部分设置运行时包,运行时包是指运行时以动态连接方式调用的包文件,这种方式生成的应用程序较小,但程序发布时必须同运行时包文件一起发布。我们可以通过“</FONT><FONT size=3>Build with runtime packages</FONT><FONT face=宋体 size=3>”复选框来确定是否使用运行时包文件,如果使用,则所需的包文件显示在一个编辑框中,文件之间用分号隔开。</P></FONT><B><FONT size=3><P align=justify>Directories/Conditionals</B></FONT><FONT face=宋体 size=3>选项页设置路径和条件参数。路径包括搜索路径和输出路径,搜索路径是指</FONT><FONT size=3>CBuilder IDE</FONT><FONT face=宋体 size=3>需要某一类文件时,除了当前目录之外的搜索目录,多个目录之间可用分号隔开。以头文件路径为例,缺省设置为“</FONT><FONT size=3>$(BCB)</FONT><FONT face=宋体 size=3>\</FONT><FONT size=3>Projects\;$(BCB)\include;$(BCB)\include\vcl</FONT><FONT face=宋体 size=3>”,其中</FONT><FONT size=3>$(BCB)</FONT><FONT face=宋体 size=3>表示</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>的安装目录,它表示除了当前工作目录之外,</FONT><FONT size=3>IDE</FONT><FONT face=宋体 size=3>可以到上述三个目录下搜索相关头文件。可设置的路径有头文件、库文件、调试库的源文件、</FONT><FONT size=3>OBJ</FONT><FONT face=宋体 size=3>输出路径、最终输出文件(指最终生成的</FONT><FONT size=3>EXE</FONT><FONT face=宋体 size=3>、</FONT><FONT size=3>DLL</FONT><FONT face=宋体 size=3>等)路径、</FONT><FONT size=3>BPI/LIB</FONT><FONT face=宋体 size=3>库输出路径,后三个输出路径的缺省值都为空,表示输出到当前工作目录。条件(</FONT><FONT size=3>Conditionals</FONT><FONT face=宋体 size=3>)参数设置编译符号,如“</FONT><FONT size=3>_Debug</FONT><FONT face=宋体 size=3>”等。多个条件参数之间可以用分号分隔。别名(</FONT><FONT size=3>Alias</FONT><FONT face=宋体 size=3>)可以设置单元文件别名。</P></FONT><B><FONT size=3><P align=justify>CodeGuard</B></FONT><FONT face=宋体 size=3>选项页可以启用</FONT><FONT size=3>CodeGuard</FONT><FONT face=宋体 size=3>功能,</FONT><FONT size=3>CodeGuard</FONT><FONT face=宋体 size=3>是</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>内集成的运行时态排错工具,它可以在运行时检查全局变量、堆栈、指针和对象等操作的合法性。</P><P align=justify>除了上述几个较为常用的选项页以外,应用程序工程设置对话框还有</FONT><FONT face="宋体, MS Song" size=3>Pascal</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>Tasm</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>CORBA</FONT><FONT face=宋体 size=3>几个选项页,分别是与</FONT><FONT face="宋体, MS Song" size=3>Pascal</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>Tasm</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>CORBA</FONT><FONT face=宋体 size=3>语言有关的编译选项,由于本讲座以</FONT><FONT face="宋体, MS Song" size=3>C++</FONT><FONT face=宋体 size=3>语言为主,这些选项就不详细介绍了。</P><P align=justify> </P><P align=justify>本讲中心铃为大家介绍了如何根据需求分析,创建一个</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>工程,以及如何设置工程的各种参数,下一讲心铃还要继续围绕该工程来介绍它的文件组成。</P></FONT>
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

<b><FONT face=宋体 size=6> </FONT></b>< align=center>工程框架分析</P><FONT face=宋体 size=3>< align=justify>在上一讲中,我们创建了一个</FONT><FONT face="宋体, MS Song" size=3>MP3Collect</FONT><FONT face=宋体 size=3>工程,并学习了怎样用工程设置对话框来设置工程的各种属性。本讲我们将要进一步深入到工程的内部去了解其结构。</P><UL><B>< align=justify><LI>工程的文件组成 & q9 K2 i, |! y; |/ I
</LI></UL></B>< align=justify>第五讲曾经提到,新创建的工程</FONT><FONT face="宋体, MS Song" size=3>MP3Collect</FONT><FONT face=宋体 size=3>在工作目录下有一系列文件,它们分别是:</P>< align=justify>工程文件:</FONT><FONT size=3><FONT face="宋体, MS Song">MP3Collect.bpr</FONT></P></FONT><FONT face=宋体 size=3>< align=justify>单元文件:</FONT><FONT face="宋体, MS Song" size=3>MP3Collect.cpp</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>MainForm.cpp</FONT><FONT face=宋体 size=3>及其头文件</FONT><FONT size=3><FONT face="宋体, MS Song">MainForm.h</FONT></P></FONT><FONT face=宋体 size=3>< align=justify>窗体文件:</FONT><FONT face="宋体, MS Song" size=3>MainForm.dfm</FONT><FONT face=宋体 size=3>。</P>< align=justify>资源文件:</FONT><FONT size=3><FONT face="宋体, MS Song">MP3Collect.res</FONT></P></FONT><FONT face=宋体 size=3>< align=justify>这些文件的有机组合构成了工程。下面心铃将逐一介绍各个文件的格式和内容。</P><UL><B>< align=justify><LI>工程文件——</FONT><FONT size=3><FONT face="宋体, MS Song">MP3Collect.bpr </FONT><p></LI></UL></B>< align=justify>MP3Collect.bpr</FONT><FONT face=宋体 size=3>是工程的</FONT><FONT size=3>Makefile</FONT><FONT face=宋体 size=3>文件,是一个文本文件,它以</FONT><FONT size=3>XML</FONT><FONT face=宋体 size=3>标记语言的格式描述了工程的编译连接选项等各项设置。通常情况都不要手工修改此文件,而是通过工程设置对话框来修改。</P><UL><B>< align=justify><LI>应用程序入口单元——</FONT><FONT size=3><FONT face="宋体, MS Song">MP3Collect.cpp </FONT><p></LI></UL></B>< align=justify>MP3Collect.cpp</FONT><FONT face=宋体 size=3>文件中包含了</FONT><FONT size=3>Windows</FONT><FONT face=宋体 size=3>应用程序的入口</FONT><FONT size=3>WinMain()</FONT><FONT face=宋体 size=3>函数,同时指明了应用程序包含的其它源程序文件。下面我们来逐行分析</FONT><FONT size=3>MP3Collect.cpp</FONT><FONT face=宋体 size=3>的源代码(为了方便说明,心铃在每一行代码前都添加了行号,实际的代码中并没有这些行号):</P></FONT><FONT face="Courier New" size=3>< align=justify>1</FONT><FONT face=宋体 size=3>.</FONT><FONT face="Courier New" size=3>#include &lt;vcl.h&gt;</P>< align=justify>2</FONT><FONT face=宋体 size=3>.</FONT><FONT face="Courier New" size=3>#pragma hdrstop</P>< align=justify>3</FONT><FONT face=宋体 size=3>.</FONT><FONT face="Courier New" size=3>USERES("MP3Collect.res");</P>< align=justify>4</FONT><FONT face=宋体 size=3>.</FONT><FONT face="Courier New" size=3>USEFORM("MainFrom.cpp", MainForm);</P>< align=justify>5</FONT><FONT face=宋体 size=3>.</FONT><FONT face="Courier New" size=3>WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)</P>< align=justify>6</FONT><FONT face=宋体 size=3>.{</P></FONT><FONT face="Courier New" size=3>< align=justify>7</FONT><FONT face=宋体 size=3>. </FONT><FONT face="Courier New" size=3>try</P>< align=justify>8</FONT><FONT face=宋体 size=3>. {</P></FONT><FONT face="Courier New" size=3>< align=justify>9</FONT><FONT face=宋体 size=3>. </FONT><FONT face="Courier New" size=3>Application-&gt;Initialize();</P>< align=justify>10</FONT><FONT face=宋体 size=3>. </FONT><FONT face="Courier New" size=3>Application-&gt;CreateForm(__classid(TMainForm),&amp;MainForm);</P>< align=justify>11</FONT><FONT face=宋体 size=3>. </FONT><FONT face="Courier New" size=3>Application-&gt;Run();</P>< align=justify>12</FONT><FONT face=宋体 size=3>. }</P></FONT><FONT face="Courier New" size=3>< align=justify>13</FONT><FONT face=宋体 size=3>. </FONT><FONT face="Courier New" size=3>catch (Exception &amp;exception) </P>< align=justify>14</FONT><FONT face=宋体 size=3>. { </P></FONT><FONT face="Courier New" size=3>< align=justify>15</FONT><FONT face=宋体 size=3>. </FONT><FONT face="Courier New" size=3>Application-&gt;ShowException(&amp;exception);</P>< align=justify>16</FONT><FONT face=宋体 size=3>. }</P></FONT><FONT face="Courier New" size=3>< align=justify>17</FONT><FONT face=宋体 size=3>. </FONT><FONT face="Courier New" size=3>return 0;</P><P align=justify>18</FONT><FONT face=宋体 size=3>.}</P><P align=justify>第</FONT><FONT face="宋体, MS Song" size=3>1</FONT><FONT face=宋体 size=3>行是一条预处理指令。</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>编译器在正式编译一段代码之前,会预先扫描一遍代码,并根据预处理指令进行一些预先的处理,</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>编译器一共支持十几个预处理指令,每条预处理指令前都有一个“</FONT><FONT face="宋体, MS Song" size=3>#</FONT><FONT face=宋体 size=3>”符号。“</FONT><FONT face="宋体, MS Song" size=3>#include </FONT><FONT face=宋体 size=3>……”指令的意义是包含一个头文件,这在里就是告诉预处理器将</FONT><FONT face="宋体, MS Song" size=3>vcl.h</FONT><FONT face=宋体 size=3>包含进来。</FONT><FONT face="宋体, MS Song" size=3>vcl.h</FONT><FONT face=宋体 size=3>是使用</FONT><FONT face="宋体, MS Song" size=3>VCL</FONT><FONT face=宋体 size=3>库时必需的头文件,其中包括了使用</FONT><FONT face="宋体, MS Song" size=3>VCL</FONT><FONT face=宋体 size=3>库所需的各种声明和定义。</FONT><FONT face="宋体, MS Song" size=3>vcl.h</FONT><FONT face=宋体 size=3>内部又包含了多个其它的头文件,因此编译这个头文件需要花费较长的时间,为了缩短编译时间,</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>对这种些固定的头文件采取了预编译处理,第一次编译时进行完全编译,在以后的编译过程中,只要这些头文件没有变化,就不再处理它们,</FONT><FONT face="宋体, MS Song" size=3>MP3Collect.cpp</FONT><FONT face=宋体 size=3>中的第二条语句就是</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>的预编译开关指令,它表示预编译头文件部分到此结束。</P><P align=justify>第</FONT><FONT face="宋体, MS Song" size=3>3</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>4</FONT><FONT face=宋体 size=3>行的</FONT><FONT face="宋体, MS Song" size=3>USERES</FONT><FONT face=宋体 size=3>和</FONT><FONT face="宋体, MS Song" size=3>USEFORMS</FONT><FONT face=宋体 size=3>均为</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>定义的宏,前者用来定义工程的资源文件,后者用来指明工程中包含的窗体。</FONT><FONT face="宋体, MS Song" size=3>USEFORMS</FONT><FONT face=宋体 size=3>的第一个参数为窗体的单元文件名,第二个参数为窗体对象的名称。如果工程中有多个窗体,会在这里逐一用</FONT><FONT face="宋体, MS Song" size=3>USEFORMS</FONT><FONT face=宋体 size=3>宏指明。</P><P align=justify>从第</FONT><FONT face="宋体, MS Song" size=3>5</FONT><FONT face=宋体 size=3>行到第</FONT><FONT face="宋体, MS Song" size=3>18</FONT><FONT face=宋体 size=3>行定义了函数</FONT><FONT face="宋体, MS Song" size=3>WinMain</FONT><FONT face=宋体 size=3>,这是</FONT><FONT face="宋体, MS Song" size=3>Windows</FONT><FONT face=宋体 size=3>应用程序的标准入口函数,其参数的含义如下:</FONT><FONT face="宋体, MS Song" size=3>HINSTANCE hInstance</FONT><FONT face=宋体 size=3>(程序的当前实例句柄),</FONT><FONT face="宋体, MS Song" size=3>HINSTANCE hPrevInstance</FONT><FONT face=宋体 size=3>(程序的前一个实例句柄),</FONT><FONT face="宋体, MS Song" size=3>LPSTR lpCmdLine</FONT><FONT face=宋体 size=3>,(命令行字符串指针),</FONT><FONT face="宋体, MS Song" size=3>int nCmdShow</FONT><FONT face=宋体 size=3>(主窗口的显示方式)。</P></FONT><FONT size=3><P align=justify>WinMain</FONT><FONT face=宋体 size=3>函数的主体是</FONT><FONT size=3>try</FONT><FONT face=宋体 size=3>语句引出的一段代码和</FONT><FONT size=3>catch</FONT><FONT face=宋体 size=3>语句引出的异常处理代码。</FONT><FONT size=3>try</FONT><FONT face=宋体 size=3>和</FONT><FONT size=3>catch</FONT><FONT face=宋体 size=3>是</FONT><FONT size=3>C++</FONT><FONT face=宋体 size=3>中的关键字,用来处理程序运行时产生的异常,关于</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>的异常处理机制,讲座后期还要详细介绍,这里大家需要了解的只是:</FONT><FONT size=3>try</FONT><FONT face=宋体 size=3>语句引出一段可能产生异常的代码,如果运行时该段代码产生了异常,则中断该代码的执行,自动转入到由</FONT><FONT size=3>catch</FONT><FONT face=宋体 size=3>引出的异常处理代码中运行,一条</FONT><FONT size=3>try</FONT><FONT face=宋体 size=3>语句至少要有一条</FONT><FONT size=3>catch</FONT><FONT face=宋体 size=3>语句与之相对应,如果不产生异常,</FONT><FONT size=3>catch</FONT><FONT face=宋体 size=3>中的异常处理代码不会被执行。</P><P align=justify>下面我们来分析</FONT><FONT face="宋体, MS Song" size=3>try</FONT><FONT face=宋体 size=3>语句所包括的第</FONT><FONT face="宋体, MS Song" size=3>9</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>10</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>11</FONT><FONT face=宋体 size=3>行代码,它们都引用了</FONT><FONT face="宋体, MS Song" size=3>Application</FONT><FONT face=宋体 size=3>对象。</FONT><FONT face="宋体, MS Song" size=3>Application</FONT><FONT face=宋体 size=3>对象代表</FONT><FONT face="宋体, MS Song" size=3>Windows</FONT><FONT face=宋体 size=3>应用程序自身(在这里就是</FONT><FONT face="宋体, MS Song" size=3>MP3Collect</FONT><FONT face=宋体 size=3>),它对应的</FONT><FONT face="宋体, MS Song" size=3>VCL</FONT><FONT face=宋体 size=3>类是</FONT><FONT face="宋体, MS Song" size=3>TApplication</FONT><FONT face=宋体 size=3>,该类实现了应用程序初始化、创建窗体、运行、消息循环、异常处理、退出等基本功能。</FONT><FONT face="宋体, MS Song" size=3>Application</FONT><FONT face=宋体 size=3>对象的定义和创建是在</FONT><FONT face="宋体, MS Song" size=3>VCL</FONT><FONT face=宋体 size=3>库中完成的,它的声明</FONT><FONT face="宋体, MS Song" size=3>extern TApplication * Application</FONT><FONT face=宋体 size=3>位于头文件</FONT><FONT face="宋体, MS Song" size=3>Forms.hpp</FONT><FONT face=宋体 size=3>中(</FONT><FONT face="宋体, MS Song" size=3>vcl.h</FONT><FONT face=宋体 size=3>包含了</FONT><FONT face="宋体, MS Song" size=3>Forms.hpp</FONT><FONT face=宋体 size=3>)。第</FONT><FONT face="宋体, MS Song" size=3>9</FONT><FONT face=宋体 size=3>行语句调用</FONT><FONT face="宋体, MS Song" size=3>Application</FONT><FONT face=宋体 size=3>对象的</FONT><FONT face="宋体, MS Song" size=3>Initialize</FONT><FONT face=宋体 size=3>方法来初始化应用程序。第</FONT><FONT face="宋体, MS Song" size=3>10</FONT><FONT face=宋体 size=3>行语句创建主窗体,</FONT><FONT face="宋体, MS Song" size=3>CreateForm</FONT><FONT face=宋体 size=3>函数的第一个参数为主窗体类,第二个参数为主窗体对象,</FONT><FONT face="宋体, MS Song" size=3>__classid</FONT><FONT face=宋体 size=3>是获取</FONT><FONT face="宋体, MS Song" size=3>VCL</FONT><FONT face=宋体 size=3>类的操作符。如果应用程序中有多个自动创建的窗体,都会在这里以同样的方式创建,其中第一个创建的窗体为主窗体。第</FONT><FONT face="宋体, MS Song" size=3>11</FONT><FONT face=宋体 size=3>行语句调用</FONT><FONT face="宋体, MS Song" size=3>Application</FONT><FONT face=宋体 size=3>对象的</FONT><FONT face="宋体, MS Song" size=3>Run</FONT><FONT face=宋体 size=3>方法开始程序的运行,</FONT><FONT face="宋体, MS Song" size=3>Run</FONT><FONT face=宋体 size=3>函数中包含了应用程序的主消息循环,只有消息循环结束后,该函数才会返回。</P><P align=justify>第</FONT><FONT face="宋体, MS Song" size=3>15</FONT><FONT face=宋体 size=3>行语句是异常处理代码,利用</FONT><FONT face="宋体, MS Song" size=3>Application</FONT><FONT face=宋体 size=3>对象的</FONT><FONT face="宋体, MS Song" size=3>ShowException</FONT><FONT face=宋体 size=3>方法显示异常事件的相关信息。第</FONT><FONT face="宋体, MS Song" size=3>18</FONT><FONT face=宋体 size=3>行语句表示应用程序结束后,返回结束代码</FONT><FONT face="宋体, MS Song" size=3>0</FONT><FONT face=宋体 size=3>。</P><UL><B><P align=justify><LI>单元文件</FONT><FONT face="宋体, MS Song" size=3>MainForm.cpp</FONT><FONT face=宋体 size=3>及其头文件</FONT><FONT size=3><FONT face="宋体, MS Song">MainForm.h </FONT><p></LI></UL></B><P align=justify>MainForm.cpp</FONT><FONT face=宋体 size=3>和</FONT><FONT size=3>MainForm.h</FONT><FONT face=宋体 size=3>一起给出了主窗体的定义,其中</FONT><FONT size=3>MainForm.h</FONT><FONT face=宋体 size=3>中定义了主窗体类</FONT><FONT size=3>TMainFrom</FONT><FONT face=宋体 size=3>。</P></FONT><FONT face="Courier New" size=3><P align=justify>1</FONT><FONT face=宋体 size=3>. </FONT><FONT face="Courier New" size=3>#ifndef MainFromH</P><P align=justify>2</FONT><FONT face=宋体 size=3>. </FONT><FONT face="Courier New" size=3>#define MainFromH</P><P align=justify>3</FONT><FONT face=宋体 size=3>. </FONT><FONT face="Courier New" size=3>#include &lt;Classes.hpp&gt;</P><P align=justify>4</FONT><FONT face=宋体 size=3>. </FONT><FONT face="Courier New" size=3>#include &lt;Controls.hpp&gt;</P><P align=justify>5</FONT><FONT face=宋体 size=3>. </FONT><FONT face="Courier New" size=3>#include &lt;StdCtrls.hpp&gt;</P><P align=justify>6</FONT><FONT face=宋体 size=3>. </FONT><FONT face="Courier New" size=3>#include &lt;Forms.hpp&gt;</P><P align=justify>7</FONT><FONT face=宋体 size=3>. </FONT><FONT face="Courier New" size=3>class TMainForm: public TForm</P><P align=justify>8</FONT><FONT face=宋体 size=3>. {</P></FONT><FONT face="Courier New" size=3><P align=justify>9</FONT><FONT face=宋体 size=3>. </FONT><FONT face="Courier New" size=3>__published: // IDE-managed Components</P><P align=justify>10</FONT><FONT face=宋体 size=3>. </FONT><FONT face="Courier New" size=3>private: // User declarations</P><P align=justify>11</FONT><FONT face=宋体 size=3>. </FONT><FONT face="Courier New" size=3>public: // User declarations</P><P align=justify>12</FONT><FONT face=宋体 size=3>. </FONT><FONT face="Courier New" size=3>__fastcall TMainForm(TComponent* Owner);</P><P align=justify>13</FONT><FONT face=宋体 size=3>.}</FONT><FONT face="Courier New" size=3>;</P><P align=justify>14</FONT><FONT face=宋体 size=3>.</FONT><FONT face="Courier New" size=3>extern PACKAGE TMainForm *MainForm;</P><P align=justify>15</FONT><FONT face=宋体 size=3>.</FONT><FONT face="Courier New" size=3>#endif</P></FONT><FONT face=宋体 size=3><P align=justify>其中第</FONT><FONT face="宋体, MS Song" size=3>1</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>15</FONT><FONT face=宋体 size=3>行是条件编译指令。编译器根据这两条指令,首先检测</FONT><FONT face="宋体, MS Song" size=3>MainFormH</FONT><FONT face=宋体 size=3>是否已定义,如果未定义,才会继续编译第</FONT><FONT face="宋体, MS Song" size=3>2~14</FONT><FONT face=宋体 size=3>行的语句。第</FONT><FONT face="宋体, MS Song" size=3>2</FONT><FONT face=宋体 size=3>行定义</FONT><FONT face="宋体, MS Song" size=3>MainFormH</FONT><FONT face=宋体 size=3>,目的是避免重复编译</FONT><FONT face="宋体, MS Song" size=3>MainForm.h</FONT><FONT face=宋体 size=3>。第</FONT><FONT face="宋体, MS Song" size=3>3</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>4</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>5</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>6</FONT><FONT face=宋体 size=3>行包含了使用窗体和控件的头文件,</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>会根据窗体上的控件自动添加所需要的头文件。</P><P align=justify>第</FONT><FONT face="宋体, MS Song" size=3>7</FONT><FONT face=宋体 size=3>行是类定义的开始,其中</FONT><FONT face="宋体, MS Song" size=3>class</FONT><FONT face=宋体 size=3>是定义类的</FONT><FONT face="宋体, MS Song" size=3>C++</FONT><FONT face=宋体 size=3>关键字,</FONT><FONT face="宋体, MS Song" size=3>TMainFrom</FONT><FONT face=宋体 size=3>是类的名称,“:”符号指示类的父类,即</FONT><FONT face="宋体, MS Song" size=3>TMainFrom</FONT><FONT face=宋体 size=3>类的父类为</FONT><FONT face="宋体, MS Song" size=3>TForm</FONT><FONT face=宋体 size=3>,且继承方式为</FONT><FONT face="宋体, MS Song" size=3>public</FONT><FONT face=宋体 size=3>方式。</P><P align=justify>第</FONT><FONT face="宋体, MS Song" size=3>10</FONT><FONT face=宋体 size=3>到</FONT><FONT face="宋体, MS Song" size=3>13</FONT><FONT face=宋体 size=3>行语句为类的定义体,其中定义了类的各种属性和方法。第三讲中我们介绍过,根据外界对成员的存取限制,</FONT><FONT face="宋体, MS Song" size=3>C++</FONT><FONT face=宋体 size=3>类的成员分为</FONT><FONT face="宋体, MS Song" size=3>3</FONT><FONT face=宋体 size=3>种类型:</FONT><FONT face="宋体, MS Song" size=3>private</FONT><FONT face=宋体 size=3>私有的、</FONT><FONT face="宋体, MS Song" size=3>protect</FONT><FONT face=宋体 size=3>保护的和</FONT><FONT face="宋体, MS Song" size=3>public</FONT><FONT face=宋体 size=3>公共的,这里我们会遇到</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>引入的一种新成员类型:</FONT><FONT face="宋体, MS Song" size=3>__published</FONT><FONT face=宋体 size=3>,该类型成员与</FONT><FONT face="宋体, MS Song" size=3>public</FONT><FONT face=宋体 size=3>类型成员一样可以被外界的函数访问,而不同的地方在于:</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>编译连接器会为</FONT><FONT face="宋体, MS Song" size=3>__published</FONT><FONT face=宋体 size=3>类的成员生成运行时类型信息(</FONT><FONT face="宋体, MS Song" size=3>RTTI</FONT><FONT face=宋体 size=3>),使这种类型的成员能够显示在对象监视器中。对于新建的</FONT><FONT face="宋体, MS Song" size=3>TMainForm</FONT><FONT face=宋体 size=3>来说,因为还未添加任何控件和事件处理函数,所以</FONT><FONT face="宋体, MS Song" size=3>__published</FONT><FONT face=宋体 size=3>下的成员为空。如果我们在窗体上添加一个按钮,再双击该按钮添加其缺省事件处理函数:</FONT><FONT face="宋体, MS Song" size=3>Button1Click</FONT><FONT face=宋体 size=3>(),这时就会发现</FONT><FONT face="宋体, MS Song" size=3>__published</FONT><FONT face=宋体 size=3>下面多了两个成员:</P></FONT><FONT size=3><P align=justify>__published: // IDE-managed Components</P><P align=justify>TButton *Button1;</P><P align=justify>void __fastcall Button1Click(TObject *Sender);</P></FONT><FONT face=宋体 size=3><P align=justify>同样,新建的</FONT><FONT face="宋体, MS Song" size=3>TMainForm</FONT><FONT face=宋体 size=3>类中,</FONT><FONT face="宋体, MS Song" size=3>private</FONT><FONT face=宋体 size=3>类型的成员也为空。只有一个</FONT><FONT face="宋体, MS Song" size=3>public</FONT><FONT face=宋体 size=3>类型的构造函数(见第</FONT><FONT face="宋体, MS Song" size=3>12</FONT><FONT face=宋体 size=3>行)。构造函数前面的关键字“</FONT><FONT face="宋体, MS Song" size=3>__fastcall</FONT><FONT face=宋体 size=3>”是一种函数调用类型修饰符,表明该函数通过寄存器传递参数(普通的</FONT><FONT face="宋体, MS Song" size=3>C/C++</FONT><FONT face=宋体 size=3>函数是通过堆栈来传递参数),</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>中窗体的成员函数都是采用</FONT><FONT face="宋体, MS Song" size=3>__fastcal</FONT><FONT face=宋体 size=3>调用类型,这样可以加快程序的运行速度。</P><P align=justify>第</FONT><FONT face="宋体, MS Song" size=3>14</FONT><FONT face=宋体 size=3>行声明了一个指向</FONT><FONT face="宋体, MS Song" size=3>TMainForm</FONT><FONT face=宋体 size=3>类对象的指针</FONT><FONT face="宋体, MS Song" size=3>MainFrom</FONT><FONT face=宋体 size=3>,根据</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>编程的习惯,我们也称</FONT><FONT face="宋体, MS Song" size=3>MainFrom</FONT><FONT face=宋体 size=3>为对象。</P><P align=justify>下面我们再来看看主窗体类的实现代码,即单元文件</FONT><FONT face="宋体, MS Song" size=3>MainForm.cpp</FONT><FONT face=宋体 size=3>。</P></FONT><FONT face="Courier New" size=3><P align=justify>1</FONT><FONT face=宋体 size=3>. </FONT><FONT face="Courier New" size=3>#include &lt;vcl.h&gt;</P><P align=justify>2</FONT><FONT face=宋体 size=3>. </FONT><FONT face="Courier New" size=3>#pragma hdrstop</P><P align=justify>3</FONT><FONT face=宋体 size=3>. </FONT><FONT face="Courier New" size=3>#include "MainForm.h"</P><P align=justify>4</FONT><FONT face=宋体 size=3>. </FONT><FONT face="Courier New" size=3>#pragma package(smart_init)</P><P align=justify>5</FONT><FONT face=宋体 size=3>. </FONT><FONT face="Courier New" size=3>#pragma resource "*.dfm"</P><P align=justify>6</FONT><FONT face=宋体 size=3>. </FONT><FONT face="Courier New" size=3>TMainForm *MainForm;</P><P align=justify>7</FONT><FONT face=宋体 size=3>. </FONT><FONT face="Courier New" size=3>__fastcall TMainForm::TMainForm(TComponent* Owner)</P><P align=justify>8</FONT><FONT face=宋体 size=3>. </FONT><FONT face="Courier New" size=3>: TForm(Owner)</P><P align=justify>9</FONT><FONT face=宋体 size=3>. {</P></FONT><FONT face="Courier New" size=3><P align=justify>10</FONT><FONT face=宋体 size=3>.}</P><P align=justify>其中第</FONT><FONT face="宋体, MS Song" size=3>1</FONT><FONT face=宋体 size=3>行与应用程序入口单元</FONT><FONT face="宋体, MS Song" size=3>MP3Collect.cpp</FONT><FONT face=宋体 size=3>一样,指示包含头文件</FONT><FONT face="宋体, MS Song" size=3>vcl.h</FONT><FONT face=宋体 size=3>。第</FONT><FONT face="宋体, MS Song" size=3>2</FONT><FONT face=宋体 size=3>行表示预编译头文件结束。第</FONT><FONT face="宋体, MS Song" size=3>3</FONT><FONT face=宋体 size=3>行包含头文件</FONT><FONT face="宋体, MS Song" size=3>MainForm.h</FONT><FONT face=宋体 size=3>。有的朋友可能已经注意到,同样是包含头文件,第</FONT><FONT face="宋体, MS Song" size=3>1</FONT><FONT face=宋体 size=3>行中用尖括号</FONT><FONT face="宋体, MS Song" size=3>&lt;&gt;</FONT><FONT face=宋体 size=3>来包括文件名,第</FONT><FONT face="宋体, MS Song" size=3>3</FONT><FONT face=宋体 size=3>行中则用引号</FONT><FONT face="宋体, MS Song" size=3>""</FONT><FONT face=宋体 size=3>来包括文件名,两者的差别是编译器在搜索头文件时查找的缺省路径有所不同,一般来说,</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>的标准头文件用</FONT><FONT face="宋体, MS Song" size=3>&lt;&gt;</FONT><FONT face=宋体 size=3>来包含,而工程中的头文件则用</FONT><FONT face="宋体, MS Song" size=3>""</FONT><FONT face=宋体 size=3>来包含。</P><P align=justify>第</FONT><FONT face="宋体, MS Song" size=3>4</FONT><FONT face=宋体 size=3>行是一行预处理指令,其作用是保证单元的初始化按照单元之间的依赖过程进行。例如,“</FONT><FONT face="宋体, MS Song" size=3>UnitA</FONT><FONT face=宋体 size=3>”中使用到了“</FONT><FONT face="宋体, MS Song" size=3>UnitB</FONT><FONT face=宋体 size=3>”,则编译器应保证</FONT><FONT face="宋体, MS Song" size=3>UnitB</FONT><FONT face=宋体 size=3>应在</FONT><FONT face="宋体, MS Song" size=3>UnitA</FONT><FONT face=宋体 size=3>之前初始化。</P><P align=justify>第</FONT><FONT face="宋体, MS Song" size=3>5</FONT><FONT face=宋体 size=3>行预处理指令指明了当前的单元文件是窗体单元文件,</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>集成开发环境在处理此单元文件时会自动查找同名的窗体文件(</FONT><FONT face="Courier New" size=3>*.dfm</FONT><FONT face=宋体 size=3>文件)和头文件(</FONT><FONT face="Courier New" size=3>*.h</FONT><FONT face=宋体 size=3>文件)。</P><P align=justify>第</FONT><FONT face="宋体, MS Song" size=3>6</FONT><FONT face=宋体 size=3>行定义了</FONT><FONT face="宋体, MS Song" size=3>TMainForm</FONT><FONT face=宋体 size=3>类对象</FONT><FONT face="宋体, MS Song" size=3>MainFrom</FONT><FONT face=宋体 size=3>。</FONT><FONT face="宋体, MS Song" size=3>MainForm.h</FONT><FONT face=宋体 size=3>文件中的第</FONT><FONT face="宋体, MS Song" size=3>14</FONT><FONT face=宋体 size=3>行语句与此很相似,只是多了关键词“</FONT><FONT face="宋体, MS Song" size=3>extern</FONT><FONT face=宋体 size=3>”,因为有了该关键词,使得这两句的意义完全不相同。这里的第</FONT><FONT face="宋体, MS Song" size=3>6</FONT><FONT face=宋体 size=3>行语句是定义一个变量,程序会为这个变量分配一块实实在在的内存,而</FONT><FONT face="宋体, MS Song" size=3>MainForm.h</FONT><FONT face=宋体 size=3>中的第</FONT><FONT face="宋体, MS Song" size=3>14</FONT><FONT face=宋体 size=3>行则只是声明了一个变量,声明变量的意义是告诉编译器,应用程序的某一处已经定义了这样一个变量,使得后续的代码中可以使用该变量,变量声明并不会真正分配内存,这就是声明与定义的基本区别(在有些资料中的称法可能不太相同,把变量定义称为“定义性声明”,把变量声明称为“非定义性声明”。在本讲座中,如不特殊说明,仍然使用“变量定义”和“变量声明”的称法)。</P><P align=justify>第</FONT><FONT face="宋体, MS Song" size=3>7</FONT><FONT face=宋体 size=3>到</FONT><FONT face="宋体, MS Song" size=3>10</FONT><FONT face=宋体 size=3>行语句给出了</FONT><FONT face="宋体, MS Song" size=3>TMainForm</FONT><FONT face=宋体 size=3>类的构造函数的实现。函数名前的“</FONT><FONT face="宋体, MS Song" size=3>TMainForm::</FONT><FONT face=宋体 size=3>”为作用域限制符,表示函数的作用域为</FONT><FONT face="宋体, MS Song" size=3>TMainForm</FONT><FONT face=宋体 size=3>类,即该函数为</FONT><FONT face="宋体, MS Song" size=3>TMainForm</FONT><FONT face=宋体 size=3>类的成员函数。函数的参数为</FONT><FONT face="宋体, MS Song" size=3>TComponent* Owner</FONT><FONT face=宋体 size=3>,</FONT><FONT face="宋体, MS Song" size=3>Owner</FONT><FONT face=宋体 size=3>为本窗体的父元件对象。第</FONT><FONT face="宋体, MS Song" size=3>8</FONT><FONT face=宋体 size=3>行语句表示该构造函数会首先调用其基类的构造函数,并将</FONT><FONT face="宋体, MS Song" size=3>Owner</FONT><FONT face=宋体 size=3>参数传递到基类的构造函数中。构造函数中一般进行类初始化所需要的一些操作,相应的代码可以加在第</FONT><FONT face="宋体, MS Song" size=3>9</FONT><FONT face=宋体 size=3>行和第</FONT><FONT face="宋体, MS Song" size=3>10</FONT><FONT face=宋体 size=3>行中间。</P><UL><B><P align=justify><LI>窗体文件</FONT><FONT size=3><FONT face="宋体, MS Song">MainForm.dfm </FONT><p></LI></UL></B></FONT><FONT face=宋体 size=3><P align=justify>窗体文件</FONT><FONT face="宋体, MS Song" size=3>MainForm.dfm</FONT><FONT face=宋体 size=3>为文本格式的文件,描述了窗体的各种属性及其上的元件以及元件属性,如下所示:</P><DIR></FONT><FONT size=3><P align=justify>object MainForm: TMainForm</P><P align=justify>Left = 321</P><P align=justify>Top = 107</P><P align=justify>Width = 544</P><P align=justify>Height = 375</P><P align=justify>Caption = 'Form1'</P><P align=justify>Color = clBtnFace</P><P align=justify>Font.Charset = DEFAULT_CHARSET</P><P align=justify>Font.Color = clWindowText</P><P align=justify>Font.Height = -11</P><P align=justify>Font.Name = 'MS Sans Serif'</P><P align=justify>Font.Style = []</P><P align=justify>OldCreateOrder = False</P><P align=justify>PixelsPerInch = 96</P><P align=justify>TextHeight = 13</P><P align=justify>end</P></DIR></FONT><FONT face=宋体 size=3><P align=justify>通常我们都是通过</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>的窗体编辑器来设计和修改窗体,因此不建议大家手工修改</FONT><FONT face="宋体, MS Song" size=3>.dfm</FONT><FONT face=宋体 size=3>文件,这里也不再详述其格式了</P><UL><B><P align=justify><LI>资源文件</FONT><FONT size=3><FONT face="宋体, MS Song">MP3Collect.res </FONT><p></LI></UL></B><P align=justify>CBuilder</FONT><FONT face=宋体 size=3>使用标准格式的</FONT><FONT size=3>Windows</FONT><FONT face=宋体 size=3>资源文件,工程项目中所使用的资源,如位图、光标、图标等均在此文件中定义。</P><P align=justify> </P><P align=justify>本讲我们深入到了一个</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>工程的内部,了解了各个文件的组成、结构和作用,特别是对于其中的</FONT><FONT face="宋体, MS Song" size=3>C++</FONT><FONT face=宋体 size=3>源文件,几乎是逐行进行了讲解。由于代码中涉及到了一些</FONT><FONT face="宋体, MS Song" size=3>C++</FONT><FONT face=宋体 size=3>术语和</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>的关键词,初学编程的朋友可能会感到有些不好懂,这些朋友不妨多结合实践和其他参考资料,尽量在接触程序代码的开始就把概念搞清楚。</P></FONT>
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

<b><FONT face=宋体 size=6> </FONT></b>< align=center>调试应用程序</P><FONT face=宋体 size=3>< align=justify>上一讲详细介绍了工程的文件组成,相信朋友们已经做了不少练习,对</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>工程有了较深入的了解。本讲中,心铃要为大家介绍在调试应用程序的方法。在应用程序的开发过程中,程序调试的重要性并不亚于编写代码,因为一个设计得再好的程序,也难免会出现错误,这些错误需要通过调试来排除,通常程序的功能越是复杂,调试过程的工作量也就越大,而且显得越为重要。</P><UL><B>< align=justify><LI>程序的错误类型
+ M, q. w. U6 x& w</LI></UL></B>< align=justify>编写应用程序时可能产生的错误通常可以分为三大类:语法错误、运行时错误和逻辑错误。语法错误是程序代码违反了</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>的语法规则而产生的错误,典型的语法错误有书写代码时缺少标点符号、函数调用的参数类型不匹配、使用未声明的变量等,语法错误在编译阶段就会被编译器检查出来。</P>< align=justify>运行时错误只有在运行时才会体现出来,例如,在应用程序过程中打开了并不存在的文件,或者使用越界的指针等等。运行时错误可以在集成调试环境下通过设置断点、单步跟踪、添加监视等方法来查找和排除。</P>< align=justify>逻辑错误是由于程序算法不完善而产生的,运行结果不符合程序设计功能的问题,这一类错误比较难以检查,一般需要通过监视和检查程序中数据的变化情况,来检查错误发生的位置。还有些错误在“正常”的使用中不会出现,但在某些输入条件下才会产生(软件中的</FONT><FONT face="宋体, MS Song" size=3>Bugs</FONT><FONT face=宋体 size=3>有很大一部分属于这种类型),避免这一类错误的出现在很大程度上是属于软件工程的问题,需要设计完善的测试条件,提早发现和避免这类错误。</P><UL></FONT><B><FONT size=3>< align=justify><LI>CBuilder</FONT><FONT face=宋体 size=3>的集成调试环境 <p></LI></UL></B>< align=justify>为了能使用</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>的调试工具来进行调试,我们需要在工程设置中打开一些与调试有关的开关,使得</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>在编译、连接和生成可执行程序的过程中产生必需的调试信息,这些开关请大家参考第五讲的内容。</P>< align=justify>按照第五讲介绍的方法生成了包含有调试信息的可执行程序后,就可以在</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>集成调试环境下运行该程序了。应用程序在调试状态下运行时,与非调试状态下运行所执行的功能一样,可以进行响应用户输入、显示窗口等操作,但通过</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>调试工具,我们可以控制程序的执行,使程序在某些特定时刻暂停执行,当程序暂停执行时,我们可以使用调试工具来分析程序当前的工作状态,如变量、函数、调用关系、</FONT><FONT face="宋体, MS Song" size=3>CPU</FONT><FONT face=宋体 size=3>、寄存器等。通过分析程序的运行情况并和预先设计的状态进行对比,就可以检查出可能存在的错误。</P></FONT><FONT size=3>< align=justify>CBuilder</FONT><FONT face=宋体 size=3>的集成调试环境主要由代码编辑窗口、</FONT><FONT size=3>CPU</FONT><FONT face=宋体 size=3>状态窗口、调用堆栈窗口、监视窗口、局部变量窗口和</FONT><FONT size=3>CodeGuard</FONT><FONT face=宋体 size=3>记录窗口组成。除了代码编辑窗口之外,其余的调试窗口均可以通过菜单</FONT><FONT size=3>View-&gt;Debug Windows</FONT><FONT face=宋体 size=3>下面的命令来激活。</P>< align=justify>代码编辑窗口用于显示程序执行的状态、当前执行点的位置等。在调试状态下,代码编辑窗口左侧的标志条会显示出一排蓝色小圆点,每个蓝色小圆点代表一条可执行的语句,当程序暂停执行时,下一条将要执行的语句被高亮度显示出来,并在左侧的标志条中显示一个绿色的箭头。在调试状态下,代码编辑窗口的</FONT><FONT face="宋体, MS Song" size=3>CodeInsight</FONT><FONT face=宋体 size=3>功能还增加了一项显示变量取值的功能,即把鼠标放在某个变量上方停留片刻,便会出现一个提示条,其中显示了该变量当前的取值。</P>< align=justify>代码编辑窗口是程序调试时使用的主要窗口,但有时调试人员可能希望了解更多的低层信息,就会使用</FONT><FONT face="宋体, MS Song" size=3>CPU</FONT><FONT face=宋体 size=3>状态窗口。</FONT><FONT face="宋体, MS Song" size=3>CPU</FONT><FONT face=宋体 size=3>状态窗口如图</FONT><FONT face="宋体, MS Song" size=3>7-1</FONT><FONT face=宋体 size=3>所示,其中显示了当程序运行时的一系列低层状态信息,如内存、堆栈、寄存器、</FONT><FONT face="宋体, MS Song" size=3>CPU</FONT><FONT face=宋体 size=3>标志位等。</FONT><FONT face="宋体, MS Song" size=3>CPU</FONT><FONT face=宋体 size=3>状态窗口由五个子窗口区域组成,分别是汇编指令窗口、内存窗口、程序堆栈窗口、寄存器窗口和</FONT><FONT face="宋体, MS Song" size=3>CPU</FONT><FONT face=宋体 size=3>标志窗口。其中汇编指令窗口可以让调试人员在汇编指令级跟踪和调试程序,该子窗口片还会标出与一段汇编指令相对应的</FONT><FONT face="宋体, MS Song" size=3>C/C++</FONT><FONT face=宋体 size=3>语句,更便于程序的调试。</P>< align=justify>调用堆栈窗口(</FONT><FONT face="宋体, MS Song" size=3>Call Stack</FONT><FONT face=宋体 size=3>)显示了函数的调用关系,从调用堆栈窗口中可以看出当前执行的语句经过了哪几层函数调用。心铃在程序调试时经常要使用它,因为从错误的产生到错误显现出来,可能已经经过了好几层函数调用,有了调用堆栈窗口就可以很容易追本溯源了。</P>< align=justify>监视窗口(</FONT><FONT face="宋体, MS Song" size=3>Watches</FONT><FONT face=宋体 size=3>)可以监视变量以及变量表达式的取值和取值的变化,调试人员可以向其中添加或删除监视点。</P>< align=justify>局部变量窗口(</FONT><FONT face="宋体, MS Song" size=3>Local Variables</FONT><FONT face=宋体 size=3>)显示当前执行语句所属函数的所有局部变量的值。</P></FONT><FONT size=3>< align=justify>CodeGuard</FONT><FONT face=宋体 size=3>记录窗口(</FONT><FONT size=3>CodeGuard Log</FONT><FONT face=宋体 size=3>)只有在工程中打开了</FONT><FONT size=3>CodeGuard</FONT><FONT face=宋体 size=3>功能才有效,它会自动检测一些运行时错误,遇到错误时自动暂停程序的运行,并将错误的原因、错误发生的语句等记录下来。</P>< align=justify>另外,在第六讲介绍应用程序的入口函数</FONT><FONT face="宋体, MS Song" size=3>WinMain</FONT><FONT face=宋体 size=3>时,介绍过它的一个参数是命令行参数。命令行参数是</FONT><FONT face="宋体, MS Song" size=3>DOS</FONT><FONT face=宋体 size=3>时代十分常用的一种程序启动参数,在</FONT><FONT face="宋体, MS Song" size=3>Windows</FONT><FONT face=宋体 size=3>环境下,应用程序的启动不再通过命令行方式,但命令行参数仍然十分有用,例如,我们双击一个文件,系统会启动与之相关联的应用程序打开和处理该文件,就是通过命令行参数的方式将文件名传递给应用程序的。在</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>中调试应用程序时,也可以设置应用程序的命行参数,方法是通过</FONT><FONT face="宋体, MS Song" size=3>Run-&gtarameters</FONT><FONT face=宋体 size=3>菜单,打开运行参数对话框,在</FONT><FONT face="宋体, MS Song" size=3>arameters</FONT><FONT face=宋体 size=3>编辑框中输入命令行参数。</P><UL><B>< align=justify><LI>控制程序运行 <p></LI></UL></B></FONT><FONT size=3>< align=justify>CBuilder</FONT><FONT face=宋体 size=3>集成调试器提供了多个控制程序运行的命令:直接运行、单步运行、单步跟踪、跟踪到下一行源代码语句、运行到光标所在语句、运行直到函数返回、暂停运行、终止运行。下面介绍一下几个常用控制命令意义和用法。</P>< align=justify>直接运行命令(</FONT><FONT face="宋体, MS Song" size=3>Run-&gt;Run</FONT><FONT face=宋体 size=3>)与启动程序调试过程的命令相同,当程序暂停后,用直接运行命令可以让程序恢复正常运行状态,除非遇到断点才会再次暂停。直接运行方式可以加快调试的速度,对</FONT><FONT face="宋体, MS Song" size=3>Windows</FONT><FONT face=宋体 size=3>应用程序来说,大部分时间都在消息循环中等待消息,只有在处理某些消息时才会执行程序员编制的代码,因此可以让程序以直接运行方式处理消息循环,并配合断点的使用,让其在需要的地方暂停,可以提高调试的效率。</P>< align=justify>采用单步运行(</FONT><FONT face="宋体, MS Song" size=3>Run-&gt;Step</FONT><FONT face=宋体 size=3>)或单步跟踪(</FONT><FONT face="宋体, MS Song" size=3>Run-&gt;Trace</FONT><FONT face=宋体 size=3>)调试时,集成调试器每次只执行完一条语句就暂停,等待后续的执行命令。这里的一条语句既可以是一条</FONT><FONT face="宋体, MS Song" size=3>C++</FONT><FONT face=宋体 size=3>源代码语句,也可以是一条可执行的汇编指令,要根据当前调试窗口是代码编辑器还是</FONT><FONT face="宋体, MS Song" size=3>CPU</FONT><FONT face=宋体 size=3>状态窗口而定,当然,通常我们都是在</FONT><FONT face="宋体, MS Song" size=3>C/C++</FONT><FONT face=宋体 size=3>源代码上进行调试的。在遇到函数时,单步运行命令会将函数调用当作一条语句,一次执行完成整个函数。而单步跟踪命令则会跟踪到函数内部。单步运行或单步跟踪方式适合于细致的调试工作,当产生错误的大致范围已经清楚,利用这两种运行方式可以逐行地检查每一条语句的运行,直到查出产生错误的语句为止。</P>< align=justify>运行到光标处(</FONT><FONT face="宋体, MS Song" size=3>Run-&gt;Run To Cursor</FONT><FONT face=宋体 size=3>)是将程序执行到当前光标所在行,相当于在该行处设置了一个临时的断点,由于不需要设置和清除断点,因此使用很方便,是常用的调试命令之一。</P>< align=justify>前面的几条命令都是在程序暂停时才有效的命令,而暂停命令则只有在程序运行过程中才有效。暂停命令(</FONT><FONT face="宋体, MS Song" size=3>rogram Pause</FONT><FONT face=宋体 size=3>)可以随时暂停应用程序的运行,并且暂停的位置是随机的,而不是预先指定的。对于</FONT><FONT face="宋体, MS Song" size=3>Windows</FONT><FONT face=宋体 size=3>应用程序来说,大部分时候都在处理消息循环,所以暂停后应用程序常常停在查找消息的循环中,对程序调试而言意义不大。只有在处理一个时间较长的操作时,可以用暂停命令,以查看操作的进度。</P>< align=justify>正常情况下,程序的终止是由于用户选择了关闭或退出该应用程序的操作,程序终止后,调试也随之终止,</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>又恢复到设计状态。有时,我们也需要提前或强制终止程序的运行,此时可以使用</FONT><FONT face="宋体, MS Song" size=3>Run-&gtrogram Reset</FONT><FONT face=宋体 size=3>命令,该命令在整个调试期间都有效,无论是程序运行状态还是暂停状态下都可以使用该命令。通常当程序出现了明显的错误,或者希望修改程序重新调试时,我们可以使用该命令。</P><UL><B>< align=justify><LI>使用断点 <p></LI></UL></B>< align=justify>断点是程序调试过程中最常用的调试手段之一。所谓断点是在程序的某一处设置一个标志,告诉调试器,当程序执行到这个位置时暂停程序的执行。我们可以在代码编辑器中设置断点,并且无论是在设计状态下还是在调试状态下均可设置和清除断点,设置了断点的语句会用红色的背景突出显示,并在左侧标志条中打上一个红色的圆点标志。断点只在调试器中才有效,当应用程序脱离调试器单独运行时,断点不会影响它的运行。</P><P align=justify>设置断点的方法很简单,将光标移到需要添加断点的位置处,使用快捷键</FONT><FONT face="宋体, MS Song" size=3>F5</FONT><FONT face=宋体 size=3>即可添加断点,如果该位置本来就有断点,该操作则可以清除该断点。另外,也可用鼠标单击该语句左侧的标志条来添加和清除断点。需要注意的是,断点只能设在有效的代码行,如果设置在空白行、注释行或变量声明行等非执行语句上时,程序执行时将自动将其忽略,并在左侧的红色圆点上加了“</FONT><FONT face="宋体, MS Song" size=3>×</FONT><FONT face=宋体 size=3>”号。</P><P align=justify>断点又可分为无条件断点和有条件断点。缺省的断点都为无条件的,程序执行时,只要遇到这种断点,就会暂停执行。对于有条件断点,只有断点要求的条件得到满足时程序才会暂停执行。</P></FONT><FONT size=3><P align=justify>CBuilder</FONT><FONT face=宋体 size=3>允许创建和使用两种类型的断点条件:布尔类型的断点条件和通过断点次数。布尔类型的断点中可以设置条件表达式,当程序运行通过该断点时,调试器会自动计算条件表达式的值,如果结果为真,则暂停程序,否则程序继续运行。通过断点次数则可以为断点设置一个通过次数值,当程序每通过一次该断点,调试器都会自动计数一次,当计数值达到或超过设置值时才会暂停程序。条件断点的使用大大增强了调试器的功能,使得调试手段更加灵活。但是,由于调试器在每次通过条件断点时,都要作一些检查和判断,因此过多的条件断点可能会使调试运行的速度下降。</P><P align=justify>设置条件断点的方法是,先将光标移到需要添加断点的位置处,选择</FONT><FONT face="宋体, MS Song" size=3>Run-&gt;Add Breakpoint-&gt;Source Breadpoint</FONT><FONT face=宋体 size=3>命令,弹出如图</FONT><FONT face="宋体, MS Song" size=3>7-2</FONT><FONT face=宋体 size=3>所示的添加断点对话框,该对话框中标出了断点所在的源文件名和语句位置,另外还有布尔条件输入框(</FONT><FONT face="宋体, MS Song" size=3>Condition</FONT><FONT face=宋体 size=3>)和通过次数设置框(</FONT><FONT face="宋体, MS Song" size=3>Pass count</FONT><FONT face=宋体 size=3>),如果要创建的是无条件断点,则</FONT><FONT face="宋体, MS Song" size=3>Condition</FONT><FONT face=宋体 size=3>应为空,</FONT><FONT face="宋体, MS Song" size=3>Pass count</FONT><FONT face=宋体 size=3>为</FONT><FONT face="宋体, MS Song" size=3>0</FONT><FONT face=宋体 size=3>;如果创建布尔型的条件断点,则在</FONT><FONT face="宋体, MS Song" size=3>Condition</FONT><FONT face=宋体 size=3>中输入一个条件判断表达式;如果要创建通过次数类型的断点,则在</FONT><FONT face="宋体, MS Song" size=3>Pass count</FONT><FONT face=宋体 size=3>中设置通过次数值。如果断点同时设置了布尔条件和通过次数,则必需同时满足条件时程序才会暂停,而且只有在布尔条件为真时,计数值才会增加,直到计数值达到通过次数时才算满足条件。</P><P align=justify>如果工程中添加了多个断点,可以选择菜单命令</FONT><FONT face="宋体, MS Song" size=3>View-&gt;Debug Windows-&gt;Breakpoints</FONT><FONT face=宋体 size=3>,调出如图</FONT><FONT face="宋体, MS Song" size=3>7-3</FONT><FONT face=宋体 size=3>所示的断点列表窗口,断点列表窗口不仅可以查看所有的断点,还可以通过窗口内的关联菜单进行添加、删除断点、设置断点的有效性、或者修改断点的属性。修改断点的属性与添加断点所进行的设置内容差不多,包括其所在的文件、语句行号、布尔条件、通过次数、断点操作和是否有效等。当应用程序暂时不需要某些断点时,还可以设置这些断点处于无效状态,无效的断点对应用程序的调试不产生影响。如果以后需要重新使用这些断点,可以使之恢复为有效状态。</P><UL><B><P align=justify><LI>使用监视器 <p></LI></UL></B><P align=justify>监视器是程序调试过程中另一个最常用的工具。监视器可以监视一个变量,也可以监视包含变量的表达式,表达式中可以有数学运算和逻辑运算,但是不能包含函数调用。添加监视的方法有多种,最简单的方法是在将光标移到要监视的变量上(或者将要监视的表达式选中),按鼠标右键调出关联菜单,选择其中的</FONT><FONT face="宋体, MS Song" size=3>Debug-&gt;Add Watch at Cursor</FONT><FONT face=宋体 size=3>菜单命令,就能将其添加到工程的监视列表(</FONT><FONT face="宋体, MS Song" size=3>Watch List</FONT><FONT face=宋体 size=3>)中。另外一种方法是选择菜单命令</FONT><FONT face="宋体, MS Song" size=3>Run-&gt;Add Watch</FONT><FONT face=宋体 size=3>,调出如图</FONT><FONT face="宋体, MS Song" size=3>7-4</FONT><FONT face=宋体 size=3>所示的监视属性对话框,对话框中除了可以设置要监视的表达式,还可以设置监视的重复次数(</FONT><FONT face="宋体, MS Song" size=3>Repeat Count</FONT><FONT face=宋体 size=3>),以及监视值显示的格式。工程中所有的监视都会显示在监视窗口中,当工程在调试环境下运行时,监视窗口会自动显示被监视的变量或表达式的取值。监视窗口如图</FONT><FONT face="宋体, MS Song" size=3>7-5</FONT><FONT face=宋体 size=3>所示,除了显示监视点之外,我们还可以在该窗口中添加、编辑、删除监视点。</P><P align=justify>在</FONT><FONT face="宋体, MS Song" size=3>Cbuilder</FONT><FONT face=宋体 size=3>集成调试环境中,不仅可以监视应用程序在运行过程中变量值的变化情况,同时也可以计算和更改变量的值。计算和更改变量值的方法如下,在代码编辑器中合适的代码行上设置断点,运行应用程序到断点所在的代码行,选择</FONT><FONT face="宋体, MS Song" size=3>Run-&gt;Evaluate/Modify</FONT><FONT face=宋体 size=3>菜单项,打开如图</FONT><FONT face="宋体, MS Song" size=3>7-6</FONT><FONT face=宋体 size=3>所示的计算修改对话框。在表达式编辑框中输入需要监视的变量或表达式,在对话框工具栏上按下</FONT><FONT face="宋体, MS Song" size=3>Evaluate</FONT><FONT face=宋体 size=3>按钮,就可以计算出所设定变量或表达式的值。如果想修改变量值,可以在对话框的</FONT><FONT face="宋体, MS Song" size=3>New value</FONT><FONT face=宋体 size=3>编辑框中输入新的变量值,然后按下工具栏上的</FONT><FONT face="宋体, MS Song" size=3>Modify</FONT><FONT face=宋体 size=3>按钮。通过更改运行时变量的取值,可以人为地改变应用程序的运行状态,更好地检查应用程序中是否包含错误。</P><P align=justify> </P><P align=justify>本讲介绍了</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>的基本调试工具及其使用方法,由于调试程序是一项经验性非常强的工作,朋友们还需要在实践中多摸索,才能更好地掌握调试技巧,提高程序开发的总体效率。</P></FONT>
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

<b><FONT face=宋体 size=6> </FONT></b>< align=center>设计用户界面</P><FONT face=宋体 size=3>< align=justify>经过前面几讲的学习后,我们已经了解了</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>各个部件的基本使用方法,并且学习了如何用</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>来生成、编译、连接和运行一个工程,这些都是今后我们使用</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>进行编程的基础。</P></FONT><FONT size=3>< align=justify>CBuilder</FONT><FONT face=宋体 size=3>缺省生成的工程只是一个框架,并没有完成任何实际的功能,因此从本讲起,心铃将带领大家为这个缺省工程添砖加瓦,让它成为一个真正的</FONT><FONT size=3>MP3</FONT><FONT face=宋体 size=3>收藏和播放程序。本讲中我们首先要利用窗体编辑器和对象浏览器来为</FONT><FONT size=3>Mp3Collect</FONT><FONT face=宋体 size=3>工程设计用户界面,图</FONT><FONT size=3>8-1</FONT><FONT face=宋体 size=3>是程序最终完成并运行后的用户界面,这也就是我们的设计目标。</P><UL><B>< align=justify><LI>添加列表框控件
2 x' W- D( G: L$ L: T</LI></UL></B>< align=justify>第二讲曾经介绍过,</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>提供有大量功能强大的元件,我们在开发应用程序过程中,通常会根据程序的功能和要求,首先考虑尽量使用现成的元件,以便减轻编程的工作量,只有当现成元件无法满足要求时才自己创建新的元件。</P></FONT><FONT size=3>< align=justify>Mp3Collect</FONT><FONT face=宋体 size=3>的核心功能是管理</FONT><FONT size=3>MP3</FONT><FONT face=宋体 size=3>音乐,因此需要一个控件用于记录显示,这里我们选择具有分列显示功能的列表框,即位于</FONT><FONT size=3>Win32</FONT><FONT face=宋体 size=3>元件栏中的</FONT><FONT size=3>ListView</FONT><FONT face=宋体 size=3>控件。</FONT><FONT size=3>ListView</FONT><FONT face=宋体 size=3>控件是一个可以用多种形式来显示用户信息的窗体控件,</FONT><FONT size=3>Windows</FONT><FONT face=宋体 size=3>资源管理器中的文件信息就是用</FONT><FONT size=3>ListView</FONT><FONT face=宋体 size=3>控件来显示的,还有我们熟悉的</FONT><FONT size=3>NetAnts</FONT><FONT face=宋体 size=3>也使用了</FONT><FONT size=3>ListView</FONT><FONT face=宋体 size=3>控件来显示需要下载的任务,可见它的用途相当广泛。</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>的</FONT><FONT size=3>VCL</FONT><FONT face=宋体 size=3>库中提供了</FONT><FONT size=3>TListView</FONT><FONT face=宋体 size=3>类来封装</FONT><FONT size=3>ListView</FONT><FONT face=宋体 size=3>控件,同时还提供了</FONT><FONT size=3>TListItem</FONT><FONT face=宋体 size=3>类和</FONT><FONT size=3>TListColumn</FONT><FONT face=宋体 size=3>类,分别用于封装</FONT><FONT size=3>ListView</FONT><FONT face=宋体 size=3>控件中的列表项和列表头,在后面编写具体代码时,我们就要与这三个类打交道。</P>< align=justify>第三讲曾经介绍过向窗体中添加元件的两种方法,一种方法是双击元件板中需要添加的元件,例如这里的</FONT><FONT face="宋体, MS Song" size=3>ListView</FONT><FONT face=宋体 size=3>控件,它就会自动出现在窗体中央,另一种方法是单击元件板中的元件,然后在窗体的某个位置上单击一次,选定的元件就会出现在指定位置处。</P>< align=justify>我们首先选中</FONT><FONT face="宋体, MS Song" size=3>Mp3Collect</FONT><FONT face=宋体 size=3>的主窗体,拖动其边框将窗体扩大到合适的大小,然后按照上述方法为窗体中添加一个列表框控件。刚放入的列表框控件的大小和位置可能还需要调整,此时可以拖动控件来移动位置,或者先选中它,然后拖动它周围出现的小黑框来改变其大小,如此重复操作,直到你对控件的大小和位置都满意为止。</P>< align=justify>新加入的控件都有缺省的名字,例如列表框控件为</FONT><FONT face="宋体, MS Song" size=3>ListView1</FONT><FONT face=宋体 size=3>,按钮为。。。,再次添加同一类控件时,新控件的名字将为</FONT><FONT face="宋体, MS Song" size=3>ListView2</FONT><FONT face=宋体 size=3>或。。。,依此类推。如果你想为控件更改一个名字,可以先选中它,然后在对象浏览器中修改。。。属性。</P></FONT><FONT size=3>< align=justify>ListView</FONT><FONT face=宋体 size=3>控件有四种显示方式:大图标、小图标、列表和报表(想想资源管理器文件窗口的四种显示方式),在</FONT><FONT size=3>Mp3Collect</FONT><FONT face=宋体 size=3>中,我们要使用具有分列显示功能的报表方式来显示歌曲记录。由于新添加的</FONT><FONT size=3>ListView</FONT><FONT face=宋体 size=3>控件缺省为。。。方式,我们需要修改决定</FONT><FONT size=3>ListView</FONT><FONT face=宋体 size=3>控件显示方式的</FONT><FONT size=3>ViewStyle</FONT><FONT face=宋体 size=3>属性,该属性是可读可写的,而且在设计时和运行时都可以更改,它有四种取值:</FONT><FONT size=3>vsIcon</FONT><FONT face=宋体 size=3>、</FONT><FONT size=3>vsSmallIcon</FONT><FONT face=宋体 size=3>、</FONT><FONT size=3>vsList</FONT><FONT face=宋体 size=3>和</FONT><FONT size=3>vsReport</FONT><FONT face=宋体 size=3>,分别代表四种显示方式。选中</FONT><FONT size=3>ListView</FONT><FONT face=宋体 size=3>控件后,在对象浏览器中选中</FONT><FONT size=3>ViewStyle</FONT><FONT face=宋体 size=3>属性,其属性值输入框自动变成下拉式列表框,选择</FONT><FONT size=3>vsReport</FONT><FONT face=宋体 size=3>,就可以把</FONT><FONT size=3>ListView</FONT><FONT face=宋体 size=3>控件的显示方式设置为报表方式。</P>< align=justify> </P>< align=justify>接下来我们要设置列表中的表头,即</FONT><FONT face="宋体, MS Song" size=3>ListView</FONT><FONT face=宋体 size=3>控件中的列标题。在对象浏览器中选择</FONT><FONT face="宋体, MS Song" size=3>ListView</FONT><FONT face=宋体 size=3>控件</FONT><FONT face="宋体, MS Song" size=3>Columns</FONT><FONT face=宋体 size=3>属性,单击属性值输入框右侧的“…”按钮,调出列表控件表头编辑框,如图</FONT><FONT face="宋体, MS Song" size=3>8-2</FONT><FONT face=宋体 size=3>所示。对话框的工具栏上有四个按钮,分别用于添加表头项、删除表头项以及调整表头项显示的顺序。每添加一个表头项,对象浏览器都会显示出新添表头项的属性,我们可以在其中输入表头的标题及列的宽度,按照这样的方法为</FONT><FONT face="宋体, MS Song" size=3>ListView</FONT><FONT face=宋体 size=3>控件添加三个列标题:文件名称、歌曲名称和歌手。</P>< align=justify>设计阶段所需要设置的</FONT><FONT face="宋体, MS Song" size=3>ListView</FONT><FONT face=宋体 size=3>属性就只有这么多,其他属性值直接采用缺省值,包括其缺省的对象名称</FONT><FONT face="宋体, MS Song" size=3>ListView1</FONT><FONT face=宋体 size=3>。由于</FONT><FONT face="宋体, MS Song" size=3>ListView</FONT><FONT face=宋体 size=3>控件的属性较多,这里不可能一一介绍,不过在后续的讲座中还会多次通过实际代码,具体介绍该控件的使用方法的。</P>< align=justify> </P>< align=justify> </P>< align=justify>如图</FONT><FONT face="宋体, MS Song" size=3>1</FONT><FONT face=宋体 size=3>所示,列表框控件分为</FONT><FONT face="宋体, MS Song" size=3>3</FONT><FONT face=宋体 size=3>列,分别显示文件路径、歌曲名称和歌手姓名。</P>< align=justify>为了便于添加和修改记录,窗体中使用三个编辑框(</FONT><FONT face="宋体, MS Song" size=3>Standard</FONT><FONT face=宋体 size=3>元件栏中的</FONT><FONT face="宋体, MS Song" size=3>Edit</FONT><FONT face=宋体 size=3>控件)用于获取用户输入,以及三个标签控件(</FONT><FONT face="宋体, MS Song" size=3>Standard</FONT><FONT face=宋体 size=3>元件栏中的</FONT><FONT face="宋体, MS Song" size=3>Label</FONT><FONT face=宋体 size=3>控件)用于提示编辑框的用途。由于手工输入文件名的方式比较麻烦,所以在程序中设计了文件浏览、获取文件名的功能,当用户点击文件名输入框右侧的“…”按钮时,可以调出标准的</FONT><FONT face="宋体, MS Song" size=3>Windows</FONT><FONT face=宋体 size=3>文件浏览对话框来获取</FONT><FONT face="宋体, MS Song" size=3>MP3</FONT><FONT face=宋体 size=3>歌曲的路径和文件名。其中“…”按钮是由命令按钮(</FONT><FONT face="宋体, MS Song" size=3>Standard</FONT><FONT face=宋体 size=3>元件栏中的</FONT><FONT face="宋体, MS Song" size=3>Button</FONT><FONT face=宋体 size=3>控件)实现,而标准文件浏览对话框则使用了</FONT><FONT face="宋体, MS Song" size=3>Dialogs</FONT><FONT face=宋体 size=3>元件栏中的</FONT><FONT face="宋体, MS Song" size=3>OpenDialog</FONT><FONT face=宋体 size=3>控件。</P>< align=justify>用户对记录的操作共有五种,分别是添加、修改、删除、查找和显示所有歌曲,分别用五个命令按钮控件实现,另外还在窗体中设计了“退出”按钮用于退出程序运行。</P>< align=justify>除了对</FONT><FONT face="宋体, MS Song" size=3>MP3</FONT><FONT face=宋体 size=3>文件记录进行操作之外,程序的另外一个重要功能是播放</FONT><FONT face="宋体, MS Song" size=3>MP3</FONT><FONT face=宋体 size=3>歌曲。有的朋友也许会问,播放</FONT><FONT face="宋体, MS Song" size=3>MP3</FONT><FONT face=宋体 size=3>音乐是不是很难?当然,如果需要自己来做</FONT><FONT face="宋体, MS Song" size=3>MP3</FONT><FONT face=宋体 size=3>的解码和音频数据的播放肯定是很难的,好在我们可以利用现成的控件——媒体播放控件(</FONT><FONT face="宋体, MS Song" size=3>System</FONT><FONT face=宋体 size=3>元件栏中的</FONT><FONT face="宋体, MS Song" size=3>MediaPlayer</FONT><FONT face=宋体 size=3>控件),这个控件支持多种媒体文件格式,包括</FONT><FONT face="宋体, MS Song" size=3>CD</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>MIDI</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>WAV</FONT><FONT face=宋体 size=3>以及现在最流行的</FONT><FONT face="宋体, MS Song" size=3>MP3</FONT><FONT face=宋体 size=3>音乐,功能很全面,而且使用起来也非常方便,后面还会详细介绍其使用方法。</P>< align=justify>为了使播放时具有循环播放的功能,窗体上设计了一个选项按钮(</FONT><FONT face="宋体, MS Song" size=3>Standard</FONT><FONT face=宋体 size=3>元件栏中的</FONT><FONT face="宋体, MS Song" size=3>CheckBox</FONT><FONT face=宋体 size=3>控件)。除了以上的主要功能控件以外,为了美观起见,我们还用了一个组合框将位于窗体上半部分的控件包括在一起。</P><B>< align=justify>元件的布局设计</P></B>< align=justify>第三讲中介绍过,向窗体添加元件的方法很简单,可以双击元件板中的所需要元件,它会自动出现在窗体的中央,也可以单击元件板中的所需元件,然后在窗体的指定位置上单击一次,所选定的元件便会出现在指定位置上。直接放置在窗体中的元件的大小和位置,往往不能完全符合应用程序的界面设计要求,特别是当窗体中的元件比较多时,更需要借助</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>的窗体元件布局工具来调整元件的大小和位置,使其更加整齐、美观。</P>< align=justify>在对任何一个元件做进一步的操作之前,首先需要将其选中,方法是用鼠标单击该元件,此时元件的四周将出现一个虚拟的边框,边框由上、下、左、右、左上、左下、右上、右下位置上的八个黑色控制点组成,如图</FONT><FONT face="宋体, MS Song" size=3>2</FONT><FONT face=宋体 size=3>所示。将鼠标按住边框内的一点并拖动,即可在保持元件大小情况下改变元件的位置。而当鼠标按住边框上的控制点并拖动时,可以使得元件的大小发生相应的变化。</P>< align=justify>除了选中单个元件,</FONT><FONT face="宋体, MS Song" size=3>CBuilder IDE</FONT><FONT face=宋体 size=3>还允许我们同时选中多个元件。选取多个元件的方法是用鼠标在窗体上划出一个虚框,虚框内的元件会被同时选中。另外还可以在按下</FONT><FONT face="宋体, MS Song" size=3>Shift</FONT><FONT face=宋体 size=3>键的同时用鼠标单击来选取多个元件,被选中的多个元件如图</FONT><FONT face="宋体, MS Song" size=3>3</FONT><FONT face=宋体 size=3>所示,选中元件的四周会出现灰色的控制点,这时不能够再通过鼠标拖动的方式来改变元件的大小,但是还可以利用其它更有效的方法同时改变多个元件的大小和位置。下面介绍的方法如不特别说明,对单个对象和多个对象都是有效的。</P>< align=justify>首先可以利用的工具是对象浏览器,随着所选元件对象的改变,对象浏览器会自动显示当前选中元件的属性(如果是多个元件对象被同时选中,对象浏览器中显示的是它们的共有的属性),利用对象浏览器可以改变元件的布局属性,如</FONT><FONT face="宋体, MS Song" size=3>Top</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>Left</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>Height</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>Width</FONT><FONT face=宋体 size=3>等布局属性,优点是非常精确,可以不受网格对齐的约束,能够精确到</FONT><FONT face="宋体, MS Song" size=3>1</FONT><FONT face=宋体 size=3>个象素,而缺点则是不如鼠标拖动的方式来得直观。</P>< align=justify>除了对象浏览器,菜单命令也是设计中常用的工具。</FONT><FONT face="宋体, MS Song" size=3>Edit</FONT><FONT face=宋体 size=3>菜单为元件布局操作提供了一组命令,分别是</FONT><FONT face="宋体, MS Song" size=3>Size</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>Scale</FONT><FONT face=宋体 size=3>和</FONT><FONT face="宋体, MS Song" size=3>Align</FONT><FONT face=宋体 size=3>,每个命令对应一个设置对话框。在对话框中选择合适的选项,然后单击</FONT><FONT face="宋体, MS Song" size=3>OK</FONT><FONT face=宋体 size=3>按钮,就可以一次性改变所有选中对象的大小及位置属性,例如,</FONT><FONT face="宋体, MS Song" size=3>MP3Collect</FONT><FONT face=宋体 size=3>主窗体中的六个命令按钮控件,可以通过使用</FONT><FONT face="宋体, MS Song" size=3>Size</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>Align</FONT><FONT face=宋体 size=3>命令使它们大小相等,并按两行三列排列整齐。需要注意的是</FONT><FONT face="宋体, MS Song" size=3>Scale</FONT><FONT face=宋体 size=3>命令的作用对象不仅是选中的元件,窗体上所有元件(除了窗体本身),包括元件表面的字体,都会按照一定的比例放大或缩小。</P>< align=justify>除了</FONT><FONT face="宋体, MS Song" size=3>Align</FONT><FONT face=宋体 size=3>对话框之外,还可以使用</FONT><FONT face="宋体, MS Song" size=3>Align</FONT><FONT face=宋体 size=3>工具栏进行元件的对齐操作。</FONT><FONT face="宋体, MS Song" size=3>Align</FONT><FONT face=宋体 size=3>工具栏如图</FONT><FONT face="宋体, MS Song" size=3>4</FONT><FONT face=宋体 size=3>所示,工具栏中包含</FONT><FONT face="宋体, MS Song" size=3>10</FONT><FONT face=宋体 size=3>个快捷按钮,可以方便地进行左右对齐、上下对齐、居中对齐等操作。缺省状态下,</FONT><FONT face="宋体, MS Song" size=3>Align</FONT><FONT face=宋体 size=3>工具栏是隐藏起来的,可以通过</FONT><FONT face="宋体, MS Song" size=3>View|Alignment Palette</FONT><FONT face=宋体 size=3>菜单将其显示在窗口的最前端。</P>< align=justify>当窗体上的元件数量比较多时,有的元件可能会位于其它元件的上面,这时我们可能需要调整某些元件的叠放层次,方法是在所选元件上调出关联菜单,选择其中的</FONT><FONT face="宋体, MS Song" size=3>Bring to Front</FONT><FONT face=宋体 size=3>和</FONT><FONT face="宋体, MS Song" size=3>Send to Back</FONT><FONT face=宋体 size=3>菜单命令改变元件的叠放层次。</P>< align=justify>在设计窗体时,还需要考虑元件的</FONT><FONT face="宋体, MS Song" size=3>Tab</FONT><FONT face=宋体 size=3>次序,即用户按下</FONT><FONT face="宋体, MS Song" size=3>Tab</FONT><FONT face=宋体 size=3>键时,各个元件获得键盘输入焦点的次序。不过,具有</FONT><FONT face="宋体, MS Song" size=3>Tab</FONT><FONT face=宋体 size=3>次序的元件都是能够获得键盘输入的元件,对于标签控件和快捷按钮控件来说,由于不会获得键盘输入,因此这一类的元件也就没有</FONT><FONT face="宋体, MS Song" size=3>Tab</FONT><FONT face=宋体 size=3>次序。控件缺省的</FONT><FONT face="宋体, MS Song" size=3>Tab</FONT><FONT face=宋体 size=3>次序是按照设计时元件的添加顺序,也可以在对象浏览器中修改元件的</FONT><FONT face="宋体, MS Song" size=3>TabStop</FONT><FONT face=宋体 size=3>和</FONT><FONT face="宋体, MS Song" size=3>TabOrder</FONT><FONT face=宋体 size=3>属性来调整元件的</FONT><FONT face="宋体, MS Song" size=3>Tab</FONT><FONT face=宋体 size=3>次序,或者选择</FONT><FONT face="宋体, MS Song" size=3>Edit|Tab Order</FONT><FONT face=宋体 size=3>菜单,调出</FONT><FONT face="宋体, MS Song" size=3>Tab</FONT><FONT face=宋体 size=3>次序编辑对话框,来调整元件元件的</FONT><FONT face="宋体, MS Song" size=3>Tab</FONT><FONT face=宋体 size=3>次序。</P>< align=justify>在设计窗体时,我们还可以利用拷贝和粘贴命令来拷贝和粘贴元件,新粘贴的元件和原来的元件除了名称不同之外,具有完全相同的属性。因此设计好一个元件的属性,再通过拷贝和粘贴的方法添加其它类似的元件,也是提高设计效率的常用方法。</P><P align=justify>在调整好窗体中各个元件的位置之后,可以选择</FONT><FONT face="宋体, MS Song" size=3>Edit|Lock Controls</FONT><FONT face=宋体 size=3>菜单命令,来锁定窗体中的各个元件。锁定后的各个元件的位置和大小不能再改变了。如果希望重新修改时,需要再次选择</FONT><FONT face="宋体, MS Song" size=3>Edit|Lock Controls</FONT><FONT face=宋体 size=3>菜单解除锁定。</P><B><P align=justify>元件的属性</P></B><P align=justify>接下来,我们要为窗体上的每个元件设置合适的属性,同时也要学习这些常用元件的使用方法。</P><P align=justify>首先设置</FONT><FONT face="宋体, MS Song" size=3>ListView</FONT><FONT face=宋体 size=3>控件的属性。</FONT><FONT face="宋体, MS Song" size=3>ListView</FONT><FONT face=宋体 size=3>控件是一个可以用多种形式来显示用户信息的窗体控件,</FONT><FONT face="宋体, MS Song" size=3>Windows</FONT><FONT face=宋体 size=3>资源管理器中的文件信息就是用</FONT><FONT face="宋体, MS Song" size=3>ListView</FONT><FONT face=宋体 size=3>控件来显示的,另外,还有我们大家所熟悉的</FONT><FONT face="宋体, MS Song" size=3>NetAnts</FONT><FONT face=宋体 size=3>中也使用了</FONT><FONT face="宋体, MS Song" size=3>ListView</FONT><FONT face=宋体 size=3>控件来显示需要下载的任务,因此它是一个用途很广泛的控件。</FONT><FONT face="宋体, MS Song" size=3>CBuilder VCL</FONT><FONT face=宋体 size=3>库中提供了</FONT><FONT face="宋体, MS Song" size=3>TListView</FONT><FONT face=宋体 size=3>类封装</FONT><FONT face="宋体, MS Song" size=3>ListView</FONT><FONT face=宋体 size=3>控件,同时还提供了</FONT><FONT face="宋体, MS Song" size=3>TListItem</FONT><FONT face=宋体 size=3>类和</FONT><FONT face="宋体, MS Song" size=3>TListColumn</FONT><FONT face=宋体 size=3>类,分别用于封装</FONT><FONT face="宋体, MS Song" size=3>ListView</FONT><FONT face=宋体 size=3>控件中的列表项和列表头。</P></FONT><FONT size=3><P align=justify>ListView</FONT><FONT face=宋体 size=3>控件有四种显示形式:大图标、小图标、列表和报表,这里我们选用具有分列显示功能的报表形式来显示歌曲记录。显示方式由其属性</FONT><FONT size=3>ViewStyle</FONT><FONT face=宋体 size=3>决定。该属性是可读可写的,而且在设计时和运行时都可以更改。该属性的可能取值有四种:</FONT><FONT size=3>vsIcon</FONT><FONT face=宋体 size=3>、</FONT><FONT size=3>vsSmallIcon</FONT><FONT face=宋体 size=3>、</FONT><FONT size=3>vsList</FONT><FONT face=宋体 size=3>和</FONT><FONT size=3>vsReport</FONT><FONT face=宋体 size=3>,分别代表它的四种显示方式,选中该控件后,在对象浏览器中选中</FONT><FONT size=3>ViewStyle</FONT><FONT face=宋体 size=3>属性,其属性值输入框自动变成下拉式列表框,从其中选出</FONT><FONT size=3>vsReport</FONT><FONT face=宋体 size=3>,就可以将</FONT><FONT size=3>ListView</FONT><FONT face=宋体 size=3>控件的显示方式设置为报表形式。</P><P align=justify>接下来我们要设置列表中的表头,即</FONT><FONT face="宋体, MS Song" size=3>ListView</FONT><FONT face=宋体 size=3>控件中的列标题。在对象浏览器中选择</FONT><FONT face="宋体, MS Song" size=3>ListView</FONT><FONT face=宋体 size=3>控件</FONT><FONT face="宋体, MS Song" size=3>Columns</FONT><FONT face=宋体 size=3>属性,单击属性值输入框右侧的“…”按钮,调出列表控件表头编辑框,如图</FONT><FONT face="宋体, MS Song" size=3>5</FONT><FONT face=宋体 size=3>所示。对话框的工具栏上有四个按钮,分别用于添加表头项、删除表头项以及调整表头项显示的顺序。每添加一个表头项,对象浏览器都会显示出新添表头项的属性,我们可以在其中输入表头的标题及列的宽度,按照这样的方法为</FONT><FONT face="宋体, MS Song" size=3>ListView</FONT><FONT face=宋体 size=3>控件添加三个列标题:文件名称、歌曲名称和歌手。</P><P align=justify>设计阶段所需要设置的</FONT><FONT face="宋体, MS Song" size=3>ListView</FONT><FONT face=宋体 size=3>属性就只有这么多,其他属性值直接采用缺省值,包括其缺省的对象名称</FONT><FONT face="宋体, MS Song" size=3>ListView1</FONT><FONT face=宋体 size=3>。由于</FONT><FONT face="宋体, MS Song" size=3>ListView</FONT><FONT face=宋体 size=3>控件的属性较多,这里不可能一一介绍,不过在后续的讲座中还会多次通过实际代码,具体介绍该控件的使用方法的。</P><P align=justify>接下来设置用于将小元件组合在一起的组合框控件的属性。当窗体上的元件较多时,常常需要把逻辑上相关联的元件组合在一起,使用户界面显得整齐、有条理,也便于同时控制多个元件。</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>中有多个元件可以用来把元件分组,它们分别是</FONT><FONT face="宋体, MS Song" size=3>Standard</FONT><FONT face=宋体 size=3>元件栏中的</FONT><FONT face="宋体, MS Song" size=3>GroupBox</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>RadioGroup</FONT><FONT face=宋体 size=3>和</FONT><FONT face="宋体, MS Song" size=3>Panel</FONT><FONT face=宋体 size=3>,</FONT><FONT face="宋体, MS Song" size=3>Win32</FONT><FONT face=宋体 size=3>元件栏上的</FONT><FONT face="宋体, MS Song" size=3>ToolBar</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>PageControl</FONT><FONT face=宋体 size=3>等,这些元件又叫做包容器元件(</FONT><FONT face="宋体, MS Song" size=3>Container Components</FONT><FONT face=宋体 size=3>)。使用包容器元件的原则是先在窗体上添加包容器元件,在选中该包容器元件的情况下添加其它元件。例如,在本程序中应先添加组合框控件</FONT><FONT face="宋体, MS Song" size=3>GroupBox1</FONT><FONT face=宋体 size=3>,再依次添加标签、编辑框、按钮、媒体播放控件等,每添加一个元件之前,都应先选中</FONT><FONT face="宋体, MS Song" size=3>GroupBox1</FONT><FONT face=宋体 size=3>对象。这时我们可以看到,添加到组内的元件已经不能再把它们移动到</FONT><FONT face="宋体, MS Song" size=3>GroupBox1</FONT><FONT face=宋体 size=3>之外去了,而且当我们拖动</FONT><FONT face="宋体, MS Song" size=3>GroupBox1</FONT><FONT face=宋体 size=3>时,其中的所有元件都会跟着一起移动,不用担心相对位置会被弄乱。在本程序中,</FONT><FONT face="宋体, MS Song" size=3>GroupBox1</FONT><FONT face=宋体 size=3>的作用主要是将小的、零碎的元件组合在一起,使它们看起来比较美观,所以并没有太多属性需要设置,只需要将其标题(</FONT><FONT face="宋体, MS Song" size=3>Caption</FONT><FONT face=宋体 size=3>)属性设为空字符串</FONT><FONT face="宋体, MS Song" size=3>""</FONT><FONT face=宋体 size=3>就可以了。</P><P align=justify>窗体中的“文件名”、“歌曲名称”和“歌手”为标签控件(</FONT><FONT face="宋体, MS Song" size=3>Standard</FONT><FONT face=宋体 size=3>元件栏的</FONT><FONT face="宋体, MS Song" size=3>Label</FONT><FONT face=宋体 size=3>控件),该控件主要用于标识和提示用户注意,它最重要的属性为</FONT><FONT face="宋体, MS Song" size=3>Caption</FONT><FONT face=宋体 size=3>属性,即其显示的内容,另外该控件还有一个</FONT><FONT face="宋体, MS Song" size=3>AutoSize</FONT><FONT face=宋体 size=3>属性,表示控件的大小是否根据</FONT><FONT face="宋体, MS Song" size=3>Caption</FONT><FONT face=宋体 size=3>的内容自动调节,本程序中将三个标签的</FONT><FONT face="宋体, MS Song" size=3>AutoSize</FONT><FONT face=宋体 size=3>属性都设为真(</FONT><FONT face="宋体, MS Song" size=3>true</FONT><FONT face=宋体 size=3>),并将其字体颜色(</FONT><FONT face="宋体, MS Song" size=3>Font-&gt;Color</FONT><FONT face=宋体 size=3>)属性设为蓝色。</P><P align=justify>三个编辑框分别用于显示当前选中记录的各项内容,也可以让用户输入新的记录和修改已有的记录,还可以用于输入记录查询条件。编辑框控件可以让用户在其中输入和编辑文本,其最重要的属性是</FONT><FONT face="宋体, MS Song" size=3>Text</FONT><FONT face=宋体 size=3>属性,程序可以读写此属性来获取用户的输入和设置编辑框中显示的内容。在设计时,通过对象编辑器我们将三个编辑框的对象名称分别设置为</FONT><FONT face="宋体, MS Song" size=3>EdtFileName</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>EdtSongName</FONT><FONT face=宋体 size=3>和</FONT><FONT face="宋体, MS Song" size=3>EdtSingerName</FONT><FONT face=宋体 size=3>。并把三个编辑框的</FONT><FONT face="宋体, MS Song" size=3>Text</FONT><FONT face=宋体 size=3>属性置为空字符串</FONT><FONT face="宋体, MS Song" size=3>""</FONT><FONT face=宋体 size=3>。</P><P align=justify>窗体中的六个命令按钮和“…”按钮使用命令按钮按钮来实现。它们的的属性设置比较简单,只是将其</FONT><FONT face="宋体, MS Song" size=3>Name</FONT><FONT face=宋体 size=3>依次设置为:</FONT><FONT face="宋体, MS Song" size=3>btnAdd</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>btnModify</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>btnDelete</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>btnFind</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>btnShowAll</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>btnExit</FONT><FONT face=宋体 size=3>和</FONT><FONT face="宋体, MS Song" size=3>btnFileName</FONT><FONT face=宋体 size=3>,相应的</FONT><FONT face="宋体, MS Song" size=3>Caption</FONT><FONT face=宋体 size=3>属性如图</FONT><FONT face="宋体, MS Song" size=3>1</FONT><FONT face=宋体 size=3>中所示。除了这种普通的命令按钮,</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>还提供了图形按钮(</FONT><FONT face="宋体, MS Song" size=3>Additional</FONT><FONT face=宋体 size=3>元件栏中的</FONT><FONT face="宋体, MS Song" size=3>BitBtn</FONT><FONT face=宋体 size=3>控件)和快捷按钮(</FONT><FONT face="宋体, MS Song" size=3>Additional</FONT><FONT face=宋体 size=3>元件栏中的</FONT><FONT face="宋体, MS Song" size=3>SpeedButton</FONT><FONT face=宋体 size=3>)两种按钮,这几种按钮的功能基本一样,用于发送某个操作命令,但比普通按钮增加了一些功能,例如图形支持和平坦表面的效果。以</FONT><FONT face="宋体, MS Song" size=3>SpeedButton</FONT><FONT face=宋体 size=3>为例,不仅可以单独使用,也可以用于工具栏中的快捷按钮。</FONT><FONT face="宋体, MS Song" size=3>SpeedButton</FONT><FONT face=宋体 size=3>控件具有</FONT><FONT face="宋体, MS Song" size=3>Flat</FONT><FONT face=宋体 size=3>属性,当其为真时,平时是平坦的,只有当用户将鼠标移动到该控件的上方时,它的边缘才会凸起。</FONT><FONT face="宋体, MS Song" size=3>SpeedButton</FONT><FONT face=宋体 size=3>控件和</FONT><FONT face="宋体, MS Song" size=3>BitBtn</FONT><FONT face=宋体 size=3>控件都支持图形化的按钮表面,它们都具有</FONT><FONT face="宋体, MS Song" size=3>Glyph</FONT><FONT face=宋体 size=3>属性,</FONT><FONT face="宋体, MS Song" size=3>Glyph</FONT><FONT face=宋体 size=3>属性可以指定四幅大小一样的位图或图标,分别代表其四种状态:抬起、压下、失效、始终保持压下。设置</FONT><FONT face="宋体, MS Song" size=3>Glyph</FONT><FONT face=宋体 size=3>属性的方法是在对象浏览器中选中该属性,单击输入框右侧的“</FONT><FONT face="宋体, MS Song" size=3>…</FONT><FONT face=宋体 size=3>”按钮,调出如图</FONT><FONT face="宋体, MS Song" size=3>6</FONT><FONT face=宋体 size=3>所示的图片编辑器,如果该图片属性本身为空,可以使用</FONT><FONT face="宋体, MS Song" size=3>Load</FONT><FONT face=宋体 size=3>按钮装入一幅位图或图标文件。图片编辑器一次只能调入一个图片文件,而</FONT><FONT face="宋体, MS Song" size=3>SpeedButton</FONT><FONT face=宋体 size=3>控件或</FONT><FONT face="宋体, MS Song" size=3>BitBtn</FONT><FONT face=宋体 size=3>控件的</FONT><FONT face="宋体, MS Song" size=3>Glyph</FONT><FONT face=宋体 size=3>属性最多可以设置四幅图片,这又是怎么实现的呢?首先,需要在控件的</FONT><FONT face="宋体, MS Song" size=3>NumGlyphs</FONT><FONT face=宋体 size=3>属性中设置实际的图片数(最多为</FONT><FONT face="宋体, MS Song" size=3>4</FONT><FONT face=宋体 size=3>),</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>会根据</FONT><FONT face="宋体, MS Song" size=3>NumGlyphs</FONT><FONT face=宋体 size=3>的数值自动将</FONT><FONT face="宋体, MS Song" size=3>Glyph</FONT><FONT face=宋体 size=3>中装载的图片横向等分为几份。并按顺序赋给控件的不同状态。图形化的按钮是非常流行的界面元素,在</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>中实现起来也非常简单,尽管本程序中并没有为按钮添加图形表面,不过有心的读者可以自己试着找几幅漂亮的图片,把几个命令按钮都改成图形按钮,一定会让程序增色不少。</P><P align=justify>“循环播放”选项按钮的属性中,我们只设置其名称为</FONT><FONT face="宋体, MS Song" size=3>chkLoop</FONT><FONT face=宋体 size=3>。以上介绍了窗体中</FONT><FONT face="宋体, MS Song" size=3>Windows</FONT><FONT face=宋体 size=3>常用控件的使用方法,余下的媒体播放控件和“</FONT><FONT face="宋体, MS Song" size=3>OpenDialog</FONT><FONT face=宋体 size=3>”控件会在后面的讲座中结合实际代码再详细介绍。</P><P align=justify> </P><P align=justify>本讲以</FONT><FONT face="宋体, MS Song" size=3>MP3Collect</FONT><FONT face=宋体 size=3>工程为例,介绍了设计用户界面的基本方法以及一些常用元件的属性设置。下一讲要为这些元件添加事件处理代码,使程序的功能完整起来。</P><P align=justify> </P><P align=justify> </P></FONT>
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

<b><FONT face=宋体 size=6> </FONT></b>< align=center>事件和事件处理函数</P><FONT face=宋体 size=3>< align=justify>在上一讲中我们主要学习了如何设计用户界面,了解了向窗体中添加元件、设置元件属性和调整元件的布局的方法,到目前为止,音乐收藏小程序</FONT><FONT face="宋体, MS Song" size=3>MP3Collect</FONT><FONT face=宋体 size=3>的用户界面已经初具雏形了,但是界面上的元件还不能响应用户的输入,因此在本讲中,我们就来为元件添加事件响应函数,让程序真正活起来。</P><UL><B>< align=justify><LI>添加记录
3 _+ N" H/ \0 b# n1 F" a# e</LI></UL></B></FONT><FONT size=3>< align=justify>MP3Collect</FONT><FONT face=宋体 size=3>主要的用途是管理音乐文件,我们首先就来实现添加记录的功能。按照我们的设想,添加记录的功能是由用户按下“添加”按钮时启动的,那么怎样才知道用户按下了这个按钮呢?这就引出了今天要介绍的元件事件及其事件处理函数的问题。</P>< align=justify>讲座前面曾经强调过,</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>开发的应用程序是事件驱动的,用户的操作、系统环境变化以及应用程序之间的相互作用都会触发一些事件,</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>提供的元件可以对这些事件进行响应,每一种元件都有特定的事件集合,该集合与它所实现的功能有关。</P>< align=justify>选中“添加”命令按钮后,调出它在对象浏览器中的事件页(图</FONT><FONT face="宋体, MS Song" size=3>9-1</FONT><FONT face=宋体 size=3>),查看它的事件集合,我们可以发现一个简单的命令按钮能够响应十多个事件,每种事件的名称都具有“</FONT><FONT face="宋体, MS Song" size=3>OnXXXX</FONT><FONT face=宋体 size=3>”的格式,其中前缀“</FONT><FONT face="宋体, MS Song" size=3>On</FONT><FONT face=宋体 size=3>”表示这是事件的名称,而“</FONT><FONT face="宋体, MS Song" size=3>XXXX</FONT><FONT face=宋体 size=3>”则代表了事件的性质。多数事件的名称都很好理解,如果想进一步了解各个事件的详细含义,可以按</FONT><FONT face="宋体, MS Song" size=3>F1</FONT><FONT face=宋体 size=3>键查看联机帮助,例如通过联机帮助我们可以了解到:当用户按下命令按钮时,就会触发</FONT><FONT face="宋体, MS Song" size=3>OnClick</FONT><FONT face=宋体 size=3>事件,因此我们需要响应</FONT><FONT face="宋体, MS Song" size=3>OnClick</FONT><FONT face=宋体 size=3>事件,从而实现添加记录的功能。</P>< align=justify>所谓响应事件,是指为元件的某个事件指定一个且只能指定一个处理函数,当该事件发生时,程序会自动执行该函数。</P>< align=justify>我们在对象浏览器中选中“添加”按钮对象的</FONT><FONT face="宋体, MS Song" size=3>OnClick</FONT><FONT face=宋体 size=3>事件,并在事件名称右侧的编辑框中输入事件处理函数的名称“</FONT><FONT face="宋体, MS Song" size=3>BtnAddSongClick</FONT><FONT face=宋体 size=3>”(可根据需要自行修改),然后按回车键,</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>集成开发环境就会在</FONT><FONT face="宋体, MS Song" size=3>TMainForm</FONT><FONT face=宋体 size=3>文件中自动添加一个空的事件处理函数:</P></FONT><FONT size=3>< align=justify>void __fastcall TMainForm::BtnAddSongClick(TObject *Sender)</P></FONT><FONT face=宋体 size=3>< align=justify>除了上述方法之外,还有好几种可以更方便地添加事件处理函数的方法。一种方法是双击事件名称右侧的空白输入框,便能自动添加一个事件处理函数,自动添加的函数的名称是由元件名称和事件名称组合而来的。另一种方法是直接双击放在窗体上的元件对象本身,</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>就会自动为该元件添加缺省事件的处理函数,</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>的每一种元件都有其缺省的事件。</P>< align=justify>下面我们来给</FONT><FONT face="宋体, MS Song" size=3>TMainForm::BtnAddSongClick</FONT><FONT face=宋体 size=3>添加程序代码,完成添加记录的功能。</P>< align=justify>每条</FONT><FONT face="宋体, MS Song" size=3>MP3</FONT><FONT face=宋体 size=3>音乐记录由三个部分组成:“文件名称”、“歌曲名称”和“歌手名称”,其中“文件名称”是</FONT><FONT face="宋体, MS Song" size=3>MP3</FONT><FONT face=宋体 size=3>歌曲文件所在的路径全名,它是每条记录必须有的内容,而“歌曲名称”和“歌手名称”允许为空字符串,即没有内容。上述三部分信息需要用户在三个编辑框中输入,因此在进行添加记录操作时,程序需要首先读取三个编辑框的内容,并检查其中的“文件名称”是否为空,如果为空,则提醒用户该项目不能为空,并中断添加记录的操作,如果不为空,则可以添加该记录。下面就是这部分代码的内容:</P></FONT><FONT size=3>< align=justify>void __fastcall TMainForm::BtnAddSongClick(TObject *Sender) </P>< align=justify>{</P>< align=justify>if(edtFileName-&gt;Text.IsEmpty())//</FONT><FONT face=宋体 size=3>判断文件名编辑框中是否为空</P>< align=justify>{</P><DIR></FONT><FONT size=3>< align=justify>Application-&gt;MessageBox("</FONT><FONT face=宋体 size=3>文件名称不能为空,请重新输入文件名称</FONT><FONT size=3>","MP3Collect",MB_OK);</P>< align=justify>edtFileName-&gt;SetFocus();//</FONT><FONT face=宋体 size=3>让文件名编辑框获得键盘输入焦点</P><DIR></FONT><FONT size=3>< align=justify>return;</P></DIR></DIR></FONT><FONT face=宋体 size=3>< align=justify>}</P></FONT><FONT size=3>< align=justify>TListItem *newItem=ListView1-&gt;Items-&gt;Add();//</FONT><FONT face=宋体 size=3>列表项集合中添加一个列表项</P></FONT><FONT size=3>< align=justify>newItem-&gt;Caption = edtFileName-&gt;Text;//</FONT><FONT face=宋体 size=3>列表项的标题属性为文件名称</P></FONT><FONT size=3>< align=justify>newItem-&gt;SubItems-&gt;Add(edtSongName-&gt;Text);//</FONT><FONT face=宋体 size=3>添加列表项的第一个子项:歌曲名称</P></FONT><FONT size=3>< align=justify>newItem-&gt;SubItems-&gt;Add(edtSingerName-&gt;Text);// </FONT><FONT face=宋体 size=3>添加列表项的第二个子项:歌手名称</P>< align=justify>}</P>< align=justify>其中,编辑框的内容可以通过读取其</FONT><FONT face="宋体, MS Song" size=3>Text</FONT><FONT face=宋体 size=3>属性来获得,该属性的类型为</FONT><FONT face="宋体, MS Song" size=3>AnsiString</FONT><FONT face=宋体 size=3>类,我们可以直接利用</FONT><FONT face="宋体, MS Song" size=3>AnsiString</FONT><FONT face=宋体 size=3>类的</FONT><FONT face="宋体, MS Song" size=3>IsEmpty</FONT><FONT face=宋体 size=3>方法来判断该字符串是否为空,如果为空则需要显示错误提示信息,为此我们利用应用程序对象</FONT><FONT face="宋体, MS Song" size=3>Application</FONT><FONT face=宋体 size=3>的</FONT><FONT face="宋体, MS Song" size=3>MessageBox</FONT><FONT face=宋体 size=3>方法来显示如图</FONT><FONT face="宋体, MS Song" size=3>9-2</FONT><FONT face=宋体 size=3>所示的消息框,从消息框返回后,我们利用编辑框的</FONT><FONT face="宋体, MS Song" size=3>SetFocus</FONT><FONT face=宋体 size=3>方法把键盘输入焦点直接移到</FONT><FONT face="宋体, MS Song" size=3>edtFileName</FONT><FONT face=宋体 size=3>编辑框处,以便让用户重新输入文件名。</P>< align=justify>如果文件名不为空,就把三个编辑框中的内容添加到</FONT><FONT face="宋体, MS Song" size=3>MP3</FONT><FONT face=宋体 size=3>音乐记录集合中去。我们应该用什么方法来管理和操作记录集合呢?学过数据结构的朋友知道该集合应该为一种双向链表,便于进行定位、添加、删除等操作,但是对于不熟悉数据结构的朋友来说,这种方法实现起来有一定的困难。好在我们使用的是</FONT><FONT face="宋体, MS Song" size=3>ListView</FONT><FONT face=宋体 size=3>控件,它有一个属性为</FONT><FONT face="宋体, MS Song" size=3>Items</FONT><FONT face=宋体 size=3>,即列表项的集合,也就是说,</FONT><FONT face="宋体, MS Song" size=3>ListView</FONT><FONT face=宋体 size=3>本身就具有较强的操作和管理列表项的功能,这正好符合我们对操作和管理记录集合的要求。因此,我们可以简单地将新记录添加到</FONT><FONT face="宋体, MS Song" size=3>ListView</FONT><FONT face=宋体 size=3>控件中,直接利用该控件的</FONT><FONT face="宋体, MS Song" size=3>Items</FONT><FONT face=宋体 size=3>属性来代替记录集合。</P></FONT><FONT size=3>< align=justify>Items</FONT><FONT face=宋体 size=3>属性的类型为</FONT><FONT size=3>TListItems *</FONT><FONT face=宋体 size=3>,我们利用它的</FONT><FONT size=3>Add</FONT><FONT face=宋体 size=3>方法可以添加一个列表项。</FONT><FONT size=3>Add</FONT><FONT face=宋体 size=3>方法返回新添加的列表项对象</FONT><FONT size=3>newItem</FONT><FONT face=宋体 size=3>,这是一个</FONT><FONT size=3>TListItem</FONT><FONT face=宋体 size=3>类型的指针。每一个列表项要显示三个字符串,其中第一个字符串为</FONT><FONT size=3>newItem</FONT><FONT face=宋体 size=3>的</FONT><FONT size=3>Caption</FONT><FONT face=宋体 size=3>属性,其它两个字符串为</FONT><FONT size=3>newItem</FONT><FONT face=宋体 size=3>的</FONT><FONT size=3>SubItems</FONT><FONT face=宋体 size=3>属性。</FONT><FONT size=3>Caption</FONT><FONT face=宋体 size=3>属性为</FONT><FONT size=3>AnsiString</FONT><FONT face=宋体 size=3>类型,可以直接通过赋值操作符“</FONT><FONT size=3>=</FONT><FONT face=宋体 size=3>”把另外一个</FONT><FONT size=3>AnsiString</FONT><FONT face=宋体 size=3>变量赋给该属性。</FONT><FONT size=3>SubItems</FONT><FONT face=宋体 size=3>属性为</FONT><FONT size=3>TStrings</FONT><FONT face=宋体 size=3>类型,</FONT><FONT size=3>TStrings</FONT><FONT face=宋体 size=3>是字符串集合类,它的基本方法有添加</FONT><FONT size=3>Add</FONT><FONT face=宋体 size=3>、删除</FONT><FONT size=3>Delete</FONT><FONT face=宋体 size=3>等,代码中就是利用</FONT><FONT size=3>Add</FONT><FONT face=宋体 size=3>方法来实现添加字符串的功能。</P><UL><B>< align=justify><LI>显示当前选中的记录 <p></LI></UL></B>< align=justify>当用户在</FONT><FONT face="宋体, MS Song" size=3>ListView1</FONT><FONT face=宋体 size=3>中选中某条记录时,三个编辑框应该能够显示选中记录的内容,用户便可以在此基础上进行修改,下面我们就来实现这一功能。</P><P align=justify>通过查阅联机帮助,我们得知,当用户在列表框中选择某条记录时,会触发</FONT><FONT face="宋体, MS Song" size=3>ListView</FONT><FONT face=宋体 size=3>控件的</FONT><FONT face="宋体, MS Song" size=3>OnSelectItem</FONT><FONT face=宋体 size=3>事件,于是我们就在对象浏览器中选中</FONT><FONT face="宋体, MS Song" size=3>ListView</FONT><FONT face=宋体 size=3>控件的</FONT><FONT face="宋体, MS Song" size=3>OnSelectItem</FONT><FONT face=宋体 size=3>事件,并双击该事件右侧的空白输入栏,添加该事件的处理函数,并编写如下代码。</P></FONT><FONT size=3><P align=justify>void __fastcall TMainForm:istView1SelectItem(TObject *Sender, TListItem *Item, bool Selected)</P><P align=justify>{</P><P align=justify>//</FONT><FONT face=宋体 size=3>参数</FONT><FONT size=3>Item</FONT><FONT face=宋体 size=3>为新选中的列表项,判断它是否为有效的列表项对象</P></FONT><FONT size=3><P align=justify>if(Item)</P></FONT><FONT face=宋体 size=3><P align=justify>{</P></FONT><FONT size=3><P align=justify>//</FONT><FONT face=宋体 size=3>将列表项第一列的内容,即其</FONT><FONT size=3>Caption</FONT><FONT face=宋体 size=3>属性的内容写入“文件名称”编辑框中</P></FONT><FONT size=3><P align=justify>edtFileName-&gt;Text=Item-&gt;Caption;</P><P align=justify>//</FONT><FONT face=宋体 size=3>将第二列的内容,即</FONT><FONT size=3>SubItems</FONT><FONT face=宋体 size=3>属性中的第一个字符串,写入“歌曲名称”编辑框</P><DIR></FONT><FONT size=3><P align=justify>edtSongName-&gt;Text=Item-&gt;SubItems-&gt;Strings[0]; </P><P align=justify>//</FONT><FONT face=宋体 size=3>将第三列的内容,即</FONT><FONT size=3>SubItems</FONT><FONT face=宋体 size=3>属性中的第二个字符串,写入“歌手名称”编辑框</P></FONT><FONT size=3><P align=justify>edtSingerName-&gt;Text=Item-&gt;SubItems-&gt;Strings[1]; </P></DIR></FONT><FONT face=宋体 size=3><P align=justify>}</P><P align=justify>}</P><P align=justify>为了确保列表框中一次只能选中一条记录,我们将</FONT><FONT face="宋体, MS Song" size=3>ListView1</FONT><FONT face=宋体 size=3>的</FONT><FONT face="宋体, MS Song" size=3>MultiSelect</FONT><FONT face=宋体 size=3>属性设为</FONT><FONT face="宋体, MS Song" size=3>false</FONT><FONT face=宋体 size=3>。另外,当</FONT><FONT face="宋体, MS Song" size=3>ListView</FONT><FONT face=宋体 size=3>拥有键盘输入焦点时,当前选中的某个列表项会以高亮度显示出来,如果用户把键盘输入焦点移出</FONT><FONT face="宋体, MS Song" size=3>ListView</FONT><FONT face=宋体 size=3>控件,它会根据</FONT><FONT face="宋体, MS Song" size=3>HideSelection</FONT><FONT face=宋体 size=3>属性来决定是否把选中的列表项用灰色显示出示,以示与其它列表项的区别,我们最好将该属性设为“</FONT><FONT face="宋体, MS Song" size=3>false</FONT><FONT face=宋体 size=3>”,以便让用户始终能够辨认出哪个是选中的列表项,如图</FONT><FONT face="宋体, MS Song" size=3>9-3</FONT><FONT face=宋体 size=3>所示。</P><UL><B><P align=justify><LI>删除记录 <p></LI></UL></B><P align=justify>当用户按下“删除”按钮后,程序应当把当前选中的记录删除。</P><P align=justify>我们首先在窗体上双击“删除”命令按钮,让</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>自动添加缺省的事件处理函数</FONT><FONT face="宋体, MS Song" size=3>BtnDeleteSongClick</FONT><FONT face=宋体 size=3>,然后编写如下代码:</P></FONT><FONT size=3><P align=justify>void __fastcall TMainForm::BtnDeleteSongClick(TObject *Sender)</P><P align=justify>{</P><P align=justify>// Selected</FONT><FONT face=宋体 size=3>属性为列表框中当前选中列表项,首先判断该列表项是否为有效列表项。</P></FONT><FONT size=3><P align=justify>if(ListView1-&gt;Selected)</P></FONT><FONT face=宋体 size=3><P align=justify>{</P><DIR></FONT><FONT size=3><P align=justify>//TListItems</FONT><FONT face=宋体 size=3>的</FONT><FONT size=3>Delete</FONT><FONT face=宋体 size=3>方法需要列表项的序号做为参数</P></FONT><FONT size=3><P align=justify>//</FONT><FONT face=宋体 size=3>即</FONT><FONT size=3>TListItem</FONT><FONT face=宋体 size=3>对象的</FONT><FONT size=3>Index</FONT><FONT face=宋体 size=3>属性。</P></FONT><FONT size=3><P align=justify>ListView1-&gt;Items-&gt;Delete(ListView1-&gt;Selected-&gt;Index);</P></DIR></FONT><FONT face=宋体 size=3><P align=justify>}</P><P align=justify>}</P><P align=justify>从代码可见,为了删除记录,首先要判断用户是否选择了</FONT><FONT face="宋体, MS Song" size=3>ListView1</FONT><FONT face=宋体 size=3>中的某个记录,如果有,就获得当前选中的列表项的序号,即</FONT><FONT face="宋体, MS Song" size=3>ListView1-&gt;Selected-&gt;Index</FONT><FONT face=宋体 size=3>,然后利用</FONT><FONT face="宋体, MS Song" size=3>ListView</FONT><FONT face=宋体 size=3>控件的</FONT><FONT face="宋体, MS Song" size=3>Items</FONT><FONT face=宋体 size=3>属性的</FONT><FONT face="宋体, MS Song" size=3>Delete</FONT><FONT face=宋体 size=3>方法将其删除。</P><UL><B><P align=justify><LI>修改记录 <p></LI></UL></B><P align=justify>修改记录的操作步骤如下:当用户选中某个列表项时,程序自动将该列表项的内容显示在编辑框中,然后用户便可以在编辑框中修改记录的三部分内容,修改完毕后,用户按下“修改”按钮,表示确认此次修改。</P><P align=justify>为了实现上述功能,我们在窗体上双击“修改”按钮,添加其缺省的事件处理函数</FONT><FONT face="宋体, MS Song" size=3>BtnModifySongClick</FONT><FONT face=宋体 size=3>,并编写如下代码。</P></FONT><FONT size=3><P align=justify>void __fastcall TMainForm::BtnModifySongClick(TObject *Sender)</P><P align=justify>{</P><P align=justify>// Selected</FONT><FONT face=宋体 size=3>属性为列表框中当前选中列表项,首先判断该列表项是否为有效列表项。</P></FONT><FONT size=3><P align=justify>TListItem *theItem=ListView1-&gt;Selected;</P><P align=justify>if(theItem)</P></FONT><FONT face=宋体 size=3><P align=justify>{</P></FONT><FONT size=3><P align=justify>//</FONT><FONT face=宋体 size=3>将“文件名称”编辑框的内容写入</FONT><FONT size=3>Caption</FONT><FONT face=宋体 size=3>属性</FONT><FONT size=3> </P><DIR><P align=justify>theItem-&gt;Caption = edtFileName-&gt;Text;</P></DIR><P align=justify>//</FONT><FONT face=宋体 size=3>将“歌曲名称”编辑框的内容写入</FONT><FONT size=3>SubItems</FONT><FONT face=宋体 size=3>属性中的第一个字符串,</FONT><FONT size=3> </P><DIR><P align=justify>theItem-&gt;SubItems-&gt;Strings[0]=edtSongName-&gt;Text;</P><P align=justify>//</FONT><FONT face=宋体 size=3>将“歌手名称”编辑框的内容写入</FONT><FONT size=3>SubItems</FONT><FONT face=宋体 size=3>属性中的第二个字符串,</FONT><FONT size=3> </P><P align=justify>theItem-&gt;SubItems-&gt;Strings[1]=edtSingerName-&gt;Text;</P></DIR></FONT><FONT face=宋体 size=3><P align=justify>}</P><P align=justify>}</P><P align=justify>其实</FONT><FONT face="宋体, MS Song" size=3>ListView</FONT><FONT face=宋体 size=3>控件本身就支持直接修改列表项的标题部分,当用户选中某个列表项,再单击该列表项的标题部分,就会出现一个输入框,如图</FONT><FONT face="宋体, MS Song" size=3>9-4</FONT><FONT face=宋体 size=3>所示,用户可在其中进行修改,编辑结束后,回车加以确认即可。这项功能是由</FONT><FONT face="宋体, MS Song" size=3>ReadOnly</FONT><FONT face=宋体 size=3>属性决定的,</FONT><FONT face="宋体, MS Song" size=3>ReadOnly</FONT><FONT face=宋体 size=3>为</FONT><FONT face="宋体, MS Song" size=3>false</FONT><FONT face=宋体 size=3>表示可以编辑,否则不行。为了简便起见,我们在</FONT><FONT face="宋体, MS Song" size=3>Mp3Collect</FONT><FONT face=宋体 size=3>中将</FONT><FONT face="宋体, MS Song" size=3>ListView1</FONT><FONT face=宋体 size=3>的</FONT><FONT face="宋体, MS Song" size=3>ReadOnly</FONT><FONT face=宋体 size=3>属性设为</FONT><FONT face="宋体, MS Song" size=3>true</FONT><FONT face=宋体 size=3>,即不允许修改。</P><UL><B><P align=justify><LI>对事件处理函数的进一步讨论 <p></LI></UL></B><P align=justify>在添加事件处理函数过程中,我们会发现,每种事件都有其特定的函数原型(即特定的返回类型及参数类型),窗体类中所有符合原型要求的成员函数都可以作为该事件的处理函数。因此,在对象浏览器中选中某个事件后,打开响应函数输入框旁边的下拉框(参考图</FONT><FONT face="宋体, MS Song" size=3>9-1</FONT><FONT face=宋体 size=3>),其中列出了窗体类所有符合该事件响应函数原型的成员函数,我们可以在其中选取一个作为事件处理函数。利用这个方法,我们可以给一组相同元件的相同事件指定同一个事件处理函数。例如,我们可以为“添加”、“修改”、“删除”三个按钮指定同一个</FONT><FONT face="宋体, MS Song" size=3>Click</FONT><FONT face=宋体 size=3>事件处理函数</FONT><FONT face="宋体, MS Song" size=3>ButtonClick</FONT><FONT face=宋体 size=3>,为了区分到底是哪一个按钮产生的事件,可以检查事件处理函数的输入参数</FONT><FONT face="宋体, MS Song" size=3>TObject *Sender</FONT><FONT face=宋体 size=3>,该参数代表了产生</FONT><FONT face="宋体, MS Song" size=3>Click</FONT><FONT face=宋体 size=3>事件的按钮对象。</FONT><FONT face="宋体, MS Song" size=3>ButtonClick</FONT><FONT face=宋体 size=3>函数举例如下:</P></FONT><FONT size=3><P align=justify>void __fastcall TMainForm::ButtonClick(TObject *Sender)</P><P align=justify>{</P><P align=justify>if(Sender==btnAddSong)</P><P align=justify>AddSongClick(Sender);</P><P align=justify>if(Sender==btnModifySong)</P><P align=justify>BtnModifySongClick(Sender);</P><P align=justify>if(Sender==btnDeleteSong)</P><P align=justify>BtnDeleteSongClick(Sender);</P></FONT><FONT face=宋体 size=3><P align=justify>}</P><P align=justify>有时候我们需要取消某个事件的响应函数,取消的方法是在对象浏览器中相应事件处删除掉函数名称,</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>就会取消事件与函数之间的关联,这种方法并不会真正删除处理函数本身,如果想彻底删除函数本身,可以将函数体中的代码删除,只保留空白的函数框架,然后再保存该工程,这样就会从</FONT><FONT face="宋体, MS Song" size=3>.CPP</FONT><FONT face=宋体 size=3>文件和</FONT><FONT face="宋体, MS Song" size=3>.H</FONT><FONT face=宋体 size=3>文件中彻底删除该事件处理函数。</P><P align=justify> </P><P align=justify>现在运行</FONT><FONT face="宋体, MS Song" size=3>Mp3Collect</FONT><FONT face=宋体 size=3>,我们会发现它已经能够响应用户的多种输入了,但还有很多功能不完整,例如退出程序之后,输入的记录就丢失掉了,因此在后面的讲座里,我们还将进一步完善</FONT><FONT face="宋体, MS Song" size=3>Mp3Collect</FONT><FONT face=宋体 size=3>的功能。</P></FONT>
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

<b><FONT face=宋体 size=6> </FONT></b>< align=center>文件读写操作</P><FONT face=宋体 size=3>< align=justify>上一讲我们学习了事件和事件处理函数的有关知识,并为</FONT><FONT face="宋体, MS Song" size=3>Mp3Collect</FONT><FONT face=宋体 size=3>程序添加的进行记录操作的代码,但是程序还缺少保存记录的功能,以至于当程序退出之后,我们辛苦输入的记录就丢失了,因此在本讲中,我们就首先来学习有关文件读写操作的知识,然后继续添加事件处理函数,实现查询记录的功能。</P>< align=justify>在应用程序中保存信息和数据的常用方法有三种:第一种是保存在</FONT><FONT face="宋体, MS Song" size=3>Windows</FONT><FONT face=宋体 size=3>的注册表中,第二种是保存在程序专用的文件中,第三种则是保存在数据库中。第一种方法只适合于保存少量关键的信息,例如程序的参数和选项,对于我们的例子程序来说,歌曲记录的数量可以是非常多的,因此不适合保存在注册表中。第二种方法是最常用的,也比较容易实现,因此现在我们先采用第二种方法来保存记录。第三种方法对于保存大量结构化的数据是最有效的,例如</FONT><FONT face="宋体, MS Song" size=3>Mp3Collect</FONT><FONT face=宋体 size=3>的歌曲记录,但实现起来相对要复杂得多,在讲座的后面我们再来学习数据库操作方法。</P>< align=justify>用于文件操作的函数也有很多种,我们选择使用</FONT><FONT face="宋体, MS Song" size=3>I/O</FONT><FONT face=宋体 size=3>流函数和</FONT><FONT face="宋体, MS Song" size=3>FILE *</FONT><FONT face=宋体 size=3>指针来进行对文件的操作,因为这些函数符合</FONT><FONT face="宋体, MS Song" size=3>ANSI C/C++</FONT><FONT face=宋体 size=3>规范,可移植性较好,能够用于</FONT><FONT face="宋体, MS Song" size=3>Win32</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>Unix</FONT><FONT face=宋体 size=3>平台,是比较常用的文件操作方式。</FONT><FONT face="宋体, MS Song" size=3>I/O</FONT><FONT face=宋体 size=3>流函数和</FONT><FONT face="宋体, MS Song" size=3>FILE</FONT><FONT face=宋体 size=3>结构的声明和定义位于头文件</FONT><FONT face="宋体, MS Song" size=3>stdio.h</FONT><FONT face=宋体 size=3>中。</P><UL><B>< align=justify><LI>保存记录文件 $ N' Q$ v" I& W. G/ T
</LI></UL></B>< align=justify>下面介绍如何保存文件记录。</P>< align=justify>首先,为主窗体类添加一个</FONT><FONT face="宋体, MS Song" size=3>SaveFile()</FONT><FONT face=宋体 size=3>成员函数。在类浏览器中找到</FONT><FONT face="宋体, MS Song" size=3>TMainForm</FONT><FONT face=宋体 size=3>类,用右键单击该类,在关联菜单中选择</FONT><FONT face="宋体, MS Song" size=3>New Method</FONT><FONT face=宋体 size=3>命令,就会弹出如图</FONT><FONT face="宋体, MS Song" size=3>10-1</FONT><FONT face=宋体 size=3>所示的</FONT><FONT face="宋体, MS Song" size=3>Add Method</FONT><FONT face=宋体 size=3>对话框。在其中的</FONT><FONT face="宋体, MS Song" size=3>Method Name</FONT><FONT face=宋体 size=3>中输入新的成员函数名</FONT><FONT face="宋体, MS Song" size=3>SaveFile</FONT><FONT face=宋体 size=3>,函数的参数(</FONT><FONT face="宋体, MS Song" size=3>Arguments</FONT><FONT face=宋体 size=3>)为空,返回类型为</FONT><FONT face="宋体, MS Song" size=3>void</FONT><FONT face=宋体 size=3>,即没有返回值。函数的访问权限为私有的(</FONT><FONT face="宋体, MS Song" size=3>rivate</FONT><FONT face=宋体 size=3>),函数的调用方式为</FONT><FONT face="宋体, MS Song" size=3>__fastcall</FONT><FONT face=宋体 size=3>,这是因为按照</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>的规定,所有窗体类的成员函数的调用方式都必须为</FONT><FONT face="宋体, MS Song" size=3>__fastcall</FONT><FONT face=宋体 size=3>方式。设置好这些函数属性后,按下“</FONT><FONT face="宋体, MS Song" size=3>OK</FONT><FONT face=宋体 size=3>”按钮,</FONT><FONT face="宋体, MS Song" size=3>CBuilder</FONT><FONT face=宋体 size=3>就会自动添加好</FONT><FONT face="宋体, MS Song" size=3>SaveFile()</FONT><FONT face=宋体 size=3>函数的框架。</P>< align=justify>接下来在</FONT><FONT face="宋体, MS Song" size=3>SaveFile()</FONT><FONT face=宋体 size=3>函数中添加代码,实现保存文件的功能。我们约定保存记录的文件名为</FONT><FONT face="宋体, MS Song" size=3>Mp3Collect.sav</FONT><FONT face=宋体 size=3>,文件目录为当前工作目录,当前工作目录是通过调用</FONT><FONT face="宋体, MS Song" size=3>GetCurrentDir()</FONT><FONT face=宋体 size=3>函数获得的。文件的格式为普通的文本文件,每个列表项的内容以字符串的方式写入文件中,其中每个字符串为单独的一行,因此每个列表项在文件中占三行。在对文件进行</FONT><FONT face="宋体, MS Song" size=3>I/O</FONT><FONT face=宋体 size=3>流操作之前,首先需要打开文件,并获取文件的</FONT><FONT face="宋体, MS Song" size=3>FILE*</FONT><FONT face=宋体 size=3>指针。</P>< align=justify>我们通过</FONT><FONT face="宋体, MS Song" size=3>fopen()</FONT><FONT face=宋体 size=3>函数以文本以及创建新文件的方式打开</FONT><FONT face="宋体, MS Song" size=3>Mp3Collect.sav</FONT><FONT face=宋体 size=3>文件,然后读取</FONT><FONT face="宋体, MS Song" size=3>ListView1</FONT><FONT face=宋体 size=3>中的列表项,利用函数</FONT><FONT face="宋体, MS Song" size=3>fprintf()</FONT><FONT face=宋体 size=3>将每个列表项的内容写入文件中。下面</FONT><FONT face="宋体, MS Song" size=3>SaveFile()</FONT><FONT face=宋体 size=3>函数的实现代码:</P></FONT><FONT size=3>< align=justify>void __fastcall TMainForm::SaveButtonClick(TObject *Sender)</P>< align=justify>{</P>< align=justify>FILE * fp;</P>< align=justify>//</FONT><FONT face=宋体 size=3>获取当前工作目录,并构造含路径的文件全名。其中,文件名与路径用斜线</FONT><FONT size=3>'\'</FONT><FONT face=宋体 size=3>分开,</P></FONT><FONT size=3>< align=justify>//</FONT><FONT face=宋体 size=3>在</FONT><FONT size=3>CBuilder</FONT><FONT face=宋体 size=3>中用双引号构造字符串时,连续两个斜线表示实际字符串中的一个斜线。</P></FONT><FONT size=3>< align=justify>AnsiString sFilePath =GetCurrentDir()+AnsiString("\\Mp3Collect.sav");</P>< align=justify>//fopen</FONT><FONT face=宋体 size=3>函数的第一个参数表示文件名。第二个参数为打开文件的方式,其中</FONT><FONT size=3>w</FONT><FONT face=宋体 size=3>表示以创建</P></FONT><FONT size=3>< align=justify>//</FONT><FONT face=宋体 size=3>文件打开,</FONT><FONT size=3>t</FONT><FONT face=宋体 size=3>表示以文本方式打开。</P></FONT><FONT size=3>< align=justify>fp=fopen(sFilePath.c_str(),"wt");</P>< align=justify>//fopen</FONT><FONT face=宋体 size=3>返回文件指针,如果为无效的指针,则显示出错信息并返回</P></FONT><FONT size=3>< align=justify>if(fp==NULL)</FONT><FONT face=宋体 size=3>{</P><DIR></FONT><FONT size=3>< align=justify>ShowMessage("</FONT><FONT face=宋体 size=3>不能打开文件</FONT><FONT size=3>Mp3Collect.sav</FONT><FONT face=宋体 size=3>,请检查是否为共享冲突</FONT><FONT size=3>");</P>< align=justify>return;</P></DIR></FONT><FONT face=宋体 size=3>< align=justify>}</P></FONT><FONT size=3>< align=justify>int i;</P>< align=justify>TListItem * theItem;</P>< align=justify>//</FONT><FONT face=宋体 size=3>循环遍历列表框</FONT><FONT size=3>ListView1</FONT><FONT face=宋体 size=3>的所有列表项</P></FONT><FONT size=3>< align=justify>for(i=0;i&lt;ListView1-&gt;Items-&gt;Count;i++){</P><DIR>< align=justify>//</FONT><FONT face=宋体 size=3>通过</FONT><FONT size=3>ListView1</FONT><FONT face=宋体 size=3>的</FONT><FONT size=3>Items</FONT><FONT face=宋体 size=3>属性获得它的第</FONT><FONT size=3>i</FONT><FONT face=宋体 size=3>个列表项</P></FONT><FONT size=3>< align=justify>theItem=ListView1-&gt;Items-&gt;Item; </P><P align=justify>//</FONT><FONT face=宋体 size=3>将列表项中的记录信息分别写入文件中,每个字符串后插入回车换行字符。</P></FONT><FONT size=3><P align=justify>fprintf(fp,"%s\n\r%s\n\r%s\n\r",theItem-&gt;Caption,</P><P align=justify>theItem-&gt;SubItems-&gt;Strings[0],theItem-&gt;SubItems-&gt;Strings[1]);</P></DIR></FONT><FONT face=宋体 size=3><P align=justify>}</P></FONT><FONT size=3><P align=justify>//</FONT><FONT face=宋体 size=3>关闭文件</P></FONT><FONT size=3><P align=justify>fclose(fp);</P></FONT><FONT face=宋体 size=3><P align=justify>}</P><P align=justify></FONT><FONT face="宋体, MS Song" size=3>SaveFile()</FONT><FONT face=宋体 size=3>功能实现后,还要在合适的地方调用该函数,以真正实现保存记录的功能了。由于每次添加、删除、修改记录项都使记录集的内容发生了变化,我们可以在</FONT><FONT face="宋体, MS Song" size=3>AddSongClick()</FONT><FONT face=宋体 size=3>、</FONT><FONT face="宋体, MS Song" size=3>BtnModifySongClick()</FONT><FONT face=宋体 size=3>和</FONT><FONT face="宋体, MS Song" size=3>BtnDeleteSongClick()</FONT><FONT face=宋体 size=3>函数返回前调用</FONT><FONT face="宋体, MS Song" size=3>SaveFile()</FONT><FONT face=宋体 size=3>,及时保存记录集的最新信息。</P><UL><B><P align=justify><LI>读取文件中的记录 <p></LI></UL></B><P align=justify>接下来我们继续实现从文件中读取记录,并将其显示在列表框</FONT><FONT face="宋体, MS Song" size=3>ListView1</FONT><FONT face=宋体 size=3>中的功能。</P><P align=justify>在编辑状态下,双击主窗体上的“所有</FONT><FONT face="宋体, MS Song" size=3>MP3</FONT><FONT face=宋体 size=3>”按钮,添加事件处理函数</FONT><FONT face="宋体, MS Song" size=3>BtnShowAllClick()</FONT><FONT face=宋体 size=3>,在该函数中以文本和只读方式打开文件</FONT><FONT face="宋体, MS Song" size=3>Mp3Collect.sav</FONT><FONT face=宋体 size=3>,利用</FONT><FONT face="宋体, MS Song" size=3>fgets()</FONT><FONT face=宋体 size=3>函数从文件中一次读入一个字符串,每三个字符串构成一个列表项,并将列表项添加到列表框</FONT><FONT face="宋体, MS Song" size=3>ListView1</FONT><FONT face=宋体 size=3>中,具体的实现代码如下所 示:</P></FONT><FONT size=3><P align=justify>void __fastcall TMainForm::BtnShowAllClick()</P><P align=justify>{</P><P align=justify>FILE * fp;</P><P align=justify>//</FONT><FONT face=宋体 size=3>获取当前工作目录,并构造含路径的文件全名。</P></FONT><FONT size=3><P align=justify>AnsiString sFilePath =GetCurrentDir()+AnsiString("\\MP3Collect.sav");</P><P align=justify>//fopen</FONT><FONT face=宋体 size=3>函数的打开文件方式参数中,其中</FONT><FONT size=3>r</FONT><FONT face=宋体 size=3>表示以只读方式,</FONT><FONT size=3>t</FONT><FONT face=宋体 size=3>表示以文本方式打开。</P></FONT><FONT size=3><P align=justify>fp=fopen(sFilePath.c_str(),"rt");</P><P align=justify>int i,j;</P><P align=justify>char strbuf[255];</P><P align=justify>TListItem * theItem;</P><P align=justify>ListView1-&gt;Items-&gt;Clear();//</FONT><FONT face=宋体 size=3>清除列表框</FONT><FONT size=3>ListView1</FONT><FONT face=宋体 size=3>中的内容</P></FONT><FONT size=3><P align=justify>if(fp!=NULL) //</FONT><FONT face=宋体 size=3>如果文件存在,则返回的文件指针不为空,才能继续下面的操作</P><P align=justify>{</P><DIR></FONT><FONT size=3><P align=justify>i=0;//i</FONT><FONT face=宋体 size=3>指示添加到第几个列表项</P></FONT><FONT size=3><P align=justify>while(!feof(fp)) //</FONT><FONT face=宋体 size=3>判断是否读到了文件尾</P><P align=justify>{</P><DIR></FONT><FONT size=3><P align=justify>theItem=ListView1-&gt;Items-&gt;Add();//</FONT><FONT face=宋体 size=3>添加一项新的列表项</P></FONT><FONT size=3><P align=justify>for(j=0;j&lt;3;j++) //</FONT><FONT face=宋体 size=3>连续读三个字符串</P><P align=justify>{</P><DIR><DIR></FONT><FONT size=3><P align=justify>if(fgets(strbuf,255,fp)==NULL) //</FONT><FONT face=宋体 size=3>如果字符串为空,表示文件已结束</P><P align=justify>{</P><DIR></FONT><FONT size=3><P align=justify>ListView1-&gt;Items-&gt;Delete(i);</P><P align=justify>break;</P></DIR></FONT><FONT face=宋体 size=3><P align=justify>}</P></FONT><FONT size=3><P align=justify>//</FONT><FONT face=宋体 size=3>将字符串值赋给列表项,因为读出的字符串中可能包括回车换行等不能</P></FONT><FONT size=3><P align=justify>//</FONT><FONT face=宋体 size=3>显示的字符,因此用</FONT><FONT size=3>AnsiString</FONT><FONT face=宋体 size=3>的</FONT><FONT size=3>Trim</FONT><FONT face=宋体 size=3>函数去除这些字符</P></FONT><FONT size=3><P align=justify>if(j==0) theItem-&gt;Caption=AnsiString(strbuf).Trim();</P><P align=justify>else theItem-&gt;SubItems-&gt;Add(AnsiString(strbuf).Trim());</P></DIR></DIR></FONT><FONT face=宋体 size=3><P align=justify>}</P></FONT><FONT size=3><P align=justify>i++;</P></DIR></FONT><FONT face=宋体 size=3><P align=justify>}</P></DIR><P align=justify>}</P></FONT><FONT size=3><P align=justify>fclose(fp);//</FONT><FONT face=宋体 size=3>每次对文件操作完毕后,都要关闭文件</P><P align=justify>}</P><UL><B><P align=justify><LI>查询显示 <p></LI></UL></B><P align=justify>除了显示所有</FONT><FONT face="宋体, MS Song" size=3>MP3</FONT><FONT face=宋体 size=3>记录之外,我们还要为程序添加按条件查询并显示特定记录的功能。为了简单起见,我们约定查询条件也在记录输入框中输入。例如,在文件名中输入“</FONT><FONT face="宋体, MS Song" size=3>A</FONT><FONT face=宋体 size=3>”,表示记录的文件名部分必须包括</FONT><FONT face="宋体, MS Song" size=3>A</FONT><FONT face=宋体 size=3>,在歌曲名称中输入“月亮”则表示记录的歌曲名称中必须包括“月亮”,如果某个输入框为空白,则表示不检查该部分内容。三个查询条件之间是与的关系,即,输入的条件越多,查询标准越严格。</P><P align=justify>查询操作的原理和显示所有记录的原理基本一致,也需要打开</FONT><FONT face="宋体, MS Song" size=3>Mp3Collect.sav</FONT><FONT face=宋体 size=3>文件,读取其中所有记录信息,不同的是,查询操作需要将记录的各部分内容与条件输入框中的内容相比较,只有符合要求的记录项才会显示在列表框中。查询操作中进行条件比较的方法是利用</FONT><FONT face="宋体, MS Song" size=3>AnsiString</FONT><FONT face=宋体 size=3>类的</FONT><FONT face="宋体, MS Song" size=3>Pos()</FONT><FONT face=宋体 size=3>函数,检测字符串中是否包括查询条件中指定的子字符串。</P><P align=justify>为了添加查询显示功能,首先在窗体上双击“查找”按钮,添加事件响应函数</FONT><FONT face="宋体, MS Song" size=3>BtnFindClick()</FONT><FONT face=宋体 size=3>,并为该函数添加如下代码:</P></FONT><FONT size=3><P align=justify>void __fastcall TMainForm:: BtnFindClick (TObject *Sender)</P><P align=justify>{</P><P align=justify>FILE * fp;</P><P align=justify>//</FONT><FONT face=宋体 size=3>获取当前工作目录,并构造含路径的文件全名。</P><P align=justify></FONT><FONT size=3><FONT face="宋体, MS Song">AnsiString sFilePath =GetCurrentDir()+AnsiString("\\MP3Collect.sav");</FONT></P><P align=justify>fp=fopen(sFilePath.c_str(),"rt");//</FONT><FONT face=宋体 size=3>以只读、文本方式打开文件。</P></FONT><FONT size=3><P align=justify>int i,j ,bFound;</P><P align=justify>char strbufFileName[100],strbufSongName[100],strbufSingerName[100];</P><P align=justify>TListItem * theItem;</P><P align=justify>ListView1-&gt;Items-&gt;Clear();//</FONT><FONT face=宋体 size=3>清除列表框内原有的内容</P></FONT><FONT size=3><P align=justify>if(fp!=NULL) //</FONT><FONT face=宋体 size=3>如果文件存在,则返回的文件指针不为空,才能继续下面的操作</P><P align=justify>{</P><DIR></FONT><FONT size=3><P align=justify>i=0; //i</FONT><FONT face=宋体 size=3>指示添加到第几个列表项</P></FONT><FONT size=3><P align=justify>while(!feof(fp)) //</FONT><FONT face=宋体 size=3>判断是否读到了文件尾</P><P align=justify>{</P><DIR></FONT><FONT size=3><P align=justify>if(fgets(strbufFileName,100,fp)==NULL) break;</P><P align=justify>if(fgets(strbufSongName,100,fp)==NULL) break;</P><P align=justify>if(fgets(strbufSingerName,100,fp)==NULL) break;</P><P align=justify>bFound=TRUE;//bFound</FONT><FONT face=宋体 size=3>为是否符合查询条件标志,预先设定为</FONT><FONT size=3>TRUE</P><P align=justify>//</FONT><FONT face=宋体 size=3>如果“文件名称”输入框不为空,则判断</FONT><FONT size=3>strbufFileName</FONT><FONT face=宋体 size=3>中是否包括</P></FONT><FONT size=3><P align=justify>//</FONT><FONT face=宋体 size=3>“文件名称”输入条件</P></FONT><FONT size=3><P align=justify>if(!edtFileName-&gt;Text.IsEmpty())</P><DIR><DIR><P align=justify>if(!(AnsiString(strbufFileName).Pos(edtFileName-&gt;Text))) bFound=FALSE;</P></DIR></DIR><P align=justify>//</FONT><FONT face=宋体 size=3>检查“歌曲名称”查询条件</P></FONT><FONT size=3><P align=justify>if(!edtSongName-&gt;Text.IsEmpty())</P><DIR><DIR><P align=justify>if(!(AnsiString(strbufSongName).Pos(edtSongName-&gt;Text))) bFound=FALSE;</P></DIR></DIR><P align=justify>//</FONT><FONT face=宋体 size=3>检查“歌手名称”查询条件</P></FONT><FONT size=3><P align=justify>if(!edtSingerName-&gt;Text.IsEmpty())</P><DIR><DIR><P align=justify>if(!(AnsiString(strbufSingerName).Pos(edtSingerName-&gt;Text))) bFound=FALSE;</P></DIR></DIR><P align=justify>if(bFound) //</FONT><FONT face=宋体 size=3>如果符合查询条件,则添加到列表框控件中。</P><P align=justify>{</P><DIR><DIR></FONT><FONT size=3><P align=justify>theItem=ListView1-&gt;Items-&gt;Add();</P><P align=justify>theItem-&gt;Caption=AnsiString(strbufFileName).Trim();</P><P align=justify>theItem-&gt;SubItems-&gt;Add(AnsiString(strbufSongName).Trim());</P><P align=justify>theItem-&gt;SubItems-&gt;Add(AnsiString(strbufSingerName).Trim());</P><P align=justify>i++;</P></DIR></DIR></FONT><FONT face=宋体 size=3><P align=justify>}</P></DIR><P align=justify>}</P></DIR><P align=justify>}</P></FONT><FONT size=3><P align=justify>fclose(fp);</P></FONT><FONT face=宋体 size=3><P align=justify>}</P><P align=justify> </P><P align=justify>在本讲中我们学习了如何利用文件来保存记录集,以及如何从文件中读取记录信息,接着又为</FONT><FONT face="宋体, MS Song" size=3>Mp3Collect</FONT><FONT face=宋体 size=3>增加了查询显示的功能。到目前为此,围绕记录的操作已经介绍得差不多了,下一讲我们就来学习使用媒体操作器控件播放</FONT><FONT face="宋体, MS Song" size=3>MP3</FONT><FONT face=宋体 size=3>歌曲的方法,让</FONT><FONT face="宋体, MS Song" size=3>Mp3Collect</FONT><FONT face=宋体 size=3>变得“有声有色”。</P></FONT>
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2025-5-11 18:01 , Processed in 0.850172 second(s), 96 queries .

回顶部