第1章 C++builder6概述
C++_Builder6.0基础学习文档
Borland C++Builder 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)数据库引擎。
C++_Builder6.0简易实例教程 (2)
BorlandC++Builder6.0教程BorlandC++Bilder6.0是Interprise(Borland)公司推出的基于C++语言的快速应用程序开发(RapidApplicationDevelopment,RAD)工具,它是最先进的开发应用程序的组件思想和面向对象的高效语言C++融合的产物。
C++Builder充分利用了已经发展成熟的Delphi的可视化组件库(VisualComponentLibrary,VCL),吸收了BorlandC++6.0这个优秀编译器的诸多优点。
C++Builder结合了先进的基于组件的程序设计技术,成熟的可视化组件库和优秀编译器,调试器。
发展到6.0版本,C++Builder已经成为一个非常成熟的可视化应用程序开发工具,功能强大而且效率高。
C++Builder的特色:1.C++Builder是高性能的C++开发工具C++Builder是基于C++的,它具有高速的编译,连接和执行速度。
同时,C++Builder具有双编译器引擎,不仅可以编译C/C++程序,还能编译ObjectPascal语言程序。
2.C++Builder是优秀的可视化应用程序开发工具C++Builder是一完善的可视化应用程序开发工具,使程序员从繁重的代码编写中解放出来,使他们能将注意力重点放在程序的设计上,而不是简单的重复的劳动中。
同时,它提供的完全可视的程序界面开发工具,从而使程序员对开发工具的学习周期大大缩短。
3.C++Builder具有强大的数据库应用程序开发功能C++Builder提供了强大的数据库处理功能,它使的程序员不用写一行代码就能开发出功能强大的数据库应用程序,这些主要依赖于C++Builder众多的数据库感知控件和底层的BDE数据库引擎。
C++Builder除了支持MicroSoft的ADO(ActiveDataObject)数据库连接技术,还提供了一种自己开发的成熟的数据库连接技术——BDE (BorlandDatabaseEngine)数据库引擎。
cbuilder6编程(宝典)
第2 章语法摘述 2.1 抽象数据类型CBuilder 中以类的方式提供了几个非常有用的抽象数据类型。
包括TList 链表 类、AnsiString 类、Set 集合 类、DynamicArray 动态数组 类和TStream 流 类。
在程序编写过程中 这几个类的使用在很多地方都起到很重要的作用。
2.1.1 TList 类TList 实现了线形链表 可以用来存储任意类的对象 包括用户自定义的类。
虽然它是链表 但是它实际上是一个存放指针的数组 可以通过其Items 属性象访问一个数组那样实现对TList 对象的每一个元素的访问。
TList 类提供了足够的属性和方法实现对链表的各种操作 如全套插入、删除、查找、排序以及提供链表元素数目 Count 属性 等属性。
1 TList 类的主要属性有 Capacity 属性__property int Capacity readFCapacity writeSetCapacity nodefault 设定Capacity 指定TList 对象中的元素个数 并为新增加的元素分配内存。
如果没有足够的内存为新元素分配空间 将会抛出一个EOutOfMemory 异常。
这里需要注意Capacity 属性和Count 属性的不同。
Count 属性是TList 对象中Items 属性的元素个数 而Capacity 是TList 类可以包含的元素个数 由分配了多少的内存决定 Capacity 总是大于或者等于Count。
将一个元素插入链表 其Capacity 属性会自动随之更改。
如果需要多次的执行添加操作 那么可以先设置Capacity 这样就能避免每次Add 方法都要重新指定内存从而提高程序的执行效率 如下面的代码 List-gtClear List-gtCapacity Count for int I 0 I lt Count I List-gtAdd... 代码中 在循环执行Add 之前先指定了Capacity 属性 这样就避免了循环中Add 的分配内存的操作 提高了程序的效率 而且 也避免了分配内存时的异常。
C++Builder-6教程
C++Builder的基本功能我们用高级语言写程序,我们很得意,因为高级语言比较接近人类的语言,使我们用起来得心应手,所以我们当然得意。
但我们更得意的一定是让程序代码赶快变成可执行文件。
无论是在写代码的过程,还是最后要编译成可执行文件,都需要有一个工具存在。
这一工具一般称为编程集成环境(IDE)。
之所以称为集成,是因为从写代码到最后软件的出炉,我们需要它的地方实在太多了,这里列出其中最重要的功能项。
1、代码编辑:方便的代码编辑功能。
尽管你可以使用记事本、Word或其它任何文本编辑器来写代码,但除非特殊需要,否则那将是极为低效的方法。
相反,现在的编程集成环境,都相当的智能,举例如:代码自动功能,可以在很多情况下自动完成我们所需的代码,既准确还迅速。
Borland公司出品的编程集成环境不仅有常见的关键字高亮等功能,还支持代码模板,支持键盘宏,同样支持高级的脚本插件功能。
2、界面设计:可视化的程序界面设计功能。
你所要产生的窗口,在设计期间就真实地出现,包括字体、颜色和定位。
比如:你不仅可以插入falsh的动画,而且无需运行,就直接可以在你的界面上看到该动画的演播,这是别的编程环境不能做到的。
3、程序编译:这是编程工具的主要功能。
我们写的代码在成为机器能懂的可执行程序时,必须通过编译。
4、程序调试:如何尽量减少你程序的BUG呢?没有编程集成环境提供的强大调试功能,我们做的程序将毫无质量保证。
5、代码优化:Borland 提供的编译器,不仅在编译速度上一直在美国屡获大奖,而且其代码自动优化功能一直领先对手几近一个时代。
使用编程集成环境,我们可以轻松获得更快更优的最终可执行程序文件。
6、辅助程序安装:程序的安装已属于另外一种工具的范畴,但我们仍可以通过编程集成环境来决定最终生成单一可执行文件,还是带有其它动态库。
如果是后者,我们还可以通过集成环境来检查程序运行时调用了哪些动态库文件。
C++Builder 提供的功能远不止我上面所说的,并不是因为我嘴笨,而是我认为对一个工具,你只有动手使用,才会真正了解它。
CH01 C++ Builder 6简介
20
1-2. 如何安裝使用Borland C++ Builder 6
◎
◎
◎ ◎
◎ ◎
5
1-1.C++ Builder 6簡介
– BizSnap 運用Web Services的e-Business開發平台 Personal Professional 功能 運用符合W3C標準XML、SOAP、 ◎ WSDL建構呼叫Web Services之用戶 端應用程式 建構伺服器端符合W3C標準XML、 SOAP、WSDL之Web Services XML繫結 (binding) 精靈可轉換XML 文件成為C++物件,簡化存取XML檔 案之程式撰寫 提供XML轉換元件及工具,將現有企 業資訊輕易轉換為XML格式資料,以 利與企業夥伴間資訊交流
•
在選擇安裝元件的畫面按下Next之後,還有幾 個畫面是在設定『BDE SQL Driver』、是否安 裝『VisiBroker / CORBA Support』、『Office 版本』、『想要連結的檔案副檔名』、『安裝目 錄』等等,最後還會要求使用者決定要不要紀錄 安裝過程的資料到硬碟上。等上述一切都設定完 畢,InstallShield就會馬上幫我們開始安裝BCB 6。
• 來到安裝模式的選單,在這個選單我們可以選擇Typical、Compact、 Custom這三種模式 – 如果擔心安裝不夠完整,可以選擇Custom 來安裝Borland C++ Builder 6,因為在 Custom的安裝模式下,可以選擇『全部安裝』。 – 當我們選擇了Custom之後,有可能會 出現一個『Just-In-time Debugging』的 訊息視窗,這個視窗主要是想要告訴我們, 目前在系統的registry中已經有一個Just-In-Time的Debugger在運作, 我們是不是要使用 Borland C++ Builder 6 當作這個Just-In-Time Debugger,如果要的 話就選擇『是』,如果 不要的話就選擇『否』。
第1章 C++Builder开发环境
C++Builder开发环境 第1章 C++Builder开发环境
C++ 是在C语言基础上扩充而成的一种编程语言, 它具有C语言紧凑、高效等优点并支持面向对象程序设 计的技术,本书第2章将简单介绍C++语言和面向对象 程序设计。对已初步掌握C语言的读者来说,只需对面 向对象程序设计的有关概念稍有了解,就能使用BCB 编写简单程序了。当然,要使用BCB编写复杂的、高 质量的程序,就必须对所使用的C++语言的各种特性 有深刻理解。我们认为,掌握C++ 和面向对象程序设 计是一个从实践中学习的循序渐进的过程,本书会提 供一个很好的起点。
C++Builder开发环境 第1章 C++BuildeBuilder开发环境 第1章 C++Builder开发环境
1.1.4 一个简单的程序 为了让读者尽早了解在BCB下编程是怎么回事, 我们在本节给出一个简单的“Hello,World!”程序。该 程序运行时显示一个窗口,窗口内有一个命令按钮, 当按钮被点击时,窗口的标题显示为“Hello,World!”。 下面,我们详细给出在BCB下编制该程序的每一步。 BCB (1) 启动BCB,出现如图1-1所示的界面。此时编程 环境中已存在一个应用程序的框架,显示在该图右下 方的标题为Form1的一个空白的窗口即是该应用程序的 窗口,习惯上我们称它为窗体。
C++Builder开发环境 第1章 C++Builder开发环境
图1-6 保存单元文件
C++Builder开发环境 第1章 C++Builder开发环境
C++_Builder6.0简易实例教程
Borland C++Builder 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应用法式.(1)组件面板标准组件选项卡上的组件是构成Windows应用法式窗口最经常使用的标准元素,它们包括15种组件.主要有:主菜单(MainMenu),右键菜单(PopMenu),标签(Label),备注(Memo),命令按钮(Button),单选按钮(GroupBox),复选按钮(CheckBox),列表框(ListBox),下拉式列表框(ComboBox),滚动条(ScrollBar),组框(GroupBox)和单项按钮组框(RadioGroup).附加组件选项卡上的组件是Windows应用法式经常使用的专门控制元素,它包括14种组件.主要有:位图按钮(BitBtn),加速按钮(SpeedButton),格式编纂框(MaskEdit),字符网格(StringGrid),数据网格(dataGrid),图片框(Image),形状(Shape),和控制栏(ControlBar).Win32组件选项卡上的组件是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…】,弹出【Import ActiveX】的对话框,在对话框中选择你要引用的ActiveX控件. 1. 控件类明,可以包括多个,暗示这个ActiveX控件包里面有多个ActiveX控件,如这里就包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】菜单下直接选择【NewApplication】.二.加入相关组件. 把要用到的组件从在组件面板(Palette)上拖到窗体(Form)上,摆好位置,并设置好年夜小.我们这里用到一个标签(Label)和两个命令按钮(Button).再改变窗体的年夜小,使窗体看上去好看一点.三.设置组件的属性在属性检查器中修改各个组件的属性.下面的图示是把Label1的Caption(题目)属性改为‘HelloWorld’.先点击窗体上的Label1组件,再在右边的属性检查器中选定Caption的项,输入’HelloWorld’.编程入门第一课――HelloWorld如上述所示,分别设置三个组件的属性为:组件属性值Form1 Caption HelloWorldLabel1 Caption HelloWorldFont 宋体,粗体,一号Button1 Caption StartButton2 Caption Exit四.加入事件.双击Button1,弹出代码编纂窗口,在Button1Click事件中加入以下代码:Label1->Caption="Hello C++Builder!" ;双击Button2,在Button1Click事件中加入以下代码:Form1->Close();五.编译运行HelloWorld法式. 按快速栏上的运行按钮,或者按快捷键(F9)运行HelloWorld法式.按【Start】按钮 ,结果如下:按【Exit】退出法式. 到此为止,一个完整的HelloWorld法式就完成啦,是不是简单得不成思议呢?下面再说两个小技巧:1.更换题目栏上得图标. 更改窗体(Form1)的Ico属性,把它改为你想要的图标文件(*.Ico).2.更改执行文件的图标在【Project】菜单下选【Options】,弹出【Project Option】对话框,选择【Application】页,按【LoadIcon…】键浏览选择自己想要的图标文件.按【OK】.按【Project】菜单下的【Build Project】编译HelloWorld法式,获得可执行文件(.exe).设计菜单之一――下拉式菜单用过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),在那个字符的前面加上‘&’z字符即可.当法式运行时,你可以同时按下【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和一个TImageList控件.然后在TCoolbar上加入一个TToolBar控件.把TCoolbar的Align属性设置为alTop.调整好TToolBar的高度,再把TToolBar 和TCoolBar控件的AutoSize属性都设置为true;步伐二:用鼠标右键单击TImagelist控件,翻开‘ImageListEditor’窗口,添加对应的copy,cut和paste图标.步伐三:在TToolBar控件上单击鼠标右键,在弹出的菜单中选择‘New Button’来拔出TButton,选择‘New Seperator’来拔出分割条.步伐四:将TToolBar控件的Images的属性设置为ImageList1,则TImageList控件中的图标立刻呈现在工具按钮菜单中. 步伐五:用鼠标双击功能按钮菜单中的任意一个按钮,就可以为这个按钮的事件响应编写处置代码了.二.TControlBar+TToolbar+TImageList 这种方法和以上的方法年夜同小异,只是把TCoolBar换成TControlBar就可以拉,这里不累赘说明.下图是其效果.三.把下拉式菜单放到功能按钮菜单上这是IE中最经常使用的菜单,在C++Builder可以轻易实现.步伐一:在窗体(Form)上放置一个TMainMenu控件,并设置好内容;步伐二:设置Tform的Menu属性为空;步伐三:放置一个TControlbar,再放置一个TToolbar在TControlbar上面步伐四:设置 TToolBar 的 ShowCaptions 属性为 true;步伐五:在 TToolBar 上增加几个 TToolButton,修改其 caption 模拟主菜单的样子;步伐六:将 TTollBar 的 grouped 属性设置成 true;步伐七:设置每个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),和一个翻开文件对话框控件(OpenDialog); 4.在主菜单中添加菜单项; 5.翻开文件对话框的过滤编纂器,添加以下内容;二.创立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 __fastcallTChildFrm::Save1Click(TObject *Sender){if(SaveDialog1->Execute()){RichEdit1->Lines->SaveToFile(SaveDialog1->FileName+".txt");//把RichEdit的内容保//存到文件}}void __fastcall TChildFrm::Copy1Click(TObject*Sender){RichEdit1->CopyToClipboard(); //把RichEdit中选中的内容拷贝到剪切板}void __fastcallTChildFrm::Cut1Click(TObject *Sender){RichEdit1->CutToClipboard(); //把RichEdit中选中的内容剪切到剪切板}void __fastcall TChildFrm::Paste1Click(TObject*Sender){RichEdit1->PasteFromClipboard(); //把剪切板中的内容粘贴到RichEdit的以后位置} MDI应用法式在缺省的情况下,执行关闭把持时其实不真正关闭子窗口,而仅仅是最小化它.因此子窗口关闭时,要首先设置其Action属性.void __fastcallTChildFrm::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的值是用来标识表记标帜提示信息框的类另外,下面是一些经常使用的类别:从上表可以看出来,提示信息框的类别可以分成含图标和不含图标,含图标的意思就是指提示信息框上会有代表意义的图形,不外这类型的提示信息框的按钮都是固定的,都是【确定】按钮,不能增加也不能省略;不含图标的提示信息框,虽然没有对应的图形显示在提示信息框上,可是你却可以在这种类型的提示信息框内,加入各种组合的按钮,用于各种分歧的情况.MessageBox函数会返回一个整数值,这个整数值代表用户刚刚点击提示信息框上的哪个按钮,每个返回值的代表意义在下表: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("是否信息框","是否信息框。
1.C++ Builder 6概述
20
• 什么是属性(Property)
– 属性,它就是对象的特性、特征。例如:汽车有颜色这个特征,但是 不同的汽车可能会有不同的颜色,所以颜色就是汽车的一个属性,其 余的如汽车的马力、汽车的车门数目、汽车的极速、汽车的排器 量„„等等,只要是用来描述这台汽车的东西都可以称作是这台汽车 的属性。 – 反观,在BCB中对于一个对象的属性是哪些呢?以按钮来说好了,按钮 的颜色、位置、大小„„等等,都是按钮的属性。说到这边,不知道 大家对于属性有没有更进一步的认识呢?
19
• 什么是对象(Object)
– 对象,照字面上的意义来说,就是一个一个的东西。没错,我们举几 个生活上的例子来说明:脚踏车是一个对象,汽车也是对象,锅子也 是对象,房子也是对象。如以上所说,其实一般我们可以看的到,摸 的到都可以称作是对象。 – 在BCB里面的对象则是一个一个的VCL组件,或是我们自己建立的对象 也是,例如按钮是个对象,选单也是个对象等等。简单的说明一下对 象的大概意义差不ent)
– 事件,简单来说就是会发生的事情。例如对于一台汽车来说,"正在驾 驶"就是一种事件,转弯、煞车等等都是。那对于BCB上的按钮来说, 按下按钮就是一个事件。如果是对于整个窗口来说,开启窗口也是一 个事件、窗口移动、窗口关闭等等也都是事件。
• 什么是方法(Method)
14
如何安装使用Borland C++ Builder 6
• 在你注册成功后继续开始BCB 6的过程中 将会出现BCB 6的Logo,在Logo这个画面 差不多停留了十多秒就会跳入BCB 6的 主画面。当然,根据计算机配备的不同, 停留在Logo的时间也会不同。
– 在这边我们还有一件事情要提醒各位。如果显示卡是S3系列的某些显示芯片 (如:Virge DX或Virge GX2等等),而且是使用Win95/98系列的操作系统, 可能会在开启BCB时当机,这时候你只需要在操作系统内找到system.ini这个 档案,用任何一种文字编辑器开启这个档案。先寻找[Display]这个项目,如 果找不到这个项目,则可以在档案的最后面加入,接着在这个项目内加入 DeviceBitmap=0后存档,重开机,之后就不会有这个问题了。
borland c++ builder6
开发可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的视窗和工具栏。
多人聊天系统 C++Builder 6
用户说明书服务器程序图标服务器窗口界面监听:点击监听即开启服务器,监听各个用户登陆情况;断开:即断开服务器,在有用户在线时,会提示确认信息;禁止用户:断开某些用户的连接;内容框:显示连接用户的IP 和用户名;发送信息窗口:用来对所有在线用户发送信息或者对个别用户发送信息;状态栏:分别显示用户连接数量、连接状态和目前时间。
用户客户端程序图标用户窗口界面主机:设置服务器IP的地址;登陆:可以自设用户名登陆或者匿名登陆服务器;离开:断开与服务器的连接;接受消息窗口:显示服务器端和客户端发送的信息;发送窗口:发送信息内容;在线用户列表:显示在线的用户昵称,选中可进行私聊对话;状态栏:分别显示本机IP地址,本机登陆状态和目前时间。
附录:1、服务器代码//---------------------------------------------------------------------------#include <vcl.h>#pragma hdrstop#include "ChatServer.h"//---------------------------------------------------------------------------#pragma package(smart_init)#pragma resource "*.dfm"TForm1 *Form1;int Num=0;//---------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){ServerSocket1->Port=1500;ServerSocket1->Active=true;m_iClientNum=0;m_sIsName="NA";m_sIsChat="CT";m_sPart="#";m_sIsCommand="CO";m_sTo="ALL";MenuListen->Enabled=false;MenuClose->Enabled=true;Application->OnException=AppException;TDateTime NowTime;NowTime=Now();StatusBar1->Panels->Items[2]->Text=NowTime.DateTimeString();}//---------------------------------------------------------------------------void __fastcall TForm1::ServerSocket1Accept(TObject *Sender,TCustomWinSocket *Socket){AnsiString sClientNum;m_iClientNum++;sClientNum.sprintf("有%d台客户连接",m_iClientNum);//Num=m_iClientNum;StatusBar1->Panels->Items[1]->Text="连接成功!";StatusBar1->Panels->Items[0]->Text=sClientNum;ListUserAddr->Items->Add(Socket->RemoteAddress);for(int i=0;i<ServerSocket1->Socket->ActiveConnections;i++)ServerSocket1->Socket->Connections[i]->SendText("CLEAR");Sleep(100);}//---------------------------------------------------------------------------void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender, TCustomWinSocket *Socket){AnsiString sTemp;AnsiString sPre;AnsiString sWelcome;sTemp=Socket->ReceiveText();sPre=sTemp.SubString(1,2);if(sPre==m_sIsName){AnsiString sName;sName=sTemp.SubString(3,sTemp.Length()-2);ListUserName->Items->Add(sName);for(int i=0;i<ServerSocket1->Socket->ActiveConnections;i++){for(int j=0;j<ListUserName->Items->Count;j++){AnsiString sName;sName=ListUserName->Items->Strings[j];ServerSocket1->Socket->Connections[i]->SendText(sName);Sleep(10);}sWelcome=m_sIsChat+m_sPart;sWelcome+=AnsiString("★服务器说: 大家欢迎(")+sName+AnsiString(") 的光临!");ServerSocket1->Socket->Connections[i]->SendText(sWelcome);}}if(sPre==m_sIsChat){AnsiString sTo,sChat;int iPos;iPos=sTemp.Pos(m_sPart);sTo=sTemp.SubString(3,iPos-3);sChat=m_sIsChat+sTemp.SubString(iPos,sTemp.Length()-iPos+1);if(sTo==AnsiString("ALL") )for(int i=0;i<ServerSocket1->Socket->ActiveConnections;i++)ServerSocket1->Socket->Connections[i]->SendText(sChat);if(sTo!=AnsiString("ALL") ){int iIndex=ListUserName->Items->IndexOf(sTo);ServerSocket1->Socket->Connections[iIndex]->SendText(sChat);}}}//---------------------------------------------------------------------------void __fastcall TForm1::AppException(TObject *Sender, Exception *E){Application->ShowException(E);Application->Terminate();}//---------------------------------------------------------------------------void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender,TCustomWinSocket *Socket){AnsiString sTemp,sClientNum;m_iClientNum--;sClientNum.sprintf("有%d台客户连接",m_iClientNum);//Num=m_iClientNum;StatusBar1->Panels->Items[0]->Text=sClientNum;sTemp.sprintf("%s断开连接!",Socket->RemoteAddress);StatusBar1->Panels->Items[1]->Text=sTemp;int iIndex;iIndex=ListUserAddr->Items->IndexOf(Socket->RemoteAddress);ListUserAddr->Items->Delete(iIndex);ListUserName->Items->Delete(iIndex);}//---------------------------------------------------------------------------void __fastcall TForm1::ServerSocket1ClientError(TObject *Sender,TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode){ErrorCode=0;}//---------------------------------------------------------------------------void __fastcall TForm1::EdtSendKeyDown(TObject *Sender, WORD &Key, TShiftState Shift){if(Key==VK_RETURN){if(EdtSend->Text==""){ShowMessage("对不起, 不能发空信息!");}else{AnsiString sTemp;sTemp=m_sIsChat+m_sPart+AnsiString("★服务器说:")+EdtSend->Text;if(m_sTo==AnsiString("ALL") )for(int i=0;i<ServerSocket1->Socket->ActiveConnections;i++)ServerSocket1->Socket->Connections[i]->SendText(sTemp);if(m_sTo!=AnsiString("ALL") ){int iIndex=ListUserName->Items->IndexOf(m_sTo);ServerSocket1->Socket->Connections[iIndex]->SendText(sTemp);}EdtSend->Clear();}}}//---------------------------------------------------------------------------void __fastcall TForm1::ListUserNameClick(TObject *Sender){m_sTo=ListUserName->Items->Strings[ListUserName->ItemIndex];LabelNotice->Caption=AnsiString("向")+m_sTo+AnsiString("发信息!");}//---------------------------------------------------------------------------void __fastcall TForm1::BtnToAllClick(TObject *Sender){m_sTo="ALL";LabelNotice->Caption="向所有人发信息";}//---------------------------------------------------------------------------void __fastcall TForm1::MenuCloseClick(TObject *Sender){if(ServerSocket1->Active)if (m_iClientNum!=0){if (MessageBox(Handle, "确实要断开连接吗?", "系统提示", MB_OKCANCEL | MB_ICONQUESTION) == IDOK){ServerSocket1->Close();MenuListen->Enabled=true;MenuClose->Enabled=false;ListUserAddr->Items->Clear();ListUserName->Items->Clear();m_iClientNum=0;StatusBar1->Panels->Items[0]->Text="有0台客户连接";StatusBar1->Panels->Items[1]->Text="服务器断开连接";}}else{ServerSocket1->Close();MenuListen->Enabled=true;MenuClose->Enabled=false;ListUserAddr->Items->Clear();ListUserName->Items->Clear();m_iClientNum=0;StatusBar1->Panels->Items[0]->Text="有0台客户连接";StatusBar1->Panels->Items[1]->Text="服务器断开连接";}}//---------------------------------------------------------------------------void __fastcall TForm1::MenuDisconnectClick(TObject *Sender){if(m_sTo=="ALL"){AnsiString sTemp;sTemp.sprintf("真的要断开与%s的连接吗?","所有人");if(MessageDlg(sTemp, mtConfirmation,TMsgDlgButtons() << mbYes << mbNo, 0) ==mrYes) for(int i=0;i<ServerSocket1->Socket->ActiveConnections;i++)ServerSocket1->Socket->Connections[i]->Close();}if(m_sTo!="ALL"){AnsiString sTemp;sTemp.sprintf("真的要断开与%s的连接吗?",m_sTo);if(MessageDlg(sTemp, mtConfirmation,TMsgDlgButtons() << mbYes << mbNo, 0) ==mrYes) {int iIndex=ListUserName->Items->IndexOf(m_sTo);ServerSocket1->Socket->Connections[iIndex]->Close();}}}//---------------------------------------------------------------------------void __fastcall TForm1::MenuListenClick(TObject *Sender){if(!ServerSocket1->Active)ServerSocket1->Open();MenuListen->Enabled=false;MenuClose->Enabled=true;}//---------------------------------------------------------------------------void __fastcall TForm1::btnsendClick(TObject *Sender){if(EdtSend->Text==""){ShowMessage("对不起, 不能发空信息!");}else{AnsiString sTemp;sTemp=m_sIsChat+m_sPart+AnsiString("★服务器说:")+EdtSend->Text;if(m_sTo==AnsiString("ALL") )for(int i=0;i<ServerSocket1->Socket->ActiveConnections;i++)ServerSocket1->Socket->Connections[i]->SendText(sTemp);if(m_sTo!=AnsiString("ALL") ){int iIndex=ListUserName->Items->IndexOf(m_sTo);ServerSocket1->Socket->Connections[iIndex]->SendText(sTemp);}EdtSend->Clear();}}//---------------------------------------------------------------------------void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose){if (m_iClientNum!=0){CanClose = (MessageBox(Handle, "还有用户在线,确实要退出吗?", "系统提示", MB_OKCANCEL | MB_ICONQUESTION) == IDOK);}else{CanClose=true;}}//---------------------------------------------------------------------------2、用户客户端代码//---------------------------------------------------------------------------#include <vcl.h>#pragma hdrstop#include "ChatClient.h"//---------------------------------------------------------------------------#pragma package(smart_init)#pragma resource "*.dfm"TForm1 *Form1;//---------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){m_sHostAddress=Powersock1-> LocalIP;StatusBar1->Panels->Items[0]->Text=Powersock1-> LocalIP;ClientSocket1->Active=false;ClientSocket1->Address=m_sHostAddress;ClientSocket1->Port=1500;m_sSpeakTo="ALL";m_sIsName="NA";m_sIsChat="CT";m_sPart="#";m_HasConnected=false;TDateTime NowTime;NowTime=Now();StatusBar1->Panels->Items[2]->Text=NowTime.DateTimeString();; }//---------------------------------------------------------------------------void __fastcall TForm1::ClientSocket1Connecting(TObject *Sender, TCustomWinSocket *Socket){StatusBar1->Panels->Items[1]->Text="正在连接,请稍后....";}//---------------------------------------------------------------------------void __fastcall TForm1::ClientSocket1Connect(TObject *Sender, TCustomWinSocket *Socket){Socket->SendText(m_sIsName+m_sName);AnsiString sTemp;sTemp.sprintf("%s登录成功!",m_sName);MenuConnect->Enabled=false;StatusBar1->Panels->Items[1]->Text=sTemp;LabelNotice->Caption=m_sName+AnsiString("对所有人说....");m_HasConnected=true;}//---------------------------------------------------------------------------void __fastcall TForm1::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket){AnsiString sInfo;AnsiString sType;AnsiString sChat;sInfo=Socket->ReceiveText() ;sType=sInfo.SubString(1,2);if(sInfo==AnsiString("CLEAR"))ListUser->Items->Clear();else{if(sType!=m_sIsChat){if(sInfo!=m_sName)LabelNotice->Caption="嗨!新朋友来了!";ListUser->Items->Add(sInfo);}else{sChat=sInfo.SubString(4,sInfo.Length()-3);MemoReceive->Lines->Add(sChat);}}}//---------------------------------------------------------------------------void __fastcall TForm1::ClientSocket1Error(TObject *Sender,TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode){ErrorCode=0;}//---------------------------------------------------------------------------void __fastcall TForm1::ListUserClick(TObject *Sender){if(m_HasConnected){AnsiString sTemp;if(m_sName==ListUser->Items->Strings[ListUser->ItemIndex]){LabelNotice->Caption="不是吧!要和自己说话?";}else{sTemp.sprintf("%s对%s说....",m_sName,ListUser->Items->Strings[ListUser->ItemIndex]);m_sSpeakTo=ListUser->Items->Strings[ListUser->ItemIndex];LabelNotice->Caption=sTemp;}}else{ShowMessage("对不起!请登录先!");}}//---------------------------------------------------------------------------void __fastcall TForm1::EdtSendKeyDown(TObject *Sender, WORD &Key,TShiftState Shift){if(Key==VK_RETURN){ if(EdtSend->Text==""){ShowMessage("对不起, 不能发空信息!");}else{AnsiString sTemp;sTemp=m_sIsChat+m_sSpeakTo+m_sPart+m_sName+AnsiString("说: ")+EdtSend->Text;//sTemp+=AnsiString("( ")+m_sName+AnsiString("说: )");ClientSocket1->Socket->SendText(sTemp);EdtSend->Clear();Key=0;}}}//---------------------------------------------------------------------------void __fastcall TForm1::BtnToAllClick(TObject *Sender){if(m_HasConnected){AnsiString sTemp;m_sSpeakTo="ALL";sTemp.sprintf("%s对%s说....",m_sName,"所有人");LabelNotice->Caption=sTemp;}else{ShowMessage("对不起!请登录先!");}}//---------------------------------------------------------------------------void __fastcall TForm1::ClientSocket1Disconnect(TObject *Sender,TCustomWinSocket *Socket){StatusBar1->Panels->Items[1]->Text="服务器已经断开了连接!";MenuConnect->Enabled=true;ListUser->Items->Clear();LabelNotice->Caption="被断开连接了!";m_HasConnected=false;MemoReceive->Clear();}//---------------------------------------------------------------------------void __fastcall TForm1::MenuDisonnectClick(TObject *Sender){if(ClientSocket1->Socket->Connected)ClientSocket1->Socket->Close();}//---------------------------------------------------------------------------void __fastcall TForm1::MenuSetClick(TObject *Sender){AnsiString sIp;InputQuery("输入服务器地址","输入服务器的IP",sIp);if(!sIp.IsEmpty()){m_sHostAddress=sIp;ClientSocket1->Address=m_sHostAddress;}}//---------------------------------------------------------------------------void __fastcall TForm1::btn_sendClick(TObject *Sender){if(EdtSend->Text==""){ShowMessage("对不起, 不能发空信息!");}else{AnsiString sTemp;sTemp=m_sIsChat+m_sSpeakTo+m_sPart+m_sName+AnsiString("说: ")+EdtSend->Text;//sTemp+=;ClientSocket1->Socket->SendText(sTemp);EdtSend->Clear();}}//---------------------------------------------------------------------------void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose){CanClose = (MessageBox(Handle, "确实要退出吗?", "系统提示",MB_OKCANCEL | MB_ICONQUESTION) == IDOK);}//---------------------------------------------------------------------------void __fastcall TForm1::N1Click(TObject *Sender){m_sName="";Boolean b=InputQuery("请输入您的用户名", "用户名:", m_sName);if(m_sName.IsEmpty()){if(b){ShowMessage("您以匿名用户登录");//m_sName="匿名用户";}}elseif(ClientSocket1->Active==false)ClientSocket1->Open();}//---------------------------------------------------------------------------void __fastcall TForm1::N2Click(TObject *Sender){ShowMessage("您以匿名用户登录");m_sName="匿名用户";if(ClientSocket1->Active==false)ClientSocket1->Open();}//---------------------------------------------------------------------------。
C++Builder+6的文件和文件夹操作
C Builder_6图形、图像及实例
ok.et内容提要:本文介绍了图形的绘制和图像处理,其中详细介绍了画布(Canvas)的属性与使用方法,利用它们,可以非常直观方便地绘制直线、曲线、矩形、椭圆等各种图形。
本文还介绍了图像处理的方法,其中包括 Image 组件、TBitmap 类和 TJPEGImage 类的使用,而要进行快速的图像处理,几乎都离不开 ScanLine 技术。
使用 ScanLine 技术,能够快速取得bitmap 的每行的颜色值,而无需使用 Canvas 的 Pixels 属性逐点获取像素点的颜色值。
关键字:C++Builder、图形、图像、画布引言:自 Windows 诞生以来,可以通过 GDI(Graphics Device Interface)来实现图形的绘制。
然而对于初学者来说,庞大复杂的 GDI 绘图系统是一个难以跨越的学习障碍。
所幸的是,在C++Builder 绘图系统中,提供了一个简易可行的画布( Canvas),可以用非常直观的方式来实现Windows 下的绘图功能。
C++Builder 提供了 Image 组件,可以很方便地装载图像,以及进行图像处理。
正文:1 在窗体上作图1.1 知识要点1. 画布( Canvas)在 C++Builder 中,几乎所有的可视化组件(包括:Form、Image、Bitmap、PaintBox)都包含Canvas 属性。
Canvas 包含了许多和绘图有关的性质,如 Pen、Brush、Pixels、Font 等,另外它还包含了各种绘图的函数,如 LineTo、Rectangle、MoveTo、Polygon 等。
(1)Canvas 类主要属性有:Font:画布绘制文本所用的字体。
Brush:用于填充背景的画笔刷。
Pen:用来画线和描述图形轮廓的画笔。
PenPos:当前绘图位置的坐标。
Pixels:画布像素数组。
(2)Canvas 类主要方法有:Arc:用当前画笔在画布上画圆弧。
C++_Builder6.0简易实例教程之欧阳理创编
Borland C++Builder 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)数据库引擎。
C++_Builder6.0简易实例教程之欧阳法创编
Borland C++Builder 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)数据库引擎。
C++builder课件 第一章 概述
(2) 点击控件面板上按钮图案选取按 钮控件,然后在应用程序窗体中选择适 当位置将按钮放到该空白窗体上,如图 1-2和图1-3所示。 (3) 在窗体内选中按钮,然后在对象 检阅器内编辑按钮Button1属性。如图14所示,我们把按钮的Caption属性改为 “Hello”。这使得窗体中按钮的标题也变 为“Hello”。
给出一个简单的“Hello,World!”程序。 该程序运行时显示一个窗口,窗口内有 一个命令按钮,当按钮被点击时,窗口 的标题显示为“Hello,World!”。 (1) 启动BCB,出现如图1-1所示的界 面。此时编程环境中已存在一个应用程 序的框架,显示在该图右下方的标题为 Form1的一个空白的窗口即是该应用程序 的窗口,习惯上我们称它为窗体。
在选定某个对象后按F1 在组件面板上右击鼠标,选择Help Internet
BCB应安装在32位的Windows上,它 们 包 括 Windows 95 、 Windows 98 、 Windows 2000 、 Windows NT 4.0 、 Windows Me以及Windows XP等。 执行光盘上的Setup程序进行安装, 主要步骤有: (1) 按提示输入软件的序列号和密码; (2) 选择安装方式,安装方式有Typical 、Compact和Custom,当硬盘空间充足时 可选Typical,否则选Compact,有经验的 用户也可选Custom;
这正是TForm1::Button1Click事件代码的框架。 在一对大括号内可以由用户输入C++的代码,这 些代码将在该按钮被单击(Click)时执行。在本例 中,我们输入: Form1->Caption="Hello, World!"; 即使得TForm1::Button1Click事件有如下代码: void__fastcall TForm1::Button1Click(TObject *Sender) { Form1->Caption="Hello,World!"; }
C++Builder6控件
屏幕组件(CoolBar)屏幕组件位于【Win32】组件页的页面上,是由Windows95引入的,用于在可移动并且可以改变大小的显示栏中显示一个系列的窗口组件。
最典型的例子就是Windows95以及其后续版本98,2000,xP的任务栏。
MaskEdit的EditMask使用方法(转)最近需要一个可控制输入输出格式的编辑框,不过Delphi中却没有满足要求的控件,想自己弄一个吧!结果没想到Delphi一如既往地连正则表达式都没有支持,不考虑自己编写正则表达式Parser的可行性,从头写个正则表达式编辑框时间上也不允许。
没办法,将就下用MaskEdit 吧!顺便也了解下EditMask具体用法下面的内容是网上找的掩码编辑框(MaskEdit)是一种特殊的编辑框。
使用它可以设计出许多复杂的输入格式。
在选用MaskEdit之后,需要为它设计一个输入格式。
方法如下:首先在窗体上将MaskEdit选中,在对象查看器(Object Inspector)中找到EditMask属性,双击它,弹出一个如下图所示的对话框。
对话框左上角的Input Mask编辑框用于输入掩码格式。
掩码格式可以分为三部分,每个部分之间用分号“;”分开,如“!90:90:90:;1;_”。
下面解释各输入格式符的意义:1.输入格式的第一部分是掩码本身,也就是数据输入格式。
在这一部分用一些特殊的格式符来表示应输入的字符类型及格式,如“!l0A9:C>ll<”这样一串输入格式掩码。
常用的MaskEdit 输入格式符有:格式符意义L和l L表示该位置只能填一个字母。
l和L一样,但允许不填。
A和a A表示该位置只能填一个字母或数字。
a和A一样,但允许不填。
C和c C表示该位置可以填任意字符。
c和C一样,但允许不填。
0和90表示该位置只能填一个数字。
9和0一样,但允许不填。
<和><格式符表示随后的字母均以小写的形式显示,直到遇到一个>格式字符或<>格式符。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机技术教研室
Microsoft Visual C++ 6.0、.NET
JBuilder、 MyEclipse
第1章 C++Builder6概述
1.1 面向对象编程的概念
对象:类的一个实例,包括数据和代码。 对象 对象的三要素 属性:描述对象的特性。 属性 方法:对象能够进行的动作或行为。 方法
第1章 C++Builder6概述
1.4 IDE应用环境进阶
应用程序的类型
计算机技术教研室
创建控制台应用程序(没有图形界面,在控制台
窗口中运行,类似TC)
在IDE中浏览和编辑代码(类似VC)
第1章 C++Builder6概述
1.5 使用联机帮助Help
计算机技术教研室
在帮助菜单中选择C++Builder Help
新建并保存工程 设计程序界面 设置组件属性 编写事件代码 运行调试 编译生成可执行程序
计算机技术教研室
程序的执行过 程是怎么样的
第1章 C++Builder6概述
1.3 C++Builder6快速入门
计算机技术教研室
完整的工程包括: 工程文件(.bpr):管理所有文件; 单元文件(.c、.cpp、.h、.hpp):源代码和 头文件; 窗体文件(.dfm):保存窗体中的组件及属性 设置; 资源文件(.res):资源编辑器编译后的二进 制文件。
标题栏、菜单栏、工具栏
组件面板
计算机技术教研室
对象查看器
窗体设计器 代码浏览器 代码编辑器
第1章 C++Builder6概述
1.3 C++Builder6快速入门
C++Builder6+Builder6概述
1.3 C++Builder6快速入门 开发过程:
计算机技术教研室
第1章
C++ Builder6概 述
主 要 内 容
1.1
计算机技术教研室
面向对象编程的概念 初识C++Builder6
1.2
1.3 1.4 1.5
C++Builder6快速入门 IDE应用环境进阶
使用联机帮助Help
第1章 C++Builder6概述
前 言
Turbo C->Turbo C++->Borland C++ Borland C++ Builder 6
计算机技术教研室
类:定义了对象特征以及对象外观和行为的模板。 类
事件:预先定义好的特定动作,由用户或系统激活。 事件 事件过程:编写程序代码段为对象规定在被某个事件 激活时应发生的各种动作以及所要进行的信息处理的具 体内容,这段代码即事件过程。
第1章 C++Builder6概述
1.2 初识C++Builder6
在索引选项卡中查找 在选定某个对象后按F1 在组件面板上右击鼠标,选择Help
第1章 C++Builder6概述
作业
上机实践1:
1-1
1-2
1-3
第1章 C++Builder6概述