编程摇篮的C++Builder 6教程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C++Builder的基本功能
我们用高级语言写程序,我们很得意,因为高级语言比较接近人类的语言,使我们用起来得心应手,所以我们当然得意。
但我们更得意的一定是让程序代码赶快变成可执行文件。
无论是在写代码的过程,还是最后要编译成可执行文件,都需要有一个工具存在。
这一工具一般称为编程集成环境(IDE)。
之所以称为集成,是因为从写代码到最后软件的出炉,我们需要它的地方实在太多了,这里列出其中最重要的功能项。
1、代码编辑:方便的代码编辑功能。
尽管你可以使用记事本、Word或其它任何文本编辑器来写代码,但除非特殊需要,否则那将是极为低效的方法。
相反,现在的编程集成环境,都相当的智能,举例如:代码自动功能,可以在很多情况下自动完成我们所需的代码,既准确还迅速。
Borland公司出品的编程集成环境不仅有常见的关键字高亮等功能,还支持代码模板,支持键盘宏,同样支持高级的脚本插件功能。
2、界面设计:可视化的程序界面设计功能。
你所要产生的窗口,在设计期间就真实地出现,包括字体、颜色和定位。
比如:你不仅可以插入falsh的动画,而且无需运行,就直接可以在你的界面上看到该动画的演播,这是别的编程环境不能做到的。
3、程序编译:这是编程工具的主要功能。
我们写的代码在成为机器能懂的可执行程序时,必须通过编译。
4、程序调试:如何尽量减少你程序的BUG呢?没有编程集成环境提供的强大调试功能,我们做的程序将毫无质量保证。
5、代码优化:Borland 提供的编译器,不仅在编译速度上一直在美国屡获大奖,而且其代码自动优化功能一直领先对手几近一个时代。
使用编程集成环境,我们可以轻松获得更快更优的最终可执行程序文件。
6、辅助程序安装:程序的安装已属于另外一种工具的范畴,但我们仍可以通过编程集成环境来决定最终生成单一可执行文件,还是带有其它动态库。
如果是后者,我们还可以通过集成环境来检查程序运行时调用了哪些动态库文件。
C++Builder 提供的功能远不止我上面所说的,并不是因为我嘴笨,而是我认为对一个工具,你只有动手使用,才会真正了解它。
C++是一门语言,而Borland C++Builder 则是语言实现工具。
作为一个编程工具,CB提供以上功能正是份内之事。
在这个意义上,你可以认为CB是Word2000,而C++则是英语或汉语。
正如我们用英语或汉语在Word2000上写出优美文章,编程可说为:我们用C++语言在CB上编写出优美的程序。
VCL vs. MFC
在作为一种编程工具的意义上,我们认为C++Builder和你也许常听的VC(Visual C++)没有什么本质的区别。
就像Word2000和WPS2000在本质都是字处理软件。
但现在我们要从另外一个角度讨论C++ Builde这个编程工具。
这个角度就是“封装”——面
向对象编程思想中的最重要也是最基础的概念。
一个要学习编程的人,可能从C开始学起。
学C时,我们没有接触那些挺玄的概念,到了C++,一切就来了,什么面向对象,什么封装、继承、多态……于是我们兴奋起来,努力去理解、掌握,运用这些概念所代表的技术,在掌握这些别人暂时未能理解的概念之后而颇有成就感……。
现在我要问的是,为什么要有这些概念?这些技术?正确回答这个问题,不仅有助于我们今后对编程语言各种概念的学习,而且它能让我们避免成为新技术的奴隶,这一切也许听起来有些形而上,不过我想通过以下讨论,至少可以回答一个很现实的问题:为什么要选C++Builder?而不是我们更常听的VC?这是我碰到的编程初学者较疑惑的问题之一。
如果人类长有翅膀,那么飞机大抵永远不会被发明。
飞机的发明,是为了弥补人类自已不能飞翔的缺陷。
不能说所有的技术都是这样,但C++对于C的发展,完全是为弥补程序员脑力的不足。
一个在校生在学会C后,往往并没有机会用C去实践一个大中型的项目,体会不到在一个庞大软件工程中,非面向对象语言的短处,所以在之后学习C++的过程中,也就很难真正体会到面向对象语言的长处。
简短一点说:不知道C的短处,就不懂C++的长处。
相反,倒是很快就发现C++的缺点:它的代码效率多数情况下都要比C低不少。
前面我们说过低级语言与高级语言的对比,C++语言也正是从语法结构和语言功能上来限定或实现一门编程语言更加接近人在现实生活中的思维习惯,从而达到减轻人的记忆和判断上的负担。
这其中最佳的方法之一就是所谓的“封装”。
VC的封装类库称为MFC,它是一种很低阶的封装,它并没有按照人类的思维习惯来重新组织和解释Windows对象(指Windows编程中所需的数据,处理,机制,接口),而纯粹是API一对一的翻版。
这样的封装工作带来代码封装所固有的代码效率降低的副作用,却没有给使用者带来任何方便。
如果你是编程初学者,而你身边又有VC高手,那么你一定要多多向他学习请教,因为一个真正的VC编程高手,其同时一定也是一个深刻理解Windows内核机制(消息循环,内存管理,多任务实现,资源使用等),熟悉Windows 各种常用API函数等等的高手。
C++Builder对封装库称为VCL(带VC字样,可别以为它是Visual C++,其实它是:Visual Component Library,即:可视控件库)。
VC的MFC和CB的VCL都是基于(但不限于)对Windows API(应用程序接口函数)的封装,为什么要对API进行封装?这就是回到了我们前面说过的,为什么有了C又会有C++的问题。
因为操作系统是用C和汇编写成的,它获得到操作系统必须的代码效率,但对应用程序开发者而言,它失去了易用性。
所以微软和Borland都使用高级语言对之进行封装工作。
二者谁进行得更好呢?
要想成为Windows编程高手,最终一定要绕过各种封装,理解Windows对象。
但作为一个初学者,我们必须挑选一个好的封装。
下面我们举字体(Font)作为例子,将三者:没有封装过的Windows 字体API、封装过的MFC字体对象和封装过的VCL字体对象做一个对比。
为了保证不会有偏倚和差错,有关前二者的代码,都是笔者从MSDN(微软提供的帮助文档)中直接拷贝出来。
Font->Size = 24; //设置尺寸为24号2
将字体的粗,斜,下划线,删除线再封装为TFontStyle属性:
Font->Style = Font->Style << fsBold << fsUnderlien; //字体增加粗体和下划线属性。
对于字体不常用的旋转等属性,不进行封装,你可以直接调用API函
数来设置TFont的 Handle属性。
比较表中第一行和第二行:前者是原始的API,后者是VC精心的封装成果,可惜二者几近雷同;既然你要封装,你就是要让它变得面向对象,易记易用;一模一样的照抄一遍,然后改改参数的名字,意义何在?如你是想维持代码的效率,那么在繁杂度一样的情况下,为什么我们不直接使用效率更高的API函数呢?
倘若说,MFC的“封装”纯粹是一种多余,那或许也还可以接受。
然而MFC偏偏还要在这种冗余的封装上建立自已的应用程序架构,和前面的“封装”一样,MFC建立应用架构的出发点也是良好的,为了方便Windows程序员编程的难度,而结果却更糟糕。
有问题的架构犯了类库或接口提供者的大忌:“有协议编程”。
什么叫“有协议编程”?我们先来讲“无协议编程”。
所谓“无协议编程”是指接口的提供者在提供接口时,同时也提供接口的使用约定,这一套约定应该在接口所要提供的功能上广泛适用,而无须再有种种特殊的例外,这样的接口显然非常适于使用。
学习编程,如果挑错了我们每天都要面对的封装类库,就将永远都在努力处理这些无任何意义的问题。
MFC的CWnd 提供了对Windows最基本的窗口元素的封装,其中对创建窗口的函数的封装为:
未封装的API:
HWND CreateWindow(
LPCTSTR lpClassName, // registered class name
LPCTSTR lpWindowName, // window name
DWORD dwStyle, // window style
int x, // horizontal position of window
int y, // vertical position of window
int nWidth, // window width
int nHeight, // window height
HWND hWndParent, // handle to parent or owner window
HMENU hMenu, // menu handle or child identifier
HINSTANCE hInstance, // handle to application instance
LPVOID lpParam // window-creation data
);
使用这个API函数,我们可以创建各种窗口。
CWnd封装的函数:
virtual BOOL CWnd::Create (
LPCTSTR lpszClassName,
LPCTSTR lpszWindowName,
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID,
CCreateContext* pContext = NULL
);
不用我说,你也能看出这仍然是个改改参数的蹩脚的封装。
我们不去管它,现在我们关心的是:CWnd::Create 对CreateWindow 进行了封装,可是这一封装的结果是:原来CreateWindow能实现的一些事情,在 CWnd::Create里突然成了例外。
是的,为了适应CWnd在MFC架构中所处的角色,程序员在涉及CWnd时必须记忆这样一条例外:“CWnd的Create用于创建窗口的实际元素,但其中参数dwStyle不能包含有窗口风格中WS_POPUP(弹出式窗口),如果你要建立一个带有该风格的窗口,请使用CreateEx……”
我仍然要说VC也是一个很优秀的编程工具,但对于不想浪费无谓精力的编程初学者,我个人建议使用Borland C++Builder,因为它实现真正的对象封装,从而使你可以节省不低于80%的时间来学习编程本质的知识——就是我们常说的数据结构与算法,这些东西最终决定你的编程能力。
下面是C++Builder提供我们的最重要的东西:
一、VCL类库:一个好的底层类库,让我们从学习编程最初时刻就自然而然地学会使用面向对象的方法来写程序。
它大大降低了我们入门门槛的高度,却又让我们一开始就站在比别人高的位置看待与程序有关的问题;
二、组件技术:组件技术代表了当今编程技术的主要方向,其设计思想与MS力推的Active 控件如出一辙:拥有相同的先进性。
只有借助组件技术,我们才有可能从一个初学者,迅速成为可实际工作的编程工作者;另一方面,如果作为组件的提供者,我们可以编写组件的过程中迅速提高自已的编程能力。
C++Builder还提供了许多其它先进技术,如事件委拖等等,归根到底都是通过封装让Windows编程原本需要长期积累才有可能掌握的知识变得直观易懂。
如果你刚刚开始学习编程,或者学习较长时间仍没有重大突破,或许使用C++Builder结合本课程系列,是个不错的选择。
附言:微软最近推出的C#相信会对上述MFC的不足做一个收拾,它对C++的扩展与约束与Borland C++Builder对C++的扩展与约束惊人的相似。
如果你乐意,我也真的很建议你在学完C++Builde后,继续学习C#。
熟悉Borland C++Builder
一、界面:
启动Borland C++Builder后,你会发现它的窗口和我们常见的一体化窗口的应用程
序有所不同:CB的各个子窗口并没有集成在一个主应用窗口中,而是分散为独立的主窗口。
(笔者的桌面分辨率为1024*728,但为了不让图的尺寸太大,我特意将各窗口拉得很小)如果你打开CB后出现在界面和上图有所不同,可以通过File菜单,再选New Application,建一新的工程,则上图标注的2到4的窗口应该出现。
如果仍然有缺,请用鼠标点上图的标注为“1”所示窗口的标题栏(以确保为活动状态),然后多按几次F11或F12,可以在以上窗口来回切换(两者功能有不同,可以自己试一下)。
下面我们来了解这四个窗口:
标注为1的窗口:这是我们比较熟悉的应用程序主窗口,虽然它看上去是一个长条,不过其上有主菜单(MainMenu),工具栏(Toolbar),和别的软件一样。
不一样的是这一“长条”的右下部分的多页式工具条。
事实上它并不是寻常意义上的工具条,因为其上的每一工具按钮并不提供执行某一命令的功能。
我们称它为控件栏。
控件是CB提供的先进的编程思想的体现之一,本章后面我们会初步学习如何使用控件。
标注为2的窗口:这是一个文件编辑的窗口,我们之所以称之为代码编辑窗口,或简称为代码窗口,由名及义,这是我们写程序代码的地方。
标注为3的窗口:称它为C++Builder软件的窗口并不妥当,它是我们自已要写软件的窗口。
Windows操作系统的应用软件,譬如Word2000,譬如WPS Office,或者简单如画笔、记事本,总是会有一或多个窗口。
这是Windows应用软件的典型特征(Windows 操作系统也因此称为Windows)。
尽管也可以写没有窗口的应用程序,但大多数情况下我们的程序至少需要一个窗口,所以CB在创建新工程时,总是默认为我们生成一个主窗口,这就是标注为3的窗口—在程序运行前,我们称它为“设计表单”(Form);在程序运行之后,它就是我们程
序中的窗口。
我们的程序需要有几个不同的窗口,就可在设计期间生成同样多个类似标注为3的设计表单。
我对“表单”这个词总是无法产生具体的概念,可是不仅C++Builder还是Delphi 或者Visual Basic(微软的得意之作),包括.net计划中的C#等快速应用程序设计系统,都使用Form这个词来称呼设计期间的窗口。
所以我还是统一口径叫表单。
但不管怎样,如果你在我的课程中偶尔发现设计窗口这样的说法,不用猜测,你尽管认定我就是在说表单。
一个原则:只在设计期间,我们才有可能称它为表单,当窗口运行了,那就是窗口了,我们从不叫一个运行着的窗口为表单。
标注为4的窗口:标题写着“Object Inspector”直译为:对象检视器。
事实上CB 在调试程序时还有一个“Debug Inspector”,我倒觉得让后者叫前者的名字更合适。
因为这里的Object也就对象,可不是我们以前说过面向对象的对象,它其实是用来查看,设置当前放在设计表单上的某个或某些控件的属性值和事件值的工具,后面我们会用到它。
控件:也称为“组件”,有些CB的书区分这两者,认为前者是后者的某一特定的子集,就是窗口1右下的控件栏上的控件,至于控件的属性,稍后我们使用时,你就会了解;为了直观,我决定称4号窗口为控件属性检视器,或者属性检视器,或者属性窗口,总之离不了属性二字。
属性检视器有两页:Properties(属性)和Events(事件)。
参照下一页的图,在这里统一一下口径,如图中Properties和Events,我们称它为多页(Properties为第一页,Events为第二页)。
关于分散窗口(苹果机早期的应用程序风格)的得失,我们不想在此讨论。
需要说明的是,CB的的各常用子窗口都提供Dockable,因此如果你喜欢集成式的窗口,大可通过鼠标拖拖放放来定制自已的集成窗口。
Dockable是指:拖动窗口A,当经由窗口B的某一边缘地带时,窗口A可以成为窗口B上的子窗口,而停靠在窗口B的某一角落。
在CB里,不仅角落可以停靠,当位置为窗口B的中心时,窗口B还能以多页的方式加入窗口B。
大多数软件或许会在退出时保存住最后的窗口位置大小等设置,CB则提供你随时保存,调用各套桌面设置,比如编写代码时的桌面,调试时的桌面等。
以下就是笔者常用的,用于编写代码时CB桌面设置之一,它被我存盘为“PowerEditDsk”。
这套桌面集成了类专家(ClassExplorer),工程管理(Project Manager)及消息窗口,任务列表(To-Do List)等窗口于代码编辑窗口内。
鉴于如果各位的桌面设置不统一会造成课程讲解上的一些困难,另外还有一个不是理由的理由:CB有关桌面的设置有烦人的BUG,所以我们的课程使用CB默认的桌面
设置,也是文前标有1、2、3、4的那张图中所示的窗口位置。
编写自已的第一个程序,并且用字幕打出“世界你好!”—这是“很早很早”以前一本C程序教材的作者的发明,后来据说成了经典……不过很多人说这太过时了。
不管怎样,我认为这作为我们初次使用CB的教学例子仍然很合适。
很多人可能感到有点突然,当CB慢吞吞启动后,一堆界面元素无论如何都让人感到这不是一个轻量级的人物;我们什么编程基础都没有,能驾驭好这个巨人吗?其实这就是CB的强大所在:具有高度的弹性,你可以用它编写很小的程序,也可以集合数十个程序员,用它编写大型软件。
二、牛刀小试:
1、创建空白工程:
这是Windows的天下,尽管在《白话C++》的学习中,Windows编程并非重点,但我们还是选择了Windows作为我们认识CB的起点。
从主菜单中选择File | New Application;
(约定:在谈菜单命令时,我们约定用这种格式:File | New Application表示如上图的实际操作。
)
执行New Application之后,CB为我们新建一个空白工程。
空白工程是指:绝大多数Windows程序所共同拥有的,必须的一个框架。
再说白点,就是你每写一个新程序,都需要的一堆完全一样的代码,也就是说在多数情况,这
是一步机械的工作。
既然是“机械”的工作,当然由机器来完成最合适。
很多年前,笔者在VC和BC都未流行时,做了一个月“机械工”后,和许多那时的程序员一样,笔者很快尝试自已对这部分的代码进行封装。
后来笔者又建议单位购买一套中国人写的窗口对象类库;再后来,笔者开始用BC、VC编程至今天。
对于大家能有机会直接使用堪称最好封装的VCL学习编程,笔者能说的一句话就是:珍惜你的机会,珍惜你的20元钱。
空白工程带有一个名为“Form1”的表单(上一节图中标有“3”的窗口),这就是程序运行时的主窗口,验证一下你就能明白。
选菜单:Run | Run或者按F9 键。
空白工程是一个完整的工程,在被编译成程序后运行,出现一个标题为“Form1”的窗口。
怎么和设计时的那个表单一模一样呢?当然,所见即所得嘛。
不一样的地方是设计表单上有一些用于定位的小点,而运行后的窗口没有这些。
上面左图为表单,右图为窗口;表单(Form)是指设计时的窗口;窗口(Window)指运行时的表单。
2、世界你好:
从C++Builder的主窗口(上一节中标有“1”的窗口)右下部的控件栏中找到如下图所示的Label控件,同时记住Label控件在Standard页中。
上图中画有字母“A”的图标按钮即为Label,这个控件用来显示一些简单的文字内容。
在鼠标按下该按钮后(按下后按钮的形状如上图),将鼠标挪到表单Form1上随便位置点左键一个Labe1控件将被放在表单上。
用鼠标再点一下Label1,确保它为如上图中的被选中状态(带有八个黑点块)。
我们要通过修改属性,让它的内容显示为“Hello,World”。
在主菜单上依次点击View | Object Inspector(或者按F11键),将出现Object Inspector 窗口(也就是上一节中标有“4”的窗口),我们称为控件属性检视器;通过“控件属性检视器”,我们可检查并设置当前选中的控件的属性(包括事件)。
由于刚才选中了Label(如果不是,请重复用鼠标再点一下表单上的Label1)。
操作后Object Inspector窗口
的上部应显示如下图:
上面的Label:TLabel表示当前属性窗口显示的是Label1的属性。
同时我们注意到Caption属性为Label1(注意:Name的属性也为Label1,千万别混了)。
Caption意为“标题”,它决定一个Label显示的内容。
你应该很明白怎么做了,在图中所示的Caption属性右边的编辑框内,将Label1改为Hello,World。
眼尖的学员一定发现,在改的同时,表单上的Labe1l如我们所愿,显示为“Hello,World”了。
笔者我眼力不钝,但还是没有看到结果,原因是有一个窗口挡住了Form1;此时只要按一下F12键,Form1将跳到前面。
完成后按下F9键,只见屏幕一闪,第一个我们参与设计的程序闪亮登场了!
很好,我们已经向这个世界打了招呼,工作似乎有点成果。
我们插播一段关于如何存盘的说明:在CB中保存程序,总体上和在字处理里保存一个文档是一样的操作,比如你一般都要给新文档命名,并且找到一个合适的位置保存。
这里讲一下特别之处:
其一、建议大家为本课程中所讲的例子程序准备一个统一的文件夹,然后以这个文件夹为父文件夹,再为每一个例子各建一个子文件夹(除非是教程中特别指出需要将两个例子工程放于一处)。
其二、在字处理中(如MS Word),一个文档就是一个文档,而在CB的程序工程中,一个工程除了工程自身的文件以外,还包含其它配套文件。
这些文件中,有些可以在保存其它文件时自动保存,现在需要我们手工保存的是工程文件和代码文件。
保存文件是相当频繁的事,我们几乎不用菜单,而总是使用快捷工具按钮(Toolbar)或者键盘,尤其是后者。
这里我只讲一个按钮,这个有一叠软盘的图标表示Save All(保存全部),现在请点它(或按Ctrl + Shift +S)。
将弹出两次的存盘对话框,第一次要求存盘的是代码文件,CB默认的文件名为Unit1;我就采用了这个默认名,必竟这只是一个小小的工程。
随后是工程文件要求存盘,我一样采用了默认的Project2.bpr的名字。
(因为我们经常图省事,直接使用默认名,所以如果不将不同的工程存在各自的文件夹内,重名的文件名就将令事情很糟糕。
)
最后是一些提醒:
提醒一:CB默认的存盘位置是其安装目录下的Projects文件夹。
建议不要采用它,而是自已在外面新创建一个文件夹。
提醒二:当程序复杂时,程序运行甚至编译时就有可能造成死机。
所以在写程序时常常存盘是一种非常良好且必要的习惯。
除了这些,存盘是件再熟悉不过的事了,在File菜单下还有不少和存盘有关的命令。
有空大家一定看看。
三、DOS 版 Hello,World:
在本部教程内,我们要集中全部精力,扎扎实实地打下C++ 语言的基础。
这是以后我们深入学习任何编程的要点,无论是Windows编程还是你想学Linux编程,也无论我们今后在实际工作中侧重于通讯或数据库或工控;甚至无论我们以后是否用C++这门语言编程;只要有C++根基,你就会比别人更容易掌握各种编程新知。
传言也并非都是假的,关于C++晦涩难懂之类的传言便很现实。
另一方面,Windows 编程的重点几乎全部都在于如何和Windows操作系统打交道,它要求你有很好的C语言基础。
出于这样的考虑及在实际运行中遇到的困难,笔者放弃曾有的,“以语言为中心,同时学会Windows编程基础”的理想。
写DOS风格的程序想起来是令人沮丧的;没有华丽的窗口界面,也不再使用那些功能强大的控件,但正因为DOS程序的朴素,它可以使我们更好地将重心放在C++语言本身;等到学习第二部教程时,我们才有足够的底气对Windows世界说一声:我来了!
1、空白控制台工程:
如果你的CB停留在前面Windows版Hello World工程中,请确保退出Hello World 的窗口。
然后选主菜单:File | Close All,关闭Windows版Hello World工程。
依次点击菜单:File | New,出现一个New Items对话框,等待我们选择要新建什么。
默认的选中项是上页图中New页内的第一个:Application。
如果选它,确认后的工程就是上一节我们创建的空的工程。
但现在我们要建立一个DOS风格的程序。
选上图中加有红圈的Console Wizard (控制台程序向导)。
确认后出现向导的第一步:
请您确认将对话框中的相关选项设置成和上图一致,然后点OK按钮。
没有表单,只有代码编辑框窗口(第一节的“2”号窗口)内中代码为:
//-------------------------------------------------------------
#pragma hdrstop
//-------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
return 0;
}
//-------------------------------------------------------------
这是C语言的主函数,或者称为入口函数。
程序从这个地方作为起点开始执行,以后会有更多讲解。
同样地,这也是一个程序框架,一个空白的DOS程序框架。
让我们选菜单中Run | Run或直接按F9键,看看结果和前面的Windows空白程序会有什么不同?
眼前出现一个黑色的窗口,然后就一晃而过,回到了C++Builder的界面。
黑色的窗口,在不同版本的Windows中有不同的叫法和不同的实现机制,但都是Windows操作系统兼容DOS的方式。
这种DOS方式在术语上称为“控制台/ console”。
如果你不明白什么是DOS,请通过其它途径另外学习。
2、用控制台输出“Hello world”:
我们需要加入三行代码才能实现DOS版的Hello World;以下黑体部分为你需要在代码中加入的内容:
(约定:在代码中使用黑体,用来表示您应该输入的部分)
//-------------------------------------------------------------
#include <stdio.h>。