borland_c++_builder6.0简易实例教程(1fen sina)-2013更新版本

ms_ysj1 贡献于2016-09-13

作者 walkinnet  创建于2012-05-13 07:43:00   修改者jin  修改于2016-08-16 10:30:45字数29556

文档摘要:Borland C++Bilder 6.0是Interprise(Borland)公司推出的基于C++ 语言的快速应用程序开发(Rapid Application Development,RAD)工具,它是最先进的开发应用程序的组件思想和面向对象的高效语言C++融合的产物。C++Builder 充分利用了已经发展成熟的Delphi 的可视化组件库(Visual Component Library,VCL),吸收了Borland C++ 6.0 这个优秀编译器的诸多优点。C++Builder 结合了先进的基于组件的程序设计技术,成熟的可视化组件库和优秀编译器,调试器。发展到6.0版本,C++Builder 已经成为一个非常成熟的可视化应用程序开发工具,功能强大而且效率高。
关键词:

Borland C++Builder 6.0教程 注: 1、原作者的这个教程,(.doc格式,2MB大小,共83页),有想多很多朋友都视为宝典或者经典教材,但是很多朋友特别是初学Borland C++ Builder的朋友,看不懂其中部分内容; 2.此版本更正了原作者(.doc格式,2MB大小,共83页)中的若干笔误等。 3.正文中新增了目录、部分文字注释和软件操作的步骤截图,以便读者更好的理解Borland C++Builder 6.0的精髓。 皆以蓝色字体列出。 2013年9月12日星期四 4.Borland C++ Builder6.0教程,以较少的内容使你快速入门。 5.建议有编程基础但还未接触C++ Builder的朋友仅用3~7天的时间学完此简易教程,然后直接找完整的实际案例练习。 目录 前言:Borland C++Bilder 6.0 1 二 加载C++Buidler 组件和引入 ActiveX控件 8 第三章 编程入门第一课――HelloWorld 11 第四章 设计菜单之一――下拉式菜单 18 第五章 设计菜单之二――功能按钮菜单 23 第六章 开发可Dockable的工具栏和视窗 28 创建多文档界面(MDI)程序 31 提示信息框(MessageBox)的应用 40 多页面窗口设计 55 第七章 Builder中灵活使用剪贴板 58 第八章 C++Builder中使用图形 65 第九章 文件的存取 70 前言:Borland C++Bilder 6.0 Borland C++Bilder 6.0是Interprise(Borland)公司推出的基于C++ 语言的快速应用程序开发(Rapid Application Development,RAD)工具,它是最先进的开发应用程序的组件思想和面向对象的高效语言C++融合的产物。C++Builder 充分利用了已经发展成熟的Delphi 的可视化组件库(Visual Component Library,VCL),吸收了Borland C++ 6.0 这个优秀编译器的诸多优点。C++Builder 结合了先进的基于组件的程序设计技术,成熟的可视化组件库和优秀编译器,调试器。发展到6.0版本,C++Builder 已经成为一个非常成熟的可视化应用程序开发工具,功能强大而且效率高。 一 C++Builder的特色 1.C++Builder 是高性能的C++开发工具   C++Builder是基于C++的,它具有高速的编译,连接和执行速度。同时,C++Builder具有双编译器引擎,不仅可以编译C/C++程序,还能编译Object Pascal语言程序。 2.C++Builder是优秀的可视化应用程序开发工具   C++Builder是一完善的可视化应用程序开发工具,使程序员从繁重的代码编写中解放出来,使他们能将注意力重点放在程序的设计上,而不是简单的重复的劳动中。同时,它提供的完全可视的程序界面开发工具,从而使程序员对开发工具的学习周期大大缩短。 3.C++Builder具有强大的数据库应用程序开发功能   C++Builder 提供了强大的数据库处理功能,它使的程序员不用写一行代码就能开发出功能强大的数据库应用程序,这些主要依赖于C++Builder众多的数据库感知控件和底层的BDE数据库引擎。C++Builder除了支持MicroSoft的ADO(Active Data Object)数据库连接技术,还提供了一种自己开发的成熟的数据库连接技术——BDE(Borland Database Engine)数据库引擎。 4.C++Builder具有强大的网络编程能力 C++Builder具有众多的Internet应用程序开发控件,如WebBroker,CppWebBroswer,WinSocks等,它们基本含盖了Internet应用的全部功能,利用它们程序员可以方便地建立自己地Internet应用程序。 一.C++Builder6.0的集成开发环境(IDE,Integrated Development Environment) 1. C++Builder 6.0的IDE主界面 (1)组件面板 组件面板上有标准组件选项卡(standard),附加组件选项卡(Additional),Win32组件选项卡(Win2),Data Access,Data Control组件选项卡,Dialogs组件选项卡等。    标准组件选项卡(standard)上的组件是构成Windows应用程序窗口最常用的标准元素,它们包括15种组件。主要有:主菜单(MainMenu),右键菜单(PopMenu),标签(Label),备注(Memo),命令按钮(Button),单选按钮(GroupBox$),复选按钮(CheckBox),列表框(ListBox),下拉式列表框(ComboBox),滚动条(ScrollBar),组框(GroupBox)和单项按钮组框(RadioGroup)。    附加组件选项卡(Additional)上的组件是Windows应用程序常用的专门控制元素,它包括14种组件。主要有:位图按钮(BitBtn),加速按钮(SpeedButton),格式编辑框(MaskEdit),字符网格(StringGrid),数据网格(dataGrid),图片框(Image),形状(Shape),和控制栏(ControlBar)。    Win32组件选项卡(Win2)上的组件是32位Windows应用程序的常用元素,它们具有32位应用程序的新特征,Win32组件选项卡共包括18种组件。分页面控制(PageControl),图片列表(ImageList),多文本编辑器(RichEdit),列表视图框(ListView),树状目录视图框(TreeView),工具栏(ToolBar)和状态栏(StatusBar)。 Data Access和Data Control组件选项卡上的组件是用来设计数据库应用程序的。其中Data Access组件选项卡上的组件是数据库应用程序用来与数据库建立连接的,它们也称为数据访问组件。而Data Control 组件选项卡上的组件是用来与用户交互的,它们也称为数据感知组件。主要是:表(Table),查询(Query),数据源(DataSource),数据库导航器(DBNavigator),数据表格(DBGrid),数据库编辑框(DBEdit),数据库静态文本框(DBText),数据库列表框(DBListBox),数据库图片(DBImage)。    Dialogs组件选项卡是由一些常用标准对话框组件组成的。主要完成打开文件,保存文件,查找,替换,打印,打印机设置等Windows标准的对话框功能。 (2)对象查看器    对象名称用于选择和查看当前对象的名称,属性选项卡用于设置对象设计时的可见属性,事件选项卡用来设置对象的事件句柄或者在代码编辑器中定位对象事件句柄。 二.创建Windows程序    在主菜单中选择【File】中的【New】,在New 对话框中选择Application,按OK。 三.运行程序    在菜单中选择【Run】中的【Run】,或者直接按快捷菜单上的运行按钮,还有是按快捷键F9,就可以运行当前程序。 四.编译程序    在菜单中选择【Project】中的【build project1】就可以把程序编译成为可以直接运行的.exe文件。    但是这样编译而来的执行文件因为是动态连接到库函数,所以在没有装C++Builder的机上不能正常运行。要编译成静态连接库,可以在所有机上运行的程序,只要这样做:打开【project】的【Options】,把packages页中的‘build with runtime packages’的勾去掉,linker页中的‘use dynamic RTL’的勾去掉,再在compiler页中按release键。 五.保存程序    在主菜单中选择【File】中的【Save Porject As】选项。再把所以文件(包括.cpp,.bak)都保存到一个目录下面。 二 加载C++Buidler 组件和引入 ActiveX控件 一.加载C++Builder组件    C++Builder中有很多组件,其中有一大部分组件不是很常用的,所以在C++Builder中默认只加载了一部分常用的组件,其他组件就要进行手工加载。或者从别的地方(如在网上下载)得到一些其他的组件包(*.bpl),要把它加载到C++Builder里面,就要用到加载组件。    在C++Builder中加载组件是很方便的,你可以在主菜单【Porject】中按【Options】,再选【packages】页,又或者在主菜单【Component】中选【Install Packages】,得到packages 对话框(如下图)。    如果你想要加载C++Builder中未加载的组件,只有在相应的组件包的前面打上勾来选定;如果你要加载其他组件包,按【Add】按钮,再在【Add Design Package】对话框中选定其组件包(*.bpl)。之后按【OK】键,新加载的组件就会出现在组件面板上。 二. 引入ActiveX控件    众所周知,ActiceX控件因为其可以跨平台的特性使得ActiveX在很多环境下被广泛地使用。在C++Builder中引用ActiveX很简单。具体操作是在主菜单【Component】中选【Import ActiveX Control…】,大约5s后弹出【Import ActiveX】的对话框,在对话框中选择你要引用的ActiveX控件。 1. 控件类明,可以包括多个,表示这个ActiveX控件包里面有多个ActiveX控件,如控件ActiveSkin 1.0 Type Library[Version 1.0]这里就包TSkinForm,TskinButton和TSkinPanel这三个控件。 2. 组件在Component Palette(组件面板)的页面。在本例中,我们把引入的ActiveX控件放在ActiveX页面中。 3. 组件的源文件(.cpp)。 4. 当前搜索路径,一般不用修改。    按【Install】键,ActiveX控件已经成功地引入到C++Builder中,反正组件面板的ActiveX页面中。 第三章 编程入门第一课――HelloWorld    曾几何时,HelloWorld已经成为编程入门的第一课。不管是什么语言,都以一个打出Hello World字串的小程序作为第一个入门程序。我们现在学C++Builder也把这个程序作为学习C++Builder的第一个入门程序。    相对C/C++等非可视化语言来说,C++Builder作为一种强大的可视化编程语言,那么它的入门级的HelloWorld程序也会非同凡响,而且还很简单易懂。好,现在就开始我们的HelloWorld! 一.首先要创建一个新的程序。 在【File】菜单下选【New】,再在【New Items】对话框中选择Application,按OK键。或者在【File】菜单下直接选择【New Application】。 二.加入相关组件。    把要用到的组件从在组件面板(Palette)上拖到窗体(Form)上,摆好位置,并设置好大小。我们这里用到一个标签(Label)和两个命令按钮(Button)。再改变窗体的大小,使窗体看上去好看一点。 三.设置组件的属性    在属性查看器中修改各个组件的属性。下面的图示是把Label1的Caption(标题)属性改为‘HelloWorld’。先点击窗体上的Label1组件,再在左边的属性查看器中选定Caption的项,输入’HelloWorld’。 编程入门第一课――HelloWorld 如上述所示,分别设置三个组件的属性为: 组件 属性 值 Form1 Caption HelloWorld Label1 Caption HelloWorld Font 宋体,粗体,一号 Button1 Caption Start Button2 Caption Exit 四.加入事件。 双击Button1,弹出代码编辑窗口,在Button1Click事件中加入以下代码: Label1->Caption="Hello C++Builder!" ; 双击Button2,在Button1Click事件中加入以下代码: Form1->Close();此处应为短横线-,否则出错。 五.编译运行HelloWorld程序。    按快速栏上的运行按钮,或者按快捷键(F9)运行,自动出现以下窗口HelloWorld程序。 按【Start】 按钮 ,结果如下: 按【Exit】退出程序。    到此为止,一个完整的HelloWorld程序就完成啦,是不是简单得不可思议呢? 下面再说两个小技巧: 1. 更换标题栏上得图标。    更改窗体(Form1)的Ico属性(在Form1属性下的中间位置),把它改为你想要的图标文件(*.Ico). 2. 更改执行文件的图标    在【Project】菜单下选【Options】,弹出【Project Option】对话框,选择【Application】页,按【LoadIcon…】键浏览选择自己想要的图标文件。按【OK】。    按【Project】菜单下的【Build Project】编译HelloWorld程序,得到可执行文件(.exe)。默认放在C:\Program Files\Borland\CBuilder6\Projects里 第四章 设计菜单之一――下拉式菜单    用过Windows程序(最典型的就是Word和资源管理器或一般Windows软件)的人也许有个印象,就是Windows下的程序的菜单很丰富好用,而且还很灵活多变。    事实上Windows下的程序的菜单大致可以分成两大类:    第一类是下拉式的菜单,如主菜单(MainMenu)和右键菜单(PopMenu);    第二类是功能按钮菜单,如工具菜单(ToolMenu)。    绝大多数的Windows程序都是采用下拉式的菜单,也有少部分的程序是使用功能按钮菜单。这两种菜单设计方式各有优缺点,前者的好处是设计方式简单、不占画面空间,可是缺点是必须一层一层地进入之功能选项,无法一次看到所有的功能选项;而后者的优点是可以加入漂亮的图标、一次可以看到许多的选项,缺点是占程序画面的空间。 我们这里将分别介绍这两种菜单。 一.下拉式菜单    下拉式菜单由菜单项和菜单命令构成,菜单项起到将功能分类存放的作用,如【文件】菜单项就是将针对文件操作的所有功能收容其下。而这些功能就体现为若干项菜单命令,菜单命令必须选定其所属菜单项后才出现在下拉菜单中。下拉式菜单包括主菜单(MainMenu)和右键菜单(PopMenu)。 1. 主菜单(MainMenu) (1)创建主菜单。 步骤1:先启动一个新的工程【File】->【New Application】。 步骤2:从组件面板的【Standard】页,拖拉MainMenu组件到Form1上。 步骤3:双击Form1上的MainMenu,出现一个菜单编辑器。 步骤4:接着点选第一项主菜单的位置,并且在属性Caption输入字符串‘文件’,然后点选第一项主菜单下面的第一层子菜单,继续输入直到第一项主菜单的功能建立完毕,接着输入第二项主菜单,如此类推。 注意:(1)如果你想输入分割符,请把改2项的属性Caption设置为‘-’即可。 (2)如果你想加入快捷键,请在选项字符串中挑出某个字符,当作代表此项功能的热键(Hot Key),在那个字符的前面加上‘&’字符即可(就会在该字符的下划线,表示该字母是快捷键的意思,当输入2个&等同于一个下划线加一个&字符)。当程序运行时,你可以同时按下【Alt】键和热键字符来执行对应的功能选项。另外一种热键功能是直接设定每一个选项的属性ShotCut。 步骤5:如果在第一层子菜单的选项想继续往下建立第二层菜单,请将鼠标移到第一层子菜单的第一项功能‘打开文件’,然后按下鼠标右键,你将会发现右键菜单的第三项功能‘Create Submenu’,点选它之后,‘打开文件’选项下面就会多一层子菜单,你再输入这份子菜单内的选项内容,若是想继续往下建立子菜单,如此类推。 步骤6:整个菜单建立完成以后,每一项菜单功能的程序是写在OnClick事件内,而每一项菜单功能都会产生对应的OnClick事件。你可以将鼠标移到菜单编辑器上的菜单项上双击,会弹出程序编辑器,然后你可以在当前位置(事件程序)中输入你的程序代码。 (2)应用菜单模板和把菜单保存为菜单模板 A. 应用菜单模板:可以把C++Builder自带的菜单或者是自己保存的菜单直接引用。具体操作是:在菜单编辑器的快捷菜单点击【Insert Form Template】,再在【Insert Template】对话框中选择一个菜单,按【OK】键。 B. 把菜单保存为菜单模板:把常用菜单保存为菜单模板,那么下次编辑菜单的时候就可以直接加载,方便省时。具体操作是:在菜单编辑器的快捷菜单点击【Save To Template】,弹出【Save Template】的对话框,输入菜单的描述(名字),按【OK】键。 到此为止,一个象模像样的主菜单就完成拉,是不是很不错呢? 2. 右键菜单(PopMenu)    右键菜单(PopMenu)又叫弹出菜单,你可以先设计好一个PopMenu组件,然后指定给任何一个可视化组件,当用户将鼠标移到这些可视化组件上,按下右键,就会弹出一个菜单,这个菜单就是PopMenu组件,下面是建立PopMenu菜单的步骤: 步骤1:先从组件面板的【Standard】页拖拉PopMenu组件到Form1上。 步骤2:建立菜单的内容和实现功能的事件程序和主菜单一样,请参考上一节。 请看下图: 第五章 设计菜单之二――功能按钮菜单    Windows下的程序的菜单大致可以分成两大类:第一类是下拉式的菜单,如主菜单(MainMenu)和右键菜单(PopMenu);第二类是功能按钮菜单,如工具菜单(ToolMenu)。和菜单一样,功能按钮菜单已经成为Windows应用程序地一个标准配置,使用它可以进一步增强应用程序的菜单界面,一般来说,功能按钮菜单和下来菜单密不可分。功能按钮菜单中含有功能按钮,功能是对于应用程序中最常用的命令的快速访问。许多功能按钮菜单我们已经屡见不鲜,如下面的IE的功能按钮菜单。    在C++Builder中,制作一个简单的功能按钮菜单只要用到功能按钮控件(TToolBar)和一个图象列表控件(TImageList)相配合就可以实现。一般需要四个步骤: (1) 在TLmageList控件中插入合适的图象 (2) 把TToolBar控件的Images属性设置为TlmageList (3) 通过单击鼠标右键为TToolBar添加TButton,并通过属性页来定制。 (4) 在TToolBarClick事件中加入相关操作。    制作IE风格的功能按钮菜单则要再使用TCoolBar或者TControlBar控件,一共有三种方法,我们现在就配合实例讲解这三种制作IE风格的功能按钮菜单的方法。 一.TCoolBar+TToolBar+TImageList    步骤一:新建一个工程,在窗体(Form)中加入一个TCoolBar(在win32中的尾部)和一个TImageList控件(在win32中的前部)。然后在TCoolbar上加入一个TToolBar控件(TCoolBar前面那个)。把TCoolbar的Align属性设置为alTop。调整好TToolBar的高度,再把TToolBar和TCoolBar控件的AutoSize属性都设置为true;    步骤二:用鼠标右键单击TImagelist控件,打开‘ImageList Editor’窗口,添加对应的copy,cut和paste图标。    步骤三:在TToolBar控件上单击鼠标右键,在弹出的菜单中选择‘New Button’自动在TToolBar控件中的最左边插入TButton,右键选择TButton ,选择‘New Seperator’来插入一个小的分割条。    步骤四:将TToolBar控件的Images的属性设置为ImageList1,则TImageList控件中的图标((即下图中的第0个图片) )立刻出现在工具按钮菜单中。    步骤五:用鼠标双击功能按钮菜单中的任意一个按钮,就可以为这个按钮的事件响应编写处理代码了。 二.TControlBar+TToolbar+TImageList    这种方法和以上的方法大同小异,只是把TCoolBar换成TControlBar就可以拉,这里不累赘说明。下图是其效果。 三.把下拉式菜单放到功能按钮菜单上 这是IE中最常用的菜单,在C++Builder可以轻易实现。    步骤一:在窗体(Form)上放置一个TMainMenu控件,并设置好内容;    步骤二:设置Tform(工程名)的Menu属性为空;    步骤三:放置一个TControlbar,再放置一个TToolbar在TControlbar上面  步骤四:设置 TToolBar 的 ShowCaptions 属性为 true;    步骤五:在 TToolBar 上增加几个 TToolButton(右击TToolBar),修改其 caption 模拟主菜单的样子;    步骤六:将 TTollBar 的 grouped 属性设置成 true;(为什么我没有找到grouped属性?)    步骤七:设置每个TToolButton 的 menuitem 对应 MainMenu 的主菜单项;    步骤八:设置TToolBar的flat属性为true    运行程序,结果如下,就得到了一个跟IE一样的在功能按钮菜单上的下来式菜单。这个在功能按钮菜单中的下拉式菜单确实很‘cool‘吧?    好,到此为止,相信读者对C++Builder的菜单设计(包括下拉式菜单和功能按钮菜单)有一定了解,这有助于我们进一步设计出更漂亮实用的用户界面。 第六章 开发可Dockable的工具栏和视窗    在Windows视窗系统中,可Dockable的工具栏被广泛运用在很多软件和程序当中。可Dockable,即dock功能。所谓dock功能就是你可以把某些工具栏和视窗与其他工具栏或视窗结合同在一个工具栏或视窗。C++Builder的IDE所包含的工具栏以及视窗就具有dock功能。如下图所示。    工具栏的dock功能不仅使工具栏更灵活,使使用者可以随心所欲的按照自己习惯和喜欢的方式组合、摆放工具栏,而且使操作界面更美观。    在C++Builder中开发这种具有dock功能的工具栏和视窗可以说是轻而易举的。好,现在我们就开始自己动手开发可Dockable的工具栏和视窗。Let’s go!    我们可以利用C++Builder开发出具有dock功能的应用程序。在C++Builder中,所以可视化的VCL组件都支持dock功能。这里可视化VCL组件是指所有继承自TControl以及TwinControl的VCL组件。    基本上,要进行dock动作至少需要两个组件,一个被附着的dock site组件,另一个则是附在dock site 上的组件,C++Builder所提供的可视化组件只有继承自TwinControl的VCL组件才具有dock site功能,而只要是继承自TControl的VCL组件则具有附着在dock site的功能。    如果你想希望某个继承自TwinControl的组件具有dock site功能,只要把属性DockSite设置为true即可;如果你希望某个继承自TControl的组件附着在dock site上,只要把属性DragSite设置为dkDock,属性DragMode设置为dmAutomatic即可。但程序运行的时候,你就可以利用鼠标把后者组件拖到前者组件上,后者就会自动附着在前者上,完成dock动作。   下面是以两个实际例子说明在C++Builder轻松开发可Dockable的视窗和工具栏。 一.开发可Dockable的视窗    步骤一:新建一个工程;    步骤二:在组件面板上的Standard页,拖一个Tpanel组件到Form1上,然后把Tpanel1的Align的属性设为alTop,并且把属性DockSite设置为true;    步骤三:在组件面板上的Additonal页,拖三个Tshape组件到Form1上,并且把着三个Tshape组件的属性DragKind设置为dkDock,属性DragMode设置为dmAutomatic;    步骤四:运行程序,你就可以利用鼠标把Tshape组件dock在Tpanel组件上。 二.开发可Dockable的工具栏    步骤一:新建一个工程;    步骤二:按照上一篇的方法用TmainMenu+TcontrolBar+TToolBar创建一个位于工具栏中的下拉式菜单;    步骤三:接着把Tcontrolbar的属性DockSite设置为true,把TToolBar的属性DragKind设置为dkDock,属性DragMode设置为dmAutomatic;    步骤四:运行程序,得到一个具有dock功能的工具栏,你可以把工具栏停靠在窗体(Form1)的上面,也可以把它拖出来浮动于窗体之上。如下图所示:    到此为止,我们已经学会了如何开发具有dock功能的应用程序。它使使用者可以随心所欲地组合和摆放工具栏,又可以使程序界面更美观。 创建多文档界面(MDI)程序 多文档界面(Multiple Document Interface,MDI)是在一个应用程序中能够同时处理两个或者更多个窗体的界面形式。例如常见的MicroSoft Word 这个排版编辑软件就可以同时编辑多篇文章,因此它是一个典型的多文档界面的应用程序。 MDI应用程序的多窗体特性使用户可以在同一个工作区域内对多个文档进行观察和数据交换,以便工作的协调和高效地进行。MDI的工作区域分为主窗体(MDI)和子窗体(Child)。主窗体是程序运行的基本环境,也是生成子窗体的基础,它通常不对用户的文档进行处理。主窗体以外就是子窗体,每个子窗体负责处理一个用户得文档。这些文档可以是相同得文件格式,也可以是不同的文件格式。   C++Builder提供了一整套设计MDI应用程序的组件,让你很容易、快速地开发一个MDI的应用程序。   设计开发一个MDI应用程序一般分三个步骤:   1.创建MDI主窗体;   2.创建MDI子窗体;   3.在MDI主窗体和子窗体中加入代码。   我们现在就以开发一个简单的多文档界面的文字处理应用程序为例子,按以上三个步骤一步步讲述如何开发一个MDI应用程序。 一.创建MDI主窗体   在MDI应用程序中,主窗体为应用文档提供了一个工作平台,所有的子窗体都在主窗体中打开和工作,同时主窗体也是应用程序的启动窗体,因此,创建主窗体是创建MDI应用程序的第一步。    1.新建一个工程,把Form1的caption属性和name属性设置为MDIFrm,并把FormStyle属性设置为fsMDIForm;    2.选择【Project】菜单下的【Options】命令打开【Project Option】对话框,在【Forms】标签页中的Main Form组合框中选择所创建的主窗体名Form1,将该窗体设置为启动窗体;    3.在主窗体中加入一个主菜单控件(MainMenu),和一个打开文件对话框控件    4.在主菜单中添加菜单项;    5.在主窗体中加入一个打开文件对话框控件(OpenDialog), 然后打开文件对话框的过滤编辑器,添加以下内容; (我也不知道原作者指的“打开文件对话框的过滤编辑器”在哪?百度上也有很多寻找这个所谓的“文件对话框的过滤编辑器在哪的问题”。) 二.创建MDI子窗体    当MDI应用程序的主窗体创建之后,就可以再创建新的窗体作为子窗体,还可以通过该窗体模板创建多个子窗体的实例,最后还可以在子窗体上进行编辑操作以满足要求。    1.首先使用【File】菜单中的【New】命令创建一个新的窗体,将其caption属性和name属性设置为ChildFrm;    2.然后将该窗体的FormStyle属性设置fsMDIChild,再在【Project|Options】对话框中将Auto-create Forms 列表框中的ChildFrm窗体名移到Available forms中,这样程序启动时就不会自动创建该窗体; 3.在子窗体中添加控件并设置属性; 4.在主菜单中添加菜单项; 5.打开文件对话框的过滤编辑器,添加以下内容; 三.在主窗体和子窗体中加入代码    1.添加主窗体的事件代码    (1)在菜单【File|Include Unit Hdr…】中把子窗体的头文件包含进主窗体,以便于主窗体对子窗体进行访问。    (2)菜单项【File|New】用于按照ChildFrm窗体模板新建一个子窗体。 void __fastcall TMDIFrm::New1Click(TObject *Sender) { TChildFrm *NewChildFrm=new TChildFrm(this); NewChildFrm->Caption=NewChildFrm; }    (3)菜单项【File|Open】用于新建一个ChildFrm窗体并将已有的文件的内容添加到此窗体中。 void __fastcall TMDIFrm::Open1Click(TObject *Sender) { if(OpenDialog1->Execute()) { TChildFrm *NewChildFrm=new TChildFrm(this); NewChildFrm->RichEdit1->Lines->LoadFromFile(OpenDialog1->FileName); NewChildFrm->Caption=ExtractFileName(OpenDialog1->FileName); } }   2.添加子窗体的事件代码   (1)在菜单【File|Include Unit Hdr…】中把主窗体的头文件包含进子窗体,以便于子窗体对主窗体进行访问。   (2)为子窗体的菜单项添加代码 void __fastcall TChildFrm::New1Click(TObject *Sender) { MDIFrm->New1Click(Sender); //新建文件,可以直接调用主窗体事件处理函数 } void __fastcall TChildFrm::Open1Click(TObject *Sender) { MDIFrm->Open1Click(Sender); //打开文件,可以直接调用主窗体事件处理函数 } void __fastcall TChildFrm::Save1Click(TObject *Sender) { if(SaveDialog1->Execute()) { RichEdit1->Lines->SaveToFile(SaveDialog1->FileName+".txt");//把RichEdit的内容保 //存到文件 } } void __fastcall TChildFrm::Copy1Click(TObject *Sender) { RichEdit1->CopyToClipboard(); //把RichEdit中选中的内容拷贝到剪切板 } void __fastcall TChildFrm::Cut1Click(TObject *Sender) { RichEdit1->CutToClipboard(); //把RichEdit中选中的内容剪切到剪切板 } void __fastcall TChildFrm::Paste1Click(TObject *Sender) { RichEdit1->PasteFromClipboard(); //把剪切板中的内容粘贴到RichEdit的当前位置 }   MDI应用程序在缺省的情况下,执行关闭操作时并不真正关闭子窗口,而仅仅是最小化它。因此子窗口关闭时,要首先设置其Action属性。 void __fastcall TChildFrm::FormClose(TObject *Sender, TCloseAction &Action) { Action=caFree; // 把它的Action设置为caFree } 再写【File】菜单的【Close】命令的处理函数 void __fastcall TChildFrm::Close1Click(TObject *Sender) { MDIFrm->ActiveMDIChild->Close();//关闭当前子窗口 } 最后编译运行程序,一个功能简单的文字处理的MDI应用程序就搞定拉。 提示信息框(MessageBox)的应用    应用程序中的提示信息处理程序是非常出重要的部分,用户要知道他输入的资料到底正不正确,或者是应用程序有一些提示信息要告诉用户,都必须通过提示信息处理程序来显示适当的信息,让用户了解下一步该如何配置。提示信息有很多种类,包括警告,错误,提示,确认,重试等。不同种类的提示信息框适合用在各种不同的情况。   在C++Builder中开发提示信息框只须调用MessageBox这个信息提示框函数就行,下面就是这个函数说明: int __fastcall MessageBox(const char * Text,//提示信息框的内容 const char * Caption, //提示信息框的标题 int Flags); //提示信息框的类别   参数Flags的值是用来标志提示信息框的类别的,下面是一些常用的类别: 参数值 样式 意义 MB_ICONWARNING 含图标、固定按钮 警告信息框 MB_ICONQUESTION 含图标、固定按钮 疑问信息框 MB_ICONERROR 含图标、固定按钮 错误信息框 MB_ICONASTERISK 含图标、固定按钮 提示信息框 MB_HELP 不含图标、可改变按钮 说明信息框 MB_OK 不含图标、可改变按钮 提示信息框 MB_OKCANCEL 不含图标、可改变按钮 确认信息框 MB_RETRYCANCEL 不含图标、可改变按钮 重试信息框 MB_YESNO 不含图标、可改变按钮 是否信息框 MB_YESNOCANCEL 不含图标、可改变按钮 是否取消信息框   从上表可以看出来,提示信息框的类别可以分成含图标和不含图标,含图标的意思就是指提示信息框上会有代表意义的图形,不过这类型的提示信息框的按钮都是固定的,都是【确定】按钮,不能增加也不能省略;不含图标的提示信息框,虽然没有对应的图形显示在提示信息框上,可是你却可以在这种类型的提示信息框内,加入各种组合的按钮,用于各种不同的情况。  MessageBox函数会返回一个整数值,这个整数值代表用户刚刚点击提示信息框上的哪个按钮,每个返回值的代表意义在下表: 返回值 数值 意义 IDOK 1 确定 IDCANCEL 2 取消 IDABORT 3 中断 IDRETRY 4 重试 IDIGNORE 5 忽略 IDYES 6 是 IDNO 7 否 下面是提示信框的示范程序: 1. 警告信息框 Application->MessageBox("警告信息框","警告信息框",MB_ICONWARNING); 2.疑问信息框 Application->MessageBox("疑问信息框","疑问信息框",MB_ICONQUESTION); 3.错误提示框 Application->MessageBox("错误信息框","错误信息框",MB_ICONERROR); 4.提示信息框 Application->MessageBox("提示信息框","提示信息框",MB_ICONASTERISK); 5.说明信息框 Application->MessageBox("说明信息框","说明信息框",MB_HELP); 6.提示信息框 Application->MessageBox("提示信息框","提示信息框",MB_OK); 7.确认信息框 Application->MessageBox("确认信息框","确认信息框",MB_OKCANCEL); 8.重试信息框 Application->MessageBox("重试信息框","重试信息框",MB_RETRYCANCEL); 9.是否信息框 Application->MessageBox("是否信息框","是否信息框",MB_YESNO); 10.是否取消信息框 Application->MessageBox("是否取消信息框","是否取消信息框",MB_YESNOCANCEL);    在C++Builder中,还提供了一个很简单的信息提示框函数,那就是ShowMessage。这个函数只有一个字符串参数,你可以把要显示的字符串放到这个字符串参数里面,ShowMessage就回显示出该信息,但是没有图标,也没有按钮,只有单纯的字符串信息而已。 下面是ShowMessage函数的说明: extern PACKAGE void __fastcall ShowMessage(const AnsiString Msg); 例子: ShowMessage("这个就是ShowMessage函数生成的信息提示框!"); 标准对话框的应用    对话框,可能是Windows里面最常见的窗口,不管是打开文件、保存文件,还是查找或者替换等,无一不是Windows的对话框。在C++Builder的可视组件库(VCL)中,总共提供了十个标准的对话框组件,我们可以在组件面板的【Dialogs】页中找到这些通用对话框组件,如下所示:    它们从左到右依次是:文件打开对话框(OpenDialog)、文件保存对话框(SaveDialog)、图形文件打开对话框(OpenPictureDialog)、图形文件保存对话框(SavePictureDialog)、字体对话框(FontDialog)、颜色对话框(ColorDialog)、打印对话框(PrintDialog)、打印机设置对话框(PrintSetupDialog)、查找对话框(FindDialog)和替换对话框(ReplaceDialog)。    在这里我们先研究一下最常用的几个对话框,分别是文件打开对话框(OpenDialog)、文件保存对话框(SaveDialog)、字体对话框(FontDialog)、颜色对话框(ColorDialog)、查找对话框(FindDialog)以及替换对话框(ReplaceDialog)。现在就让我们一起来慢慢逐一分析研究。 一.文件打开对话框和文件保存对话框    文件打开对话框组件为应用程序打开一个已经存在的文件,文件保存对话框组件将现有的文档保存到磁盘的文件上。 1. Execute()方法    我们可以通过调用Execute()方法来显示文件打开对话框或文件保存对话框。如下图所示 2. Filter属性    这个属性显示在文件列表框中的文件类型。例如,我们如果选择了‘*.txt’的文件类型,那么只有文本文件才会显示在文件列表框中。我们可以通过过虑编辑器(Filter Editor)决定Filter属性的所有可能取值。 3. FileName属性    在FileName属性中保存了文件操作对象的完整文件路径和文件名。 4. 实现代码 if(OpenDialog1->Execute()) //打开打开文件对话框 { RichEdit1->Lines->LoadFromFile(OpenDialog1->FileName); //把文件读取到多文本编辑 //器中 } if(SaveDialog1->Execute()) //打开保存文件对话框 { RichEdit1->Lines->SaveToFile(SaveDialog1->FileName); //把多文本编辑器的内容保存到 //文件中 } 二.字体对话框和颜色对话框    字体对话框(FontDialog)和颜色对话框(ColorDialog)用于在应用程序中选择适当的字体属性和颜色属性,从而使文档变得富于表现力。 if(FontDialog1->Execute()) //打开字体对话框 { RichEdit1->Font=FontDialog1->Font;//把多文本编辑器的字体设置为所选字体 } if(ColorDialog1->Execute()) //打开颜色对话框 { RichEdit1->Font->Color=ColorDialog1->Color;//把多文本编辑器的颜色设置为所选颜色 } 三.查找和替换对话框    查找对话框(FindDialog)为应用程序提供查找功能,我们可以通过使用查找对话框在文本文件中查找指定的字符串。应用程序要查找的字符串对象放在FindText属性中,当我们在查找对话框中输入了目标字符串并点击‘查找下一个’ 按钮,查找对话框将发生OnFind事件。但是查找对话框并不负责字符串查找工作,所以我们要在这个事件中代码中添加实现代码。 void __fastcall TForm1::FindDialog1Find(TObject *Sender) { //加入实现查找字符串的功能的代码 }    替换对话框(ReplaceDialog)为应用程序提供替换功能。它试从查找对话框对象继承而来,所以除了包括查找对话框的所以功能外,还包括用户替换被选中的字符串。当我们在查找对话框中输入了目标字符串并点击‘查找下一个’ 按钮,查找对话框将发生OnFind事件,我们要在这个事件中代码中添加实现查找的代码;当我们点击‘替换’或者‘全部替换’的按钮时,产生OnReplace事件,我们要在这个事件中添加实现替换的代码。 void __fastcall TForm1::ReplaceDialog1Find(TObject *Sender) { //加入实现查找字符串的功能的代码 } void __fastcall TForm1::ReplaceDialog1Replace(TObject *Sender) { //加入实现替换字符串的功能的代码 }  以下是一个文字处理程序,它包括了我们上面讲到的几个通用对话框,可以实现读取文本文件,改变文本文件的字体和颜色,以及在文本中查找和替换字符串等功能。 主要代码: void __fastcall TForm1::ToolButton1Click(TObject *Sender) { if(OpenDialog1->Execute()) { RichEdit1->Lines->LoadFromFile(OpenDialog1->FileName); } } //------------------------------------------------------------- void __fastcall TForm1::ToolButton2Click(TObject *Sender) { if(SaveDialog1->Execute()) { RichEdit1->Lines->SaveToFile(SaveDialog1->FileName); } } //-------------------------------------------------------------- void __fastcall TForm1::ToolButton3Click(TObject *Sender) { if(FontDialog1->Execute()) { RichEdit1->Font=FontDialog1->Font; } } //-------------------------------------------------------------- void __fastcall TForm1::ToolButton4Click(TObject *Sender) { if(ColorDialog1->Execute()) { RichEdit1->Font->Color=ColorDialog1->Color; } } //--------------------------------------------------------------- void __fastcall TForm1::ToolButton5Click(TObject *Sender) { FindDialog1->Execute() } //--------------------------------------------------------------------------- void __fastcall TForm1::ToolButton6Click(TObject *Sender) { ReplaceDialog1->Execute() } //------------------------------------------------------------ void __fastcall TForm1::FindDialog1Find(TObject *Sender) { int FoundAt,StartPos,ToEnd; if(RichEdit1->SelLength) { StartPos=RichEdit1->SelStart+RichEdit1->SelLength;//从文件的当前位置开始查找 } else { StartPos=0; //从文件开头开始查找 } ToEnd=RichEdit1->Text.Length()-StartPos;//一直查找到文件的末尾 FoundAt=RichEdit1->FindText(FindDialog1-> FindText,StartPos,ToEnd,TSearchTypes()< if(foundat!=-1) //如果返回'-1'就是没找到,否则就是找到 { RichEdit1->SetFocus(); RichEdit1->SelStart=FoundAt; RichEdit1->SelLength=FindDialog1->FindText.Length(); } } //--------------------------------------------------------------- void __fastcall TForm1::ReplaceDialog1Replace(TObject *Sender) { TReplaceDialog *dlg=(TReplaceDialog *)Sender; int SelPos=RichEdit1->Lines->Text.Pos(dlg->FindText); if(SelPos>0) //如果找到,就把找到的字符串替换掉 { RichEdit1->SelStart=SelPos-1; RichEdit1->SelLength=dlg->FindText.Length(); RichEdit1->SelText=dlg->ReplaceText; } else { MessageBeep(0); } } 多页面窗口设计    多页面窗口就是指可以在同一个窗口上建立好几页重叠的画面,并且可以利用顶端的‘标签头’在各页中间切换,C++Builder的组件面板就是一个多页面的对象。用多页面设计的用户界面,是非常好用的界面,因为我们可以将一大堆功能或选项利用这中界面分类,而且只占用整个屏幕的其中一小部分,既美观又省平面空间,更重要的是我们可以一眼看到整个窗口。    C++Builder提供力两种多页面的窗口组件,一种是Windows3.1操作界面的TabbedNotebook组件(在组件面板的Win3.1页上),另一种是新的Windows95和Windows98界面的PageControl组件(在组件面板的Win32上)。我们这里只讲后者。    新建一个工程,把一个PageControl组件加到Form1上,在PageControl1上点击鼠标右键,弹出右键菜单,选择【New Page】功能来增加页面, 选择【Delete Page】功能删除当前页面(凸起的Tabsheet2,下有8个小黑点)。不过必须先把焦点定在页面组件上,再按【Del】键,那么选中页面就会被删除; 如果你不小心把焦点定在PageControl上(整个PageControl,也有8个小黑点,但是比上一步的大,而且Delete命令和位置和上一步都不一样),整个PageControl组件都会从Form1中删除掉,所以在删除页面的时候要多加小心。 【Next Page】或者【Previous Page】功能选项来前后变换当前页面,    多页面组件(PageControl)的几个常用属性 1. ActivePage    当前激活的页面,可以在设计时设置,则为程序运行时的默认当前页面;也可以在程序运行中动态改变其值,使想要的页面自动变成当前激活页面。 例如:PageControl1->ActivePage=TabSheet2;//把第二页设置为当前页 2. PageIndex    页面排列顺序,修改此栏可以改变页面排列的顺序。可以在设计时设置,也可以在程序运行中修改。    例如:PageControl1->Pages[2]->PageIndex=0;//把第三页调到最前面。 3. MultiLine    多页面显示类型。如果是false,则当你增加的页面超过Form的宽度,会在Form的右上角显示一对左右方向的箭头符号,可以点选箭头符号来查看超过窗口范围的页面;如是true,则可以把所以的页面标签都显示通通显示在同一个Form的窗口范围内。 第七章 Builder中灵活使用剪贴板    剪贴板(ClipBoard)是Windows应用程序中运用得最多最普遍的工具,它是Windows系统自带的。通过剪贴板,应用程序可以剪切、拷贝以及粘贴文本、图形和对象。C++Builder的编辑组件封装了标准的Windows文本处理控件,它们内嵌了与剪贴板交互的所有方法。所以用Builder开发与剪贴板有关(如需要剪切、拷贝以及粘贴文本和图形)的应用程序十分简单方便。 一、使用剪贴板剪切、拷贝和粘贴文本   要使用剪贴板剪切、拷贝及粘贴文本,可以分别调用编辑组件的CutToClipboard、CopyToClipboard及PasteFromClipboard方法。 如下例子中。分别在Form上放两个RichEdit和两个PopMenu控件,一个RichEdit对应一个PopMenu:   编辑PopMenu,加入剪切、复制以及粘贴三项内容: 在代码窗口中,双击每个剪切,复制,粘贴(N1!~N6),出现对应的代码位置。直接把下面的代码复制到图示位置即可。。。  加入相关代码: void __fastcall TForm1::C1Click(TObject *Sender) { RichEdit1->CutToClipboard(); } void __fastcall TForm1::N1Click(TObject *Sender) { RichEdit1->CopyToClipboard(); } void __fastcall TForm1::P1Click(TObject *Sender) { RichEdit1->PasteFromClipboard(); } void __fastcall TForm1::T1Click(TObject *Sender) { RichEdit2->CutToClipboard(); } void __fastcall TForm1::C2Click(TObject *Sender) { RichEdit2->CopyToClipboard(); } void __fastcall TForm1::P2Click(TObject *Sender) { RichEdit2->PasteFromClipboard(); }    运行程序,通过右键菜单,你可以把RichEdit的内容剪切,或者复制到另外一个RichEdit(当然也可以粘贴到自己里面)。 二、使用剪贴板处理图形   可以使用Windows的剪贴板在应用程序中复制、剪切和粘贴图象,或者与其他应用程序交换图形。Builder的VCL的对象使得处理不同类型的数据(包括图形)变得更为容易。   在使用Clipboard对象之前,必须把头文件Clipbrd.hpp加到需要访问的Clipboard数据的.cpp文件中。 即在.cpp文件中加入:#include 。 1、把图形复制到剪贴板    可以将任何图片,包括图象控件的内容都复制到剪贴板中。一旦复制到剪贴板上,图片就可供所有的Windows程序使用。    要把图形复制到剪贴板,需要用Assign方法把图片对象赋值给对象。    下面代码是把图象控件Image1复制到剪贴板: Clipboard()->Assign(Image1->Picture);    2、把图形剪切到剪贴板中    把图形剪切到剪贴板和复制相同,只是同时也将源图形删除。通常的做法是首先把它复制到剪贴板,然后把所剪切的区域设为黑色。 实现代码如下: TRect ARect; Clipboard()->Assign(Image1->Picture); //把图形复制到剪贴板 Image1->Canvas->CopyMode=cmBlackness; //把复制颜色设为黑色 ARect=Rect(0,0,Image1->Width,Image1->Height); Image1->Canvas->CopyRect(ARect,Image1->Canvas,ARect);// 把所剪切的区域设为黑色 Image1->Canvas->CopyMode=cmSrcCopy; //恢复复制颜色为默认值   3、从剪贴板粘贴图形    若Windows 的Clipboard包含位图图形,可将它粘贴到任意图象对象,包括图象控件和窗体控件。剪贴板的图形可以来自应用程序内,也可以从其他应用程序复制而来。    要从剪贴板粘贴图形: (1)调用的HasFormat方法检查剪贴板中是否包含图形。传入参数CF_BITMAP,若剪贴板中包含图形,则返回true。   (2)将对象赋值给目标对象。 实现代码如下: Graphics::TBitmap *Bitmap; //定义一个位图变量指针 if(Clipboard()->HasFormat(CF_BITMAP)) //判断剪贴板中是否有图形 { Image2->Picture->Bitmap->Assign(Clipboard()); //将对象中的图形赋值给目标对象 Image2->Canvas->Draw(0,0,Bitmap); //显示图形 } 第八章 C++Builder中使用图形    C++Builder的VCL图形组件封装了Windows图形设备接口(GDI,Graphics Device Interface),使得在Windows程序设计中添加图形也变得很容易。    在C++Builder应用程序中绘制图形,应该在图形对象(如Form,Image等)的画布(Canvas)中绘制,而不是直接在对象中绘制。画布是图形对象的属性,同时它本身又是对象。画布对象的一个主要的优点是它能够有效地处理资源并且能管理设备场境。所以应用程序可以用相同的方法在屏幕、打印机、位图或者图元文件中绘图。直接在控件的画布上绘图,该图就会立即显示。 画布(Canvas)的主要属性和方法: 一、 使用画笔(Pen)。    画布的Pen属性控制线条出现的方式,包括用来绘制形状外框的线条。    画笔本身有四个属性:Color,Width,Style和Mode: (1)Color属性:更改画笔的颜色; Canvas->Pen->Color=color;    还可以用rgb的各分量的值来表示一种颜色:    Canvas->Pen->Color=RGB(214,214,200); (2)Width属性:更改画笔的宽度;    Canvas->Pen->Width=n; (3)Style属性:更改画笔的样式;    Canvas->Pen->Style=psDash; (4)Mode属性:更改画笔的模式。    Canvas->Pen->Style=pmCopy;  画布的Brush属性控制填充区域的方式,包括形状的内部区域。 画刷有三个属性: (1)Color属性:更改填充颜色;    Canvas->Brush->Color=color; (2)Style属性:更改画刷样式;    Canvas->Brush->Style=bsSolid; (3)使用位图作为画刷模式。    BrushBmp->LoadFromFile("MyBitmap.bmp");    Form1->Canvas->Brush->Bitmap = BrushBmp;    Form1->Canvas->FillRect(Rect(0,0,100,100)); 三、 单独设置和获取单个象素点    读取:color=Canvas-> Pixels[x][y];//读取位置为(x,y)的象素的点的颜色值    Canvas->Pixels[x][y] = clRed; //把位置为(x,y)的象素值设置为红色 四、 使用Canvas的方法来绘制图形对象 (1) 绘制直线    Canvas->MoveTo(0, 0);    Canvas->LineTo(X, Y);//从(0,0)到(X,Y)画一条直线 (2)绘制折线 POINT points[6]; pPB->Canvas->Pen->Color = clWhite; points[0].x = 40; points[0].y = 10; points[1].x = 20; points[1].y = 60; points[2].x = 70; points[2].y = 30; points[3].x = 10; points[3].y = 30; points[4].x = 60; points[4].y = 60; points[5].x = 40; points[5].y = 10; pPB->Canvas->Polyline(points,5); (3)绘制矩形、椭圆形和圆角矩形 矩形:Canvas->Rectangle(0, 0, 100, 400); 椭圆形:Canvas->Ellipse(0, 0, Image1->Width, Image1->Height); 圆角矩形:Canvas->RoundRect(x, y, x + Dx, y + Dy, Dx/2, Dy/2); (4)绘制多边形 Windows::TPoint points[4]; points[0] = Point(10,10); points[1] = Point(30,10); points[2] = Point(130,30); points[3] = Point(240,120); Canvas->Polygon(points, 3); 第九章 文件的存取    C++Builder按照数据在磁盘的存取方式,将数据文件分成顺序存取和随机存取文件两种。 顺序存取文件(Sequential Access File)    简称“顺序文件”,数据写入驱动器的方式是后输入的数据放在以前输入数据的后面,按照数据的先后次序一个接一个的放。若要读取数据,也是由第一条记录开始读取,新增的数据放在旧数据的最后面。这种数据文件每一条记录的长度都不一样,虽然比较节约空间,可是每次查询都必须从头开始找起,越在后的数据找寻时间就越久。 随机存取文件(Random Access File)    简称“随机文件”,每一条记录在磁盘中所占的长度都相同。数据存入磁盘的方式没有先后次序的限制;由于每个数据占用的长度固定,查询时只要告知第几个数据便可利用公式算出该数据的位置,快速地存取那个数据。所以不管数据在前还是在后,找寻的时间都大约相同,至于每个数据所占磁盘空间长度应设置多长,必须以一条纪录长度最长的那个为基准,当每个数据实际长度差异很时,试用随机文件会比较浪费磁盘空间。 一、 数据文件的操作方式    数据文件是通过程序产生的,一般我们对数据文件的操作,大致采用下列七种方式来维护数据文件内的数据: 1.建立文件操作:用来产生一个新的数据文件并确定使用哪种存取模式来读写数据文件。 2.新增操作:在指定的数据文件中加入新的数据。 3.删除操作:在指定的数据文件中,将指定的数据去掉。 4.修改操作:在指定的数据文件中对指定数据的内容做修改。 5.查询操作:找出满足条件的数据显示在屏幕上,适用于少量的数据。 6.打印操作:找出满足条件的所以数据,由打印机列出,适用于大量数据。 7.分析操作:将满足特定条件的数据挑出来,作为统计、分析决策的参考。 二、 常用的文件函数 详细说明见下表 打开文件 语法:FILE*fopen(const char *filename,const char *mode); 功能:以指定模式打开文件 『说明』 1.char *filename:可以为一个字符串,用它来代表要打开的文件或设备,若文件不在目前的文件夹下,就必须在文件名前加上路径名称。 2.Char mode(模式):用来设置要打开文件属于哪种类型的数据文件以及数据存取模式,如下表: 二、 常用的文件函数 语法:int fclose(FILE *stream); 功能:将文件指针所对应的数据文件关闭 1.Stream为文件指针,fclose(file1); 2.任何已打开的文件,不再使用时,要记得关闭,这样才能将占用的缓冲区归还系统。 3.以w或a模式打开的文件,fclose函数会先将存放在缓冲区那的数据写入文件中,再将数据文件关闭。 Feof函数 语法:int fileno(FILE *stream) 功能:用来测试文件是否结束 1.再读取数据文件中的数据时,可用feof函数来判断文件的指针是否已经指到文件的结尾。 2.如果已经指到文件结尾,表示数据已经读完,feof函数值传回true,否则为false。 3.此函数一半再顺序文件中读取数据时,用来判断该文件是否读完。 Fileno函数 语法:int fileno(FILE *stream); 功能:将指定数据文件的代码(handle)传回 1.传回值为证书代码(handle),以byte为单位。 Filelength函数 语法:int filelength(int handle); 功能:将代码所代表数据文件的长度传回 1.传回值为长整形,以byte为单位。 顺序文件    “顺序文件”就是指数据在做存取的时候,学要按照数据存入的先后次序处理,就像使用录音带一样,如果你想听第五首歌,那么必须要绕过前四首。所以顺序文件在写数据的时候是按照一个接一个的顺序写入的,而读数据的时候也一样。顺序文件的特性和使用时机如下: 特性 1.每一条纪录长度可以不一样。 2.增加数据时,一定要从原有的数据的最后一条开始加入。 3.每次找寻数据时都要从头开始找起,不但费时而且操作效率低。 4.若每条数据的长度差异很大时,使用顺序文件来存数据可节省内存空间。 使用时机 1.每条记录长度无法确定时。 2.数据不经常做新增、修改和删除操作时。 3.处理数据时时按照顺序连续处理,而非跳来跳去。 一、顺序文件数据的写入    c++builder对顺序文件数据的写入,提供了fprintf函数。 语法:int fprintf(FILE *stream,const char *format[,argument,……]); 功能:一格式话讲数据写于文件中 1.Stream:文件指针必须和打开文件fopen函数的文件指针相同。 2.Format为格式化输出。 例子1 由键盘输入学生的资料并存入磁盘中。 『分析说明』 1.可以通过文字框输入学生的学号、姓名和成绩,如下图 2.源代码分析 #include #include //引用stdio.h库 FILE *outf; //定义一个文件指针 #pragma hdrstop #include "Unit1.h" #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } void __fastcall TForm1::FormCreate(TObject *Sender) { outf=fopen("c:\\studentinfo.txt","w+"); //打开c:\studentinfo.txt文件 } void __fastcall TForm1::Button1Click(TObject *Sender) { String s_name,s_number; int mark; s_number=Edit1->Text; s_name=Edit2->Text; mark=StrToInt(Edit3->Text); fprintf(outf,"%s %s %d",s_number,s_name,mark); //把学号、名字和成绩保存到文件里 Edit1->Text=""; Edit2->Text=""; Edit3->Text=""; } void __fastcall TForm1::Button2Click(TObject *Sender) { String s_name,s_number; int mark; if(Edit1->Text!="") { s_number=Edit1->Text; s_name=Edit2->Text; mark=StrToInt(Edit3->Text); fprintf(outf,"%s %s %d",s_number,s_name,mark); } fclose(outf); //关闭文件 Form1->Close(); } 二、 顺序文件数据文件的读取    C++Builder对顺序文件数据的读取,提供了fscanf函数。 语法:int fscanf(FILE *stream, const char *format[, address, ...]); 功能:以格式化由文件中读取数据,存于指定变量中 1. 数值变量之前要加&符号; 2. Format格式化输入。 例子2 代码分析: FILE *inf; //定义文件指针 bool flag; //定义一个布尔变量,标志文件是否打开的状态 __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } void __fastcall TForm1::Button1Click(TObject *Sender) { char *number=new char; char *name=new char; //定义两个字符串指针,存放学号和姓名 int mark; if(!feof(inf)) { fscanf(inf,"%s %s %d",number,name,&mark); Edit1->Text=number; Edit2->Text=name; Edit3->Text=IntToStr(mark); } else { fclose(inf); //关闭文件 flag=false; } } void __fastcall TForm1::FormCreate(TObject *Sender) { flag=false; Button3Click(Sender); } void __fastcall TForm1::Button3Click(TObject *Sender) { if(flag) { fclose(inf); } inf=fopen("c:\\studentinfo.txt","r+"); //打开文件 flag=true; Button1Click(Sender); } void __fastcall TForm1::Button2Click(TObject *Sender) { fclose(inf); Form1->Close(); } 随机文件    如果要让文件中的数据能够随意存取,而不要按照数据的先后顺序写入或者读出,那么就需要利用随机文件。同一个随机文件中每一条记录在磁盘中所使用的长度是一定的。随机文件中每一条记录都指定一个编号,存取时按照编号计算出其所存放位置,来存取数据。 Fseek函数 语法:int fseek(FILE *stream, long offset, int whence); 功能:将指针移动到文件指定位置 1. stream:文件指针名称必须和fopen函数的文件指针名称相同; 2. whence:文件位置; 3. offset:相对于whence所在位置,以Byte为单位。 fwrite 语法:size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream); 功能:将数据写入随机文件中 fread 语法:size_t fread(void *ptr, size_t size, size_t n, FILE *stream); 功能:将数据由随机文件中读出 1. stream:为文件指针; 2. ptr:为文件指针或存取变量名称,若为变量前面加&; 3. size:一条记录大小,以Byte为单位; 4. n:每次存取多少个数据。 例子3:    以随机文件方式输入和读取学生数据。 1. 输入学生数据 代码分析: #include #include #include //引用io.h和stdio.h库 #pragma hdrstop #include "Unit1.h" #pragma package(smart_init) #pragma resource "*.dfm" struct student //定义学生记录的结构 { int number; //学号 char name[12]; //姓名 int mark; //成绩 }; student stu; //定义一个学生记录结构的别名 int total; //定义一个保存所有记录总数的变量 FILE *file1; //定义个文件指针 TForm1 *Form1; __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } void __fastcall TForm1::Button1Click(TObject *Sender) { stu.number=StrToInt(Edit1->Text); strcpy(stu.name,Edit2->Text.c_str()); stu.mark=StrToInt(Edit3->Text);//把学生的学号,姓名和成绩保存到结构中 fseek(file1,sizeof(stu)*(total-1),SEEK_SET); //把文件指针移动到最后一条记录之后 fwrite(&stu,sizeof(stu),1,file1); //把一条学生记录保存到磁盘上 total=total+1; Edit1->Text=""; Edit2->Text=""; Edit3->Text=""; } void __fastcall TForm1::Button2Click(TObject *Sender) { if(Edit1->Text!="") { stu.number=StrToInt(Edit1->Text); strcpy(stu.name,Edit2->Text.c_str()); stu.mark=StrToInt(Edit3->Text); fseek(file1,sizeof(stu)*(total-1),SEEK_SET); fwrite(&stu,sizeof(stu),1,file1); } fclose(file1); //关闭文件 Form1->Close(); } void __fastcall TForm1::FormActivate(TObject *Sender) { file1=fopen("c:\\student.txt","a+"); //打开文件 total=filelength(fileno(file1))/sizeof(stu); //计算文件记录总数,保存到变量中 } 2.读出学生数据 代码分析: #include #include #include #pragma hdrstop #include "Unit1.h" #pragma package(smart_init) #pragma resource "*.dfm" struct student { int number; char name[12]; int mark; }; student stu; int total; FILE *file1; TForm1 *Form1; __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } void __fastcall TForm1::Button2Click(TObject *Sender) { fclose(file1); Form1->Close(); } void __fastcall TForm1::FormActivate(TObject *Sender) { file1=fopen("c:\\student.txt","a+"); total=filelength(fileno(file1))/sizeof(stu)+1; } void __fastcall TForm1::Button1Click(TObject *Sender) { int number; //定义一个变量存放要查询学生的学号 number=StrToInt(Edit1->Text); if(number>0&&number<=total) { fseek(file1,sizeof(stu)*(number-1),SEEK_SET);//移动文件指针到指定位置上 fread(&stu,sizeof(stu),1,file1); //读出学生记录 Edit1->Text=IntToStr(number); Edit2->Text=stu.name; Edit3->Text=IntToStr(stu.mark);//显示学生记录 } }

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档