11.工具条组件87)问:工具条是Windows编程经常要用的,C++Builder能不能实现这个功能呢?
答:当然可以,工具条是由许多具有图形的按钮组成的,这些按钮被分隔符分隔成许多组,每个组都能够完成特定的工作。工具条上的按钮具有与位图按钮相似的特性——可以拥有多个位图,当按钮处于不同状态时,例如按下、失效等,将显示不同的位图。以前C++Builder制作工具条的方法是通过把加速按钮放在面板组件Panel上实现的。现在,我们不必使用这两种组件的组合,只要使用ToolBar就可以创建工具条了。工具条是比较难掌握的,它之所以不容易掌握是因为它包含的TToolButton组件有三个属性:Grouped,AllowAllUp和Down,它们的组合可以产生各种不同效果的按钮组。这三个属性我们一定要好好理解。
88)问:那请给我介绍一下Toolbar这个组件的使用方法好吗?
答:好的,我们先从ToolBar的属性入手,通过对一些重要属性的分析来了解它。ToolBar包含一些前面没有见过的属性:
ButtonHeight属性指出了工具条中按钮的高度。
ButtonWidth属性用来设定工具条中按钮的宽度。
Flat属性为true时,使工具条透明,同时使工具条上按钮之间的边界消失。俗称平面工具条,它的缺省值为False。
Indent用来在工具条的左边创建一个边沿区。
ShowCaptins确定是否允许在工具条的按钮上显示标题。缺省值为False。
Wrapable设定是否允许工具条上的按钮换行。缺省值为True。
List属性,当这个属性为True时,工具条上按钮的图标在左,标题在右。为False时,按钮的图标在上,标题在下。缺省值为False。
Images用来设定正常情况下,按钮上显示的图标列表。
HotImages用来设定当鼠标移动到按钮上显示的图标列表。
DisabledImages用来设定按钮失效时显示的图标列表。
工具条上所有按钮显示的图标就包含在这三个图标列表中。
在前面介绍的ListView组件中,属性LargeImages和SmallImages分别表示在两种不同的状态下显示的图标列表。ToolBar的这三种属性也有类似的特点,它们分别表示在正常状态、鼠标指向工具条以及按钮失效时显示的图标列表。
此外,还有几个运行时态属性:
ButtonCount属性,指出了工具条中按钮的个数。
Buttons存放着工具条中按钮的列表。
RowCount指示着工具条的行数。
89)问:C++Builder为什么要采用图标列表的方式来管理工具条上的图标呢?
答:因为这样可以集中统一地管理大量的图标,从而大大地减轻了程序员的负担。
答:要为应用程序建立工具条,可以按照下面的步骤:
(1)从选项卡Win32中选择工具条组件,放置在窗体上。
注意,刚放置在窗体上的工具条组件一定是在窗体的顶部,因为这时工具条的Align属性被设置为alTop。
(2)在窗体上增加两个ImageList组件,并为这些组件引入图标。
(3)将一个ImageList组件赋予工具条的属性Images,另一个赋予工具条的属性DisabledImages。
(4)用鼠标右键单击工具条,在弹出菜单中选择NewButton。
这时将在工具条上出现一个按钮,这个按钮无标题。这是因为工具条的ShowCaption属性被设置成了False。实际上这个按钮有一个缺省的标题ToolButton1。
这个新创建的按钮与我们前面介绍的按钮都不一样,它是一个TTtoolButton组件。
(5)选中工具条上的按钮,把按钮的ImageIndex属性改为所需要图标的索引号。这个图标实际上是存放在ImageList组件中的。
(6)重复第四步和第五步,在工具条上创建更多的按钮。这样一个工具条就建立了。
90)问:工具条上的按钮好像与普通按钮不一样,请问它有些什么特点呢?
答:工具条上的按钮是一个TToolButton组件。它包括一些与工具条有关的特性,可以简化工具条上按钮的配置,并增加一些显示特性。TToolButton有这样一些重要属性。
AllowAllUp属性允许一个组中的按钮同时全部处于未选中状态。缺省值是False。
Down属性指定按钮是否被选中。在设计期间把该属性设置为True,可以使按钮初始化为选中状态,缺省值为False。
DropDownMenu属性把一个弹出菜单与按钮相连。
ImageIndex属性指定出现在按钮上的图标的索引号。
Indeterminate属性确定按钮是否处于一种既不是选中也不是未选中的中间状态。缺省值为False。
Wrap属性强迫这个按钮是这一行的最后一个按钮,下一个按钮从下一行开始。缺省值为False。
Style属性用来确定按钮的样式,它可以有五种不同的取值,这五种取值分别表示五种不同样式的按钮。
tbsButton表示按钮正常显示与一般的加速按钮一样。
tbsCheck表示单击这种类型的按钮时可以切换Down属性。一旦你选中了该按钮,那么按钮将保持选中状态直到再次单击。
tbsDropDown表示按钮显示成一个向下的箭头。
tbsSeparator表示按钮显示成工具条上的一个空格。
tbsDivider表示按钮显示成工具条上的一个垂直线段。
Grouped属性确定是否允许连续的多个tbsCheck类型的按钮组成一组。缺省值是False。如果连续的多个按钮,每个按钮的Grouped属性都设置为True,同时Style属性都设置为tbsCheck,那么这些组件一次只能选取一个。选中其中一个按钮将使其他按钮变成未选中状态。
91)问:如何用加速按钮创建工具条?
答:工具条的另一种创建方法是使用面板组件+加速按钮SpeedButton的方法。加速按钮在前面曾经提到过,它与位图按钮很相似,也使用属性Caption和Glyph放置文本和图标,不过加速按钮还有一些属性是比较特殊的。
下面我们先介绍加速按钮的属性:
GroupIndex:通过GroupIndex属性可以使加速按钮像单选按钮那样使用。也就是说,把多个单选按钮的GroupIndex属性赋予相同的值以便组成一组,这样这个组中的按钮一次只能有一个按钮可以被按下,当你按下一个按钮时,其他按钮就会弹起。需要注意的是GroupIndex必须大于0。如果GroupIndex属性等于0,那么表示该按钮是一个普通的加速按钮。
Down:属性值可以控制按钮是否处于按下状态,当该属性值为True时,按钮处于按下状态。你可以在设计时把属性Down设置为True,这样当程序运行时,按钮一开始就处于按下状态。
AllowAllUp:这个属性用来指定一个组中的所有加速按钮是否可以同时处于未被按下的状态。当该属性为True时,单击该组中被按下的按钮,这个按钮会弹起。当该属性为False时,单击该组中被按下的按钮,这个按钮不会弹起。
如果你比较一下加速按钮和TToolButton组件就会发现,它们都有上面介绍的这三种属性,只不过TToolButton组件中使用属性Grouped来完成类似于GroupIndex的功能。
92)问:用加速按钮设计工具条与用Toolbar组件相比有什么不同?
答:用加速按钮设计工具条时必须首先在窗体上放置面板组件,而且应该把它的Align属性设置为alTop(因为工具条一般都放在窗口的顶部)。然后在面板组件上放置加速按钮。
一般要利用按钮的Caption和Glyph属性为加速按钮设置文本和图标。如果这些按钮只是像普通按钮那样操作的话,那么这样设置就可以了。但是如果这些按钮要像单选按钮那样使用,那么还必须对GroupIndex属性进行设置。
93)问:那如何用加速按钮来设计工具条呢?
答:我们要用到Additional页的可控组件ControlBar、Speedbutton与Win32页面中的ToolBar。下面来看一下他的实现:
①双击ControlBar,把她放到窗体中;
②双击ToolBar,并将其放到ControlBar上;
③在ToolBar上添加SpeedButton;
④选中一个SpeedButton,在ObjectInspector中找到Glyph属性,来选择图片。
*SpeedButton的Flat属性改为true,则按钮为透明的
*AutoSize改为true,则容器大小随容件变化
12.状态条组件94)问:在Windows编程中,状态条可以显示程序当前的一些状态信息,是一个很有用的部件,它也被广泛应用在许多程序中,请问,C++Builder是怎样编写状态条的?
答:状态条StatusBar实际上是由一组状态面板组成的,通常显示在应用程序窗口的底部,它的功能主要是显示一些提示信息和状态信息。例如,C++Builder的代码编辑器底部就显示了一个状态条,而且显示了多个状态面板。
状态条可以只显示一个状态面板,也可以显示多个状态面板。当显示多个状态面板时,状态条被分割为几个部分,每个部分都有自己的Text属性,通过这个属性就可以在状态条显示信息了。
如果要在状态条上显示多个状态面板,就需要把状态条的SimplePanel属性设置为False,否则只能显示一个状态面板。
如果状态条只需要显示一个状态面板,那么只要简单地在窗体上放置状态条就可以了。这时窗体上的文本保存在属性SimpleText中。如果要显示多个状态面板,那么就需要使用面板编辑器创建多个状态面板。单击属性Panels的Value列中的省略号按钮(或者双击菜单条),就可以打开状态面板编辑器。
单击编辑器上的按钮Add可以增加状态条上的状态面板。单击面板编辑器中新创建的状态面板,在对象编辑器中就会列出该状态面板的属性。
95)问:可以看出状态条上的状态面板有五个属性,他们分别有什么作用呢?
答:Alignment属性用来确定面板中所显示文本的对齐方式。它的可能值为:taLeftJustify表示左对齐、taRightJustify表示右对齐和taCenter表示居中对齐。缺省值为taLeftJustify。
Bevel用来确定面板的样式。共有三种方式,None表示面板处于平整的状态;Lowered表示面板下沉;Raised表示突起。
Style属性用来确定在面板中显示的内容是Text文本还是OwnerDraw自绘制图形方式。如果要在面板中作图,那么就需要编写OnDrawPanel事件处理过程。
Text属性用来保存面板中显示的字符串。
Width用来设定面板的长宽。
13.对话框组件
96)问:怎样编写文件打开、保存等对话框?
答:C++Builder为我们提供了许多常用的对话框组件,这些对话框组件都放在组件模板的Dialogs选项卡中,例如Font,Color,Open和Print对话框。其中OpenDialog对话框组件最具有代表性,只要掌握了它的用法,那么你也就会使用其他的对话框组件了。
97)问:对话框组件的特性有哪些特性呢?
答:对话框组件是一种不可见组件。当你把它放在窗体上时,它是一个大小不变的图形按钮,当程序运行时,对话框组件不会立刻显示,而必须使用每个对话框都有的Execute方法,使对话框显示出来。
C++Builder提供的对话框大多数是有模式对话框。这种对话框要求首先必须响应该对话框,然后才能继续进行工作。所谓响应对话框就是你必须单击OK或者Cancel按钮,使对话框返回一个值。当用户单击对话框上的按钮OK时,返回True,单击Cancel按钮返回False。用户可以根据返回值的不同进行不同的处理。
非模式的对话框使你在响应对话框之前可以完成其他的工作,不必非要首先响应对话框。这类对话框有:FindDialog,ReplaceDialog等。
98)问:能更细点的说明对话框组件的用法吗?
答:我们就编制一个文本阅读器来说明如何使用文件打开对话框。
打开一个新的窗体,我们放上一个按钮组件和一个Memo组件,将Memo的ScrollBars属性设置为ssBoth,使得Memo能够显示垂直和水平的滚动条。
选中Lines属性,删除里面的文本。
在窗体上放置OpenDialog组件。
选中OpenDialog组件,可以看出,OpenDialog有这样一些主要的特性
FilrerIndex属性用来指定每次打开对话框所用的缺省过滤器。
DefaultExt属性是一个扩展名,当用户在文件编辑框中输入的文件名没有带扩展名时,对话框会用它作为文件缺省的扩展名。
InitialDir属性用来设置对话框打开时显示的目录。
FileName属性用来返回最近一次选中的文件的完整路径名。
Filter属性,这个属性用来设计在对话框的文件列表中将列出哪些类型的文件。
OpenDialog对话框提供了一个专门的编辑器来编辑属性filter,单击属性Filter的value列中的省略好按钮就可以打开这个编辑器。
左边用来输入过滤器的名称,右边用来输入文件扩展名。
现在,我们输入文本文件和C++文件的过滤器。这样,在每次打开对话框时候,在文件类型下拉列表中将显示过滤器的名称。
双击文打开按钮,输入这样一段代码:
//------------------------------------------
#include
#pragmahdrstop
#include"Unit1.h"
#pragmapackage(smart_init)
#pragmaresource"*.dfm"
TForm1*Form1;
//-----------------------------------------
__fastcallTForm1::TForm1(TComponent*Owner)
:TForm(Owner)
{
}
//-------------------------------------------------
void__fastcallTForm1::Button1Click(TObject*Sender)
if(OpenDialog1->Execute())//首先执行打开文件对话框函数,这时,打开文件对话框才显示出来。如果执行成功,这个函数返回true,否则返回false
Memo1->Lines->Clear();//把Memo中的内容清掉Caption=OpenDialog1->FileName;//获得用户选择的文件的路径名,并将它设置成窗体的标题。注意,因为是在Form1窗口(容器)中进行的操作,所以Caption前省了Form1,当然你可以加上Memo1->Lines->LoadFromFile(OpenDialog1->FileName);//调用文本装入函数从文件中装入文本,并显示在编辑框中。
//--------------------------------------------------
99)问:其它对话框的各有什么重要属性?
答:保存对话框SaveDialog与打开对话框非常相似,至于OpenPictureDialog、SavePictureDialog就不用多说了。其它象字体对话框FontDialog的Font属性;颜色对话框ColorDialog的Color属性;查找对话框FindDialog的FindText。这里就不用多说了,看一下就明白了。
100)问:对话框组难道就只能用上面说的那些组件吗?要是有,能介绍一下吗?
答:在C++Builder集成开发环境的可视化组件中库中,给应用程序开发员提供了一系列的标准的对话框函数。我们可以直接调用这些函数来显示一些标准的对话框。
这类函数还真不少,但我们只要掌握以下五个就足够了J
externPACKAGEint_fastcallMessageDlg(constAnsiStringMsg,TmsgDlgTypeDlgType,TmsgDlgButtonsButtons,intHelpCtx):用来在计算机屏幕中央显示对话框。
其中,参数Msg是指定要对话框中显示的字符串。
参数DlgType是TMsgDlgType类的变量,它用来指定对话框的显示特征。TmsgDlgType是一个集合,它可以取以下的值:
mtWarning:对话框中包含黄色的惊叹符号;
mtError:对话框中包含红色的惊叹符号;
mtConfirmation:对话框中包含绿色的问号;
mtCustom:对话框中不包含位图符号,标题名称为应用程序名称。
参数Buttons是用来指定对话框中包含的按钮的类型,它是一个集合,可以是以下若干个元素的组合:
C++Builder还专门定义了三个常用的按钮组合:
mbYesNoCancel:包含了mbYes、mbNo和mbCancel元素;
mbOKCancel:包含了mbOK和mbCancel元素;
mbAbortRetryIgnore:包含了mbAbort、mbRetry和mbIgnore元素。
参数HelpCtx用来指定当用户选择帮助时,帮助系统中的上下文编号。这个函数根据用户选择的按钮,将返回相应的值,它有以下返回值:mrNone、mrAbort、mrOK、mrRetry、mrNo、mrCancel、mrIgnore、mrAll。
externPACKAGEAnsiString_fastcallInputBox(constAnsiStringAcaption,constAnsiStringAprompt,constAnsiStringAdefault):这个函数用来在计算机屏幕上显示一个对话框,这个对话框有一个文本编辑框,可以用来接收用户输入的字符串信息。
Acaption:用来指定对话框的标题;
Aprompt:用来指定对话框中显示的内容;
Adefault:用来指定对话框打开时在编辑框中显示的内容。
externPACKAGEbool_fastcallSelectDirectory(constAnsiStringCaption,constWideStringRoot,AnsiString&Directory)或externPACKAGEbool_fastcallSelectDirectory(AnsiString&Directory,TselectDirOptsOptions,intHelpCtx):这个函数用来显示一个让用户输入目录名称的对话框。其中:
第一种语法的参数Caption用来指定对话框的标题;Root用来指定从哪个根目录开始浏览;参数Dircetory用来确定用户选择的目录。这个语法不能改变当前的目录。
第二种语法的参数Options是一个集合,它可以由以下几个元素组合而成:
sdAllowCreate:允许用户输入一个不存在的目录名字,但并不创建这个新目录;
sdPerformCreate:它必须和sdAllowCreate配合使用,当用户输入一个不存在的目录名时,对话框将创建这个目录;
sdPrompt:它必须和sdAllowCreate配合使用,当用户输入一个不存在的目录名时,将出现消息对话框,询问用户是否创建这个新目录。若用户选择是,在包含sdPerformCreate元素时将创建这个新目录,若没有包含sdPerformCreate元素,将不创建目录。
《基础入门》100问与答到这就结束了,本文所有例程均在XP系统、BCB6下编译通过。
不在多说了,让我开始新的篇章吧,在这里你将进一步了解CB的特色,更希望我们CB的阵营越来越强大,更希望我们都成为真正意义上的好朋友,互勉互进J
15.菜单
1)问:C++Builder的菜单项有很多,它们各有什么作用呢?
答:好吧,让我们在新的篇章中首先来了解这方面的知识。下图就是C++Builder集成开发环境中的菜单项名称。
(1)首先是File菜单。通过File菜单,我们可以打开、保存、关闭以及打印新的或已经存在的工程和文件。在这个菜单中,包含了这样一些菜单项:
(2)Edit菜单用于管理设计时的文本和组件。
(3)Search菜单命令用于定位文本、错误、单元、变量以及代码编辑器中的符号等。
(5)在C++Builder集成开发环境中,利用工程(Project)菜单可以编译、建立应用程序,当然,这些工作的进行必须首先要打开一个工程文件。
(6)C++Builder集成开发环境中的Run菜单包含了C++Builder集成调试的一些菜单命令。这些菜单命令形成了集成调试器的核心功能。
(7)在C++Builder集成开发环境中,还有Component菜单。在组件菜单下的菜单命令是有关建立、安装、重建组件的菜单项。其中:
(8)在开发数据库方面的应用程序的时候,C++Builder集成开发环境中的Database菜单就会发挥作用,在数据库菜单下包含的菜单项允许程序人员创建、修改、跟踪、查看数据库。
(9)工具(Tools)菜单在C++Builder集成开发环境中也占据着重要的地位。通过工具菜单,我们可以查看、修改集成环境的设置,可以修改工具菜单中的程序列表,也可以创建、编辑映像。
(10)Window菜单项是C++Builder6新提供的一个菜单单元。
(11)在C++Builder集成开发环境中,最后一个菜单为Help。利用这个帮助菜单,我们可以获得在线帮助。
16.C/C++语言在CB中的一些特定用法
2)AnsiString是从Delphi中引进来的吗?
答:CB的核心组件VCL是用ObjectPascal语言写出的,所以CB的VCL组件的属性有很多都是使用longstring,例如:Text、Name、Caption等属性都是使用ObjectPascal的longstring。基于此关系,CB只好建立了和ObjectPascal的longstring相应的类别,我们将它称为AnsiString。
3)AnsiString与String有什么区别?
答:C++Builder在Sysdefs.h头文件中有这样的定义:
typedefAnsiStringString;
从这一点在看他二者是完全一样的,只是书写起来后者更方便一些,前者是意图更明了一些。
4)能介绍一下AnsiString类的一些常见函数及其用法吗?
答:当然可以了,下面就常见函数做一下简单介绍:
成员函数
语法
功能
c_str
char*_fastcallc_str()const
返回字符串数据的指针
Delete
void_fastcallDelete(intindex,intcount)
由index处开始删除count个字符
Insert
void_fastcallInsert(constAnsiString&str,intindex)
由index处开始插入字符str到原字符串中
IsEmpty
bool_fastcallIsEmpty()const
返回字符串是否为空,true表示空字符串
Length
int_fastcallLength()const
返回字符串长度
LowerCase
AnsiString_fastcallLowerCase()const
将字符串中的大写字母改写成小写
UpperCase
AnsiString_fastcallUpperCase()const
将字符串中的小写字母改写成大写
Pos
int_fastcallPos(contAnsiString&substr)const;
找出子字符串在原字符串中由第几个位置开始
SubString
AnsiString_fastcallSubString(intindex,intcount)const
返回由index处向后取count个字符
ToDouble
double_fastcallToDouble()const
将字符转成双精度数值
ToInt
int_fastcallToInt()const
将字符转成整形
IntToStr
AnsiString_fastcallIntToStr(intValue)
将整形转成字符串
Trim
AnstString_fastcallTrim()const
返回一个新的字符串,它会将原字符串前后空白或控制字符清除后再返回
WideChar
wchar_tfastcallWideChar(wchart*dest,intdestsize)const
转换AnsiString到一个宽字符数组(COM中常用)
5)AnstString成员函数与传统字符串函数有何不同之处?
答:我们可以通过二者的一个对照表来查看他们的之间的不同之处:AnsiString成员函数
传统字符串函数
=
字符串拷贝
strcpy
+=
字符串合并
strcat
+
字符串连接
无
==,!+=,<,<=,>,>=
字符串比较
strcmp
c_str()
相互转换
无,但可以利用指针实现
删除子字符串
插入子字符串
求字符串长度
strlen
字母转成小写
strlwr
找出子字符串
strstr
SetLength
设置字符串长度
转成整形
转成双精度
sprintf
字母转成大写
strupr
方法1:AnsiString字符串转换成字符串数组:
先利用AnsiString类别中的c_str()方法转换成传统字符串数组,再用strcpy拷贝,将它拷贝到字符数组中去:
chars1[20];
strcpy(s1,Edit1->Text.c_str());
方法2:AnsiString转换成传统字符串可以利用字符指针来实现:
可以通过字符指针来实现:
char*s;
s=Edit->Text.c_str();
方法3:利用字符指针实现传统字符串转换成AnsiString:
Edit->Text=s;
typedefSet
其中type用来指定集合元素的类型;minval指定集合元素的最小值;maxval指定集合元素的最大值。举个例子来说,若是我们定义一个以TupperSet为名的集合类,这个集合类的可能元素为26个大写字母,我们可以这样定义:
TupperSetUpperSet;
bool_fastcallContains(constTel)const;operator-:两个集合进行求差运算,结果集合包含两个集合中不相同的元素;operator*:求两个集合的交集;operator+:求两个集合的并集;operator<<:添加一个元素到指定集合;operator>>:从集合中删除一个指定元素。其实Set类的应该比较广泛,比如判断我们是否按下鼠标左键,可以用如下的语句:if(Shift.Contains(ssLeft))。
void__fastcallTForm1::Timer1Timer(TObject*Sender){Strings1="春辉(CH)软件作者:董维春王岩CH工作室";if(i<=54){Label1->Caption=s1.SubString(i,18);i+=2;}else{i=1;}}(未完待续)