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)用鼠标右键单击工具条,在弹出菜单中选择New Button。
这时将在工具条上出现一个按钮,这个按钮无标题。这是因为工具条的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,在Object Inspector中找到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 <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//-----------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//-------------------------------------------------
void __fastcall TForm1::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
extern PACKAGE int _fastcall MessageDlg(const AnsiString Msg,TmsgDlgType DlgType,TmsgDlgButtons Buttons,int HelpCtx):用来在计算机屏幕中央显示对话框。
其中,参数Msg是指定要对话框中显示的字符串。
参数DlgType是TMsgDlgType类的变量,它用来指定对话框的显示特征。TmsgDlgType是一个集合,它可以取以下的值:
mtWarning:对话框中包含黄色的惊叹符号;
mtError:对话框中包含红色的惊叹符号;
mtInformation:对话框中包含蓝色的“I”符号;
mtConfirmation:对话框中包含绿色的问号;
mtCustom:对话框中不包含位图符号,标题名称为应用程序名称。
参数Buttons是用来指定对话框中包含的按钮的类型,它是一个集合,可以是以下若干个元素的组合:
mbYes:对话框含有“Yes”按钮;
mbNo :对话框含有“No”按钮;
mbOK:对话框含有“OK”按钮;
mbCancel :对话框含有“Cancel”按钮;
mbAbort :对话框含有“Abort”按钮;
mbRetry :对话框含有“Retry”按钮;
mbIgnore :对话框含有“Ignore”按钮;
mbAll :对话框含有“All”按钮;
mbNoToAll :对话框含有“NoToAll”按钮;
mbYesToAll :对话框含有“YesToAll”按钮;
mbHelp :对话框含有“Help”按钮.
C++ Builder还专门定义了三个常用的按钮组合:
mbYesNoCancel:包含了mbYes、mbNo和mbCancel元素;
mbOKCancel:包含了mbOK和mbCancel元素;
mbAbortRetryIgnore:包含了mbAbort、mbRetry和mbIgnore元素。
参数HelpCtx用来指定当用户选择帮助时,帮助系统中的上下文编号。这个函数根据用户选择的按钮,将返回相应的值,它有以下返回值:mrNone、mrAbort、mrOK、mrRetry、mrNo、mrCancel、mrIgnore、mrAll。
extern PACKAGE void _fastcall ShowMessage(const AnsiString Msg):这个函数用来显示一个对话框,这个对话框中包含一个“OK”按钮。其中对话框中显示的内容由参数Msg来确定。
extern PACKAGE AnsiString _fastcall InputBox(const AnsiString Acaption, const AnsiString Aprompt, const AnsiString Adefault):这个函数用来在计算机屏幕上显示一个对话框,这个对话框有一个文本编辑框,可以用来接收用户输入的字符串信息。
Acaption:用来指定对话框的标题;
Aprompt:用来指定对话框中显示的内容;
Adefault:用来指定对话框打开时在编辑框中显示的内容。
extern PACKAGE bool _fastcall LoginDialog(const AnsiString Acaption, AnsiString &AuserName, AnsiString &AuserName):这个函数用来显示一个标准的登录对话框,用来连接一个数据库服务器,其参数分别为对话框中数据库的名字、用户输入的用户名和密码
extern PACKAGE bool _fastcall SelectDirectory(const AnsiString Caption,const WideString Root,AnsiString &Directory)或extern PACKAGE bool _fastcall SelectDirectory(AnsiString &Directory,TselectDirOpts Options,int HelpCtx):这个函数用来显示一个让用户输入目录名称的对话框。其中:
第一种语法的参数Caption用来指定对话框的标题;Root用来指定从哪个根目录开始浏览;参数Dircetory用来确定用户选择的目录。这个语法不能改变当前的目录。
第二种语法的参数Options是一个集合,它可以由以下几个元素组合而成:
sdAllowCreate:允许用户输入一个不存在的目录名字,但并不创建这个新目录;
sdPerformCreate:它必须和sdAllowCreate配合使用,当用户输入一个不存在的目录名时,对话框将创建这个目录;
sdPrompt:它必须和sdAllowCreate配合使用,当用户输入一个不存在的目录名时,将出现消息对话框,询问用户是否创建这个新目录。若用户选择是,在包含sdPerformCreate元素时将创建这个新目录,若没有包含sdPerformCreate元素,将不创建目录。
《基础入门》100问与答到这就结束了,本文所有例程均在XP系统、BCB6下编译通过。
第二部分:快速提高
好久以来有不少朋友问我,《C++ Builder问与答》为什么不继续写了?我也一直在思考还应该写下去不?CBX的推出,加之宝兰宣布不在出新的CB版本,让我们这些一直喜爱CB的人不清楚下一个方向到底在何处?当然真的希望CB会继续,而不要倒下,但对于我们来说这只能是一种期盼L
CB的优点我不想多说了,否则就不会有这么多的喜欢者,而一些入门的朋友还是选择CB做为进入C/C++的工具,这使我觉得这篇文章还是值得写下去的,因为还是有那么的朋友在期待着的她的下一篇。这里对这些朋友表示感谢!
不在多说了,让我开始新的篇章吧,在这里你将进一步了解CB的特色,更希望我们CB的阵营越来越强大,更希望我们都成为真正意义上的好朋友,互勉互进J
由于时间有限,加之作者水平有限,文中难免有些错误,还及时请指出J这里先表示感谢!
15.菜单
1)问:C++Builder的菜单项有很多,它们各有什么作用呢?
答:好吧,让我们在新的篇章中首先来了解这方面的知识。下图就是C++Builder集成开发环境中的菜单项名称。
(1)首先是File菜单。通过File菜单,我们可以打开、保存、关闭以及打印新的或已经存在的工程和文件。在这个菜单中,包含了这样一些菜单项:
“New”菜单项打开一个新的项目对话框,这个对话框包含了储藏在对象储藏里的模板。在此我们可以复制模板对象、从模板继承得到一个新的对象,或者是修改模板对象。
“New Application”菜单项将根据对象储藏里设定的缺省工程模板生成一个新的工程,缺省情况下为包含有一个空窗体的新工程。
“New Form”菜单项创建并加入一个新的窗体到工程中,这个窗体根据对象储藏里的缺省Form模板建立。
“Open”用来载入一个已经存在的工程、窗体、单元或者是文本文件到代码编辑器。
“Open Project”菜单项用来载入一个已经存在的工程。
“Reopen”菜单项用于列出最近关闭的工程和模块,供用户选择、打开。
“Save”菜单项用于使用当前的文件名保存当前的文件。
“Save As”菜单项用于当前文件的换名保存。
“Save Project As”菜单项用于将当前工程文件换名保存。
“Save All”菜单项用于保存所有打开的文件,这些文件包括工程文件和模块文件等。
“Close”菜单项用于关闭工程里的窗口、单元或关闭当前工程等。
“Close All”菜单项用于关闭所有打开的文件。
“Include Unit Hdr”菜单项将一个选定的包含文件用#include语句加入到活动的模块中。从而建立模块间的程序联系。这一项还是很有用处的。
“Print”菜单项用于将当前活动的文件送到打印机。
“Exit”菜单项用于关闭打开的工程,并退出C++Builder集成开发环境。
(2)Edit菜单用于管理设计时的文本和组件。
其中菜单项“Undo/Undelete”用于撤消最后一个动作。
“Redo”用于恢复被Undo撤消的动作。
“Cut”用于将选定的项目删除,并且将这个项目放到剪切板上。
“Copy” 用于将选定项目的拷贝到剪切板上。
“Paste”用于将剪切板上的内容插入到代码编辑器窗口或者窗口里。
“Delete”用于将选定的内容删除。
“Select All”菜单项用于选定窗口中所有的组件。
“Align to Grid”菜单项将选定的组件按最*近网格点对齐的原则进行排列。
“Bring to Front”菜单项用于移动选定的组件到最前面层,这样,当他和其他组件重叠时,就不可能被其他组件挡住。
“Send to Back”菜单项用于移动选定的组件到最后面一层。
“Align”用于排列组件。
“Size”菜单项用于设置组件的大小。
“Scale”菜单项用于按比例缩放窗体上组件的大小。
“Tab Order”菜单项用于修改当前活动窗口在运行时,按Tab键后,焦点在所有组件中切换的顺序。
“Creation Order”菜单项用于修改窗口中不可视组件用Tab键切换焦点的顺序。
“Lock Controls”菜单项用于将窗口中所有的组件固定在当前的位置。这可以防止你误修改。
(3)Search菜单命令用于定位文本、错误、单元、变量以及代码编辑器中的符号等。
“Find”菜单项用于在当前文件中查找指定的文本。
“Find In Files”菜单项用于在多个文件中查找指定的文本,并将文本找到的信息显示在代码编辑器底部的信息窗口。
“Replace”菜单项用于查找指定的文本,并将这个指定的文本用指定的新的文本来代替。
“Search Again”菜单项用于重复查找。
“Incremental Search”菜单项用于按照我们键入过程中输入的不完整的字符串查找。这样,不需输入全部文本就可以找到需要的文本。
“Go to Line Number”菜单项用于将光标移动到指定的行。
“Go to Address”菜单项用于跳到指定的地址。
4)利用C++Builder集成开发环境中的视图“View”菜单,可以显示或隐藏C++Builder集成开发环境中的不同的部分,也可以用于打开属于集成调试器的窗口。
“Project Manager”菜单项用于显示工程管理器。
“Object Inspector”菜单项用于显示对象监视器窗口。
“Alignment Palette”菜单项用于显示排版窗口。
“Component List”菜单可以弹出一个包含所有组件列表的窗口,在这个窗口中可以很方便的根据组件名字找到组件,并放置到窗体上。
“Window List”菜单弹出一个包含所有打开窗口的对话框,从这个对话框可以方便的激活任意C++Builder的窗口。
“Debug Windows”菜单包含一些有关调试的子菜单。他有以下几个子菜单项:
①“Breakpoints”菜单项用于列表显示断点对话框。
②“Call Stack”菜单项用于显示调用堆栈对话框。
③“Watches”菜单项用于显示观察列表对话框。
④“Local Variables”菜单项用来监视局部变量。
⑤“Threads”菜单项用于显示线程状态框。
⑥“Modules”菜单项用于显示模块窗口。
⑦“Event log”用于显示事件的记录。
⑧“CPU”用于显示CPU窗口。
“Toggle Form/Unit”菜单项用于在窗体和单元之间来回切换活动状态。
“Units”菜单项用于显示查看单元对话框。
“Forms”菜单项用于显示查看窗体对话框。
“Type Library”菜单项用于显示类型库编辑器窗口。
“New Edit Window”菜单项用于在代码编辑器中打开一个新的页。
“Toolbar”菜单项用于显示/隐藏工具栏。
(5)在C++Builder集成开发环境中,利用工程(Project)菜单可以编译、建立应用程序,当然,这些工作的进行必须首先要打开一个工程文件。
“Add to Project”菜单项用于向工程文件中加入一个文件。
“Remove from Project”菜单项用于从工程文件中删除一个文件。
“Import Type Library”菜单项用于向工程中引入一个类型库。
“Add To Repository”菜单项用于将一个工程加入到对象储藏中。
“View Source”菜单项用于在代码编辑器中打开工程源文件。
“View Makefile”菜单项用于在代码编辑器中打开扩展名为.BPR的工程Make文件。
“Add New Project”菜单项用于打开新项目(New Items)对话框,这个对话框中包含有新对象和储藏在对象储藏中的对象。
“Add Existing Project”菜单项用于添加一个已经存在的工程。
“Compile Unit”菜单项用于编译上次编译后任何经过修改了的源代码程序。
“Make project”菜单项对当前工程中从上一次编译后又已经修改的文件进行编译,并生成最终的应用程序。
“Build project”菜单项重新编译工程中所有的文件,而不管文件是否修改。
“Information for project”菜单项显示工程所有有关构造工程的信息和状态。
“Make All Projects”菜单项构造工程组中所有已经改变的工程。
“Build All Projects”菜单项重新创建工程组中所有的工程,而不管工程是否改变。
“Web Deployment Options”菜单项对完成配置的ActiveX控制或活动窗体到网络服务器进行设置。
“Web Deploy”菜单项用于在设置了网络配置选项,并编译了工程以后,配置最终的ActiveX控制或活动窗体。
“Options”菜单项用于修改工程的连接、编译版本等配置。
(6)C++Builder集成开发环境中的Run菜单包含了C++Builder集成调试的一些菜单命令。这些菜单命令形成了集成调试器的核心功能。
“Run”菜单项用于编译并运行应用程序。
Attatch to Process”菜单项用来调试一个当前正在运行的进程。
“Parameters”菜单项用于指定应用程序运行时的初始参数。
“Register ActiveX Server”菜单项用于将ActiveX控制加入到窗口登记表中。
“Unregister ActiveX Server”菜单项用于将ActiveX控制从窗口登记表中删除。
“Install COM+ Objects”菜单项用来安装微软的COM+对象。
“Step Over”菜单项用于一次执行应用程序中的一行,而忽略程序行中的函数调用等。
“Trace Into”菜单项用于一次执行应用程序中的一行,但是,遇到程序行中的函数调用时,程序的运行则转移到函数的内部运行,这样,便于程序调试人员跟踪程序的运行。
“Trace To Next Source Line”菜单项执行应用程序,在下一个可执行的程序代码中停止运行。
“Run To Cursor”菜单项运行载入的程序,在程序运行到代码编辑器窗口中的光标所在位置时停下来。
“Show Execution Point”菜单项将光标放在一个编辑窗口的可执行点上。
“Program Pause”菜单项用于暂时停止一个正在运行的应用程序。
“Program Reset”菜单项用于结束当前运行的程序,并将应用程序从内存中释放,重新载入这个应用程序,然后将光标放在程序运行的起始点上。
“Inspect”菜单项打开监视对话框,在这个监视对话框中,调试人员可以监视、检查、核对变量和表达式的值。
“Evaluate/Modify”菜单项打开评估/修改(Evaluate/Modify)对话框,在这个对话框中,可以评估,也可以修改表达式的值。
“Add Watch”菜单项用于打开观察属性对话框,在这个观察对话框中,调试人员可以加入、删除观察项。
“Add Breakpoint”菜单项用于设置断点,通过它下面的菜单项,我们可以用很多种方式设置断点。
(7)在C++Builder集成开发环境中,还有Component菜单。在组件菜单下的菜单命令是有关建立、安装、重建组件的菜单项。其中:
New Component”菜单项打开组件向导建立新组件。
“Install Component”菜单项安装新的组件。
“Import ActiveX Control”菜单项将ActiveX控制的类型库加入到C++Builder的工程中。
“Create Component Template”菜单项定制一个组件,并用新的名字、组件板页和图标保存这个组件作为组件模板。
“Install Packages”菜单项指定工程所需要的程序包。
“Configure Palette”菜单项用于打开组件板对话框。
(8)在开发数据库方面的应用程序的时候,C++Builder集成开发环境中的Database菜单就会发挥作用,在数据库菜单下包含的菜单项允许程序人员创建、修改、跟踪、查看数据库。
“Explore”菜单项打开结构查询语言/数据库浏览器,打开的浏览器保持着应用程序与远程数据库服务之间的连接,同时,也允许程序人员创建、编辑BDE别名和元数据对象。
“SQL Monitor”菜单项打开SQL监视器,在这个监视器中,我们可以看到实际的、通过SQL连接到远程数据服务器或者是通过ODBC连接到ODBC数据源的调用语句。
“Form Wizard”菜单项使用数据库窗体向导创建一个包含有显示从一个局部或者远程数据库获取数据的窗体。
(9)工具(Tools)菜单在C++ Builder集成开发环境中也占据着重要的地位。通过工具菜单,我们可以查看、修改集成环境的设置,可以修改工具菜单中的程序列表,也可以创建、编辑映像。
“Environment Options”菜单项用于定制编辑器、浏览器,配置环境的优先性,以及定制组件板的外形等。
“Debugger Options”菜单项用来对调试环境进行设置。
“Repository”菜单项用于维护对象储藏对话框。
“Import RC Scripts”菜单项将资源文件转换成C++ Builder的形式,并将转化后的资源加入到C++ Builder当前工程中。
“Configure Tools”菜单项显示工具选项对话框,通过这个对话框,我们可以加入、删除、编辑工具菜单,从而将常用工具集成到这个菜单中。
“DataBase Desktop”菜单项显示数据库平台(database desktop),在数据库平台上,可以创建和重构数据库表,或者浏览、编辑表中的数据等等。
“Visual C++ Project Conversition Utility”菜单项用来将Visual C++的工程转换成C++Builder的工程文件。
“Image Editor”菜单项启动映像编辑器(Image editor),在这个映像编辑器中,我们可以创建、编辑资源文件、图标、位图以及光标文件。
(10)Window菜单项是C++ Builder6新提供的一个菜单单元。
“Form1”在多窗口时切换到第一个窗口。
“Object Inspector”切换到对象检查器,方便查看与何改属性及事件。
“Object TreeView”使当前的对象树状窗口成为焦点。
“Unit1.cpp,Editor”切换到代码编辑器中,进行代码查看与修改。
“Next Window”多窗口时显示下一个窗口。窗口通常按创建顺序。
(11)在C++Builder集成开发环境中,最后一个菜单为Help。利用这个帮助菜单,我们可以获得在线帮助。
“Contents”菜单项显示所有C++Builder帮助文件总内容的列表。
“Index”菜单项显示使用帮助索引。
“Inprise Home Page”菜单项用于跳转到Inprise公司的主页。
“C++Builder Home Page”菜单项用于跳转到Inprise公司的C++Builder主页。
“Inprise Programs and Services”菜单项用于跳转到Inprise公司的产品和服务主页中。
“C++Builder Direct”用于通过浏览器引导用户访问C++Builder相关网站。
“customize”菜单项用于自定义包含在主帮助内容和索引中的帮助文件。
“About”菜单项用于显示C++Builder的版权和版本号。
16.C/C++语言在CB中的一些特定用法
2)AnsiString是从Delphi中引进来的吗?
答:CB的核心组件VCL是用Object Pascal语言写出的,所以CB的VCL组件的属性有很多都是使用long string,例如:Text、 Name、Caption等属性都是使用Object Pascal的long string。基于此关系,CB只好建立了和Object Pascal的long string相应的类别,我们将它称为AnsiString。
3)AnsiString与String有什么区别?
答: C++ Builder在Sysdefs.h头文件中有这样的定义:
typedef AnsiString String;
从这一点在看他二者是完全一样的,只是书写起来后者更方便一些,前者是意图更明了一些。
4)能介绍一下AnsiString类的一些常见函数及其用法吗?
答:当然可以了,下面就常见函数做一下简单介绍:
成员函数
|
语法
|
功能
|
c_str
|
char *_fastcall c_str() const
|
返回字符串数据的指针
|
Delete
|
void _fastcall Delete(int index,int count)
|
由index处开始删除count个字符
|
Insert
|
void _fastcall Insert(const AnsiString& str,int index)
|
由index处开始插入字符str到原字符串中
|
IsEmpty
|
bool _fastcall IsEmpty() const
|
返回字符串是否为空,true表示空字符串
|
Length
|
int _fastcall Length() const
|
返回字符串长度
|
LowerCase
|
AnsiString _fastcall LowerCase() const
|
将字符串中的大写字母改写成小写
|
UpperCase
|
AnsiString _fastcall UpperCase() const
|
将字符串中的小写字母改写成大写
|
Pos
|
int _fastcall Pos(cont AnsiString& substr)const;
|
找出子字符串在原字符串中由第几个位置开始
|
SubString
|
AnsiString _fastcall SubString(int index,int count)const
|
返回由index处向后取count个字符
|
ToDouble
|
double _fastcall ToDouble() const
|
将字符转成双精度数值
|
ToInt
|
int _fastcall ToInt() const
|
将字符转成整形
|
IntToStr
|
AnsiString _fastcall IntToStr(int Value)
|
将整形转成字符串
|
Trim
|
AnstString _fastcall Trim() const
|
返回一个新的字符串,它会将原字符串前后空白或控制字符清除后再返回
|
WideChar
|
wchar_t fastcall WideChar(wchart* dest,int destsize)const
|
转换AnsiString到一个宽字符数组(COM中常用)
|
5)AnstString成员函数与传统字符串函数有何不同之处?
答:我们可以通过二者的一个对照表来查看他们的之间的不同之处:
AnsiString成员函数
|
功能
|
传统字符串函数
|
=
|
字符串拷贝
|
strcpy
|
+=
|
字符串合并
|
strcat
|
+
|
字符串连接
|
无
|
==,!+=,<,<=,>,>=
|
字符串比较
|
strcmp
|
c_str()
|
相互转换
|
无,但可以利用指针实现
|
Delete
|
删除子字符串
|
无
|
Insert
|
插入子字符串
|
无
|
Length
|
求字符串长度
|
strlen
|
LowerCase
|
字母转成小写
|
strlwr
|
Pos
|
找出子字符串
|
strstr
|
SetLength
|
设置字符串长度
|
无
|
ToInt
|
转成整形
|
无
|
ToDouble
|
转成双精度
|
sprintf
|
UpperCase
|
字母转成大写
|
strupr
|
6)如何实现传统字符串与AnsiString字符串的相互转换?
答:传统的C语言是使用字符来组成字符串的(字符串末尾必须有’\0’做为结束标志),其格式和AnsiString并不相同。由于在CB中我大量使用AnsiString格式,所以有时也难免要进行一些转换,我们可以通过下列三种方法来实现:
方法1:AnsiString字符串转换成字符串数组:
先利用AnsiString类别中的c_str()方法转换成传统字符串数组,再用strcpy拷贝,将它拷贝到字符数组中去:
char s1[20];
strcpy(s1,Edit1->Text.c_str());
方法2:AnsiString转换成传统字符串可以利用字符指针来实现:
可以通过字符指针来实现:
char *s;
s=Edit->Text.c_str();
方法3:利用字符指针实现传统字符串转换成AnsiString:
char *s=”试一试,看看能不能成功!”;
Edit->Text=s;
7)Set类如何用?
答:严格来说,CB的集合(Set)并不是一个类,而是一个类模板(Class Template)。它用来实现集合这个抽象数据类型。
使用它可以定义一个实际的集合类型,它的一般声明模式是这样的:
|
typedef Set<type,minval,maxval>ClassName;
|
其中type用来指定集合元素的类型;minval指定集合元素的最小值;maxval指定集合元素的最大值。
举个例子来说,若是我们定义一个以TupperSet为名的集合类,这个集合类的可能元素为26个大写字母,我们可以这样定义:
|
typedef Set<char,’A’,’Z’>TupperSet;
|
应用时我们可以使用这个集合类声明一个具体的集合对象,如:
8)能不能告诉我一下Set类有哪些常见的使用方法或操作符?
答:当然可以了,以下是它的一些常见操作符和方法:
Clear方法:清除集合对象内的所有元素,使集合成为空集;
Contains方法:查询集合中是否包含指定的元素,其声明为:
|
bool _fastcall Contains(const T el)const; operator-:两个集合进行求差运算,结果集合包含两个集合中不相同的元素; operator*:求两个集合的交集; operator+:求两个集合的并集; operator<<:添加一个元素到指定集合; operator>>:从集合中删除一个指定元素。 其实Set类的应该比较广泛,比如判断我们是否按下鼠标左键,可以用如下的语句: if(Shift.Contains(ssLeft))。
|
9)听说在CB中有一个可以定时触发的组件,能否介绍一下它的属性和事件吗?
答:你说的是Timer组件,它位于组件栏的System组件页中。使用它并不难,因为他的属性、事件特别少:
Enabled属性:布尔类型。缺省时为true,这时定时器将经过一段时间就触发OnTimer事件。在这个属性从false变为true时,时钟将重新开始计时。
Interval属性:这个属性用来设置每隔多长时间就触发一次OnTimer事件,以毫秒为单位。缺省为1000毫秒。
OnTimer事件:这个事件在Enabled属性设置为true时,每隔Interval属性指定的时间触发一次。 10)原来Timer组件如此简单,但我还有些不懂为什么说它是一个可找替循环语句,能否举一个例子说明下OnTimer事件?
答:它不能取替循环语句的,当然在特定条件下,他比循环语句更有效,尤其是在涉及到按时循环时。在我编写的春辉网络电视里有一段OnTimer事件代码,可供大家参考:
|
void __fastcall TForm1::Timer1Timer(TObject *Sender) { String s1="春辉(CH)软件 作者:董维春 王岩 CH工作室"; if(i<=54) { Label1->Caption=s1.SubString(i,18); i+=2; } else { i=1; } } (未完待续)
|
|