当前位置:文档之家› c++_builder编程指南

c++_builder编程指南

c++_builder编程指南
c++_builder编程指南

C++Builder 编程指南2

关键字:C++Builder,编程指南

作者:佚名更新:2002-11-01 浏览:5158

三、常用控件的使用与编程

静态文本是用户无法直接改变(不可编辑)的文本,程序可以在运行时刻来改变它,通常起标注和提示作用,它位于控件板的“Standard”页,其主要属性有:

Align:指该控件在窗口中的位置或对齐方式(AlBottom:位于底部;AlClient:充满客户区;AlLeft:位于左方;AlNone:用户自定义;AlRight:位于右方;AlTop:位于顶部)。

Alignment:显示文字在本控件中的位置(taCenter:居中;taLeftJustify:居左;taRightJustify:居右)。

AutoSize:是否自动缩放(当设为true时,则控件的尺寸随控件里面文字的大小而改变)。

Caption:控件中要显示的文字,即标题。

Color:控件的颜色。

Cursor:鼠标移入控件后的形状。

Enabled:设置该控件是否有效。

Font:设置该控件内文字的字体,单击该属性弹出字体设置对话框,可以设置字体风格、字体尺寸、字体颜色等。

Name:控件名称。

标准按钮主要用于响应用户鼠标或键盘按下的操作,它位于控件板

的Standard页,其主要属性有:

Cancel:当设为true时,此按钮相当于放弃按钮,即当用户按下Esc键时相当于用鼠标单击此按钮。

Default:设置该按钮是否为缺省按钮。

ModalResult:模式结果。(可选值有mrNone、mrOk、mrCancel、mrAbort、mrRetry、mrIgnore、mrYes、mrNo等)当设为非mrNone 时,主要用于按下该按钮时关闭该按钮所属模式窗口。

标准按钮控件可以响应的主要事件有:

OnClick:鼠标单击或按下热键时的响应事件。

OnEnter:当按钮获得输入焦点时的响应事件。

OnExit:当按钮失去输入焦点时的响应事件。

OnKeyDown:当键盘任意键按下时的响应事件。

OnKeyPress:当键盘上字符键按下时的响应事件。

OnKeyUp:放开键盘按键时的响应事件。

OnMouseDown:鼠标键按下时的响应事件。

OnMouseUp:鼠标键弹起时的响应事件。

OnMouseMove:鼠标移动时的响应事件。

单行编辑框控件用来接收来自用户的单行可编辑输入,它位于控件板的Standard页,其主要属性有:

AutoSelect:自动选择。用来设置当该控件获得输入焦点时编辑框里的文本内容是否被自动选择。若用户想要在每次选中该编辑框时就要替换掉原有的内容,不是在原有的内容后添加新的内容,可把该属

性设为true。

CharCase:控制编辑框内字符的大小写。(可选值有ecLowerCase:全为小写;ecNormal:正常方式,大小写均可;ecUpperCase:全为大写。)

MaxLength:设置输入文本的最大长度。当为0时表示不受限制。 ReadOnly:当该属性设为true时,用户不能改变编辑框里面的文本。 Text:当程序运行时显示在编辑框里面的文本内容。

状态条控件一般放在应用程序界面底部,用于快速提示当前状态或提供简单帮助等功能,它位于控件板的Win32页上,其主要属性有: Panel:面板属性,用来设置状态条的风格。用鼠标单击该属

所示(状态条被分成三个小面板)。利用该编辑器和对象观察器就可以把状态条编辑成合适的样子。

SimplePanel:简单面板。用来决定是显示一个简单面板还是多个面板,设为true时,只显示一个简单面板。

SimpleText:当SimplePanel设为true时,显示在简单面板里的文本。

下面以一实例介绍控件的用法。该程序可以实时地在状态条中显示当前鼠标位置,也可以在编辑框中直接输入鼠标的坐标值,用来改变鼠标在屏幕中的位置。

(1) 从控件板的“Standard”页拖动两个静态文本控件“Label1”和“Label2”、两个单行编辑框“Edit1”和“Edit2”、一个按钮控件“Button1”到窗体“Form1”上,设置“Label1”和“Label2”的“Caption”属性值分别为

“鼠标X坐标值:”和“鼠标Y坐标值:”;设置“Edit1”和“Edit2”的“Text”属性都为“0”;设置“Button1”的“Caption”属性为“退出”。根据自己的喜好安排好各控件在窗体中的布局。选择菜单“File|Save As”,另存程序文件“Unit1.cpp”为“xyp.cpp”;选择“File|Save Project As”,另存工程文件为“xy.bpr”。

(2) 从控件板的“Win32”页拖动一个状态条控件“StatusBar1”到窗体“Form1”的底部(自动),点击其“Panels”属性,所示的三个小面板,其中一个放提示信息,另外两个分别存放鼠标的X和Y坐标值。(3) 利用对象观察器设置“Form1”的“OnMouseMove”(鼠标在窗体上移动时触发该消息)消息响应函数为“MouseMove()”,单行编辑框“Edit1”和“Edit2”的“OnChange”消息响应函数同为“EditChange()”,标准按钮“Button1”的“OnClick”消息响应函数为“ExitButton()”。(4) 转入代码编辑器,在“xyp.cpp”中键入如下程序代码:

void __fastcall TForm1::MouseMove(TObject *Sender, TShiftState Shift,int X, int Y)

{

//该程序段用于在状态条中的第二个小面板(Item[1])中显示鼠标的X坐标值,第三个小

//面板(Item[2])中显示鼠标的Y坐标值。IntToStr()函数用于把整型坐标值转换为字符型。

StatusBar1->Panels->Items[1]->Text = IntToStr(X);

StatusBar1->Panels->Items[2]->Text = IntToStr(Y);

void __fastcall TForm1::ExitButton(TObject *Sender)

{Close();//关闭应用程序}

void __fastcall TForm1::EditChange(TObject *Sender)

{

//调用API函数SetCursorPos()(C++ Builder中可以直接调用)设置鼠标位置,ToInt()//用于把字符型的值转换为整型值。读者要留意这种C++ Builder中所特有的转换方法。

SetCursorPos(Edit1->Text.ToInt(),Edit2->Text.ToInt())

;

}

位图按钮控件位于Additional页,它提供了同标准按钮一样的功能,但它能在按钮上贴上一幅位图,其主要属性有:

Glyph:浮雕,单击该属性会弹出一个“Picture Editor”对图(510cb17.Jpg )

所示。

Hint:当鼠标停留在该控件上一段时间后所弹出的一小段提示信息。

Layout:用于决定位图贴在按钮的哪个位置。(blGlyphBottom:位于按钮标题的下方;blGlyphLeft:位于按钮标题的左方;blGlyphRight:位于按钮标题的右方;blGlyphTop:位于按钮标题的上方。)

快速按钮(SpeedButton)是一种新型的按钮控件,它具有一般按钮的属性和方法,另外除了可以在按钮上添加文字标题外,还可以在

按钮表面设定不同图像(这点有别于位图按钮,它只能设定一幅图像),用于代表不同的按钮状态(如选中、无效等)。一般把若干个快速按钮都集中在一个工具条(ToolBar)或面板(Panel)上,使用户可以快速地执行一些常用命令。其主要属性有:

AllowAllUp:全部弹起。当该属性设为true时,属于同一组(通过设置GroupIndex属性为相同值)的快捷按钮可以同时处于弹起状态,即所有按钮均未被选中。

Down:按钮是否处于按下状态。

Glyph:点击该属性弹出“Picture Editor”对话框,用于装入一幅位图,然后把该位图分成四幅小位图,每幅小位图代表不同的按钮状态。这就要求“Glyph”属性设定的位图必须包含四幅相同大小尺寸的小位图,并且这些小位图必须紧密相连且在同一水平线上。

NumGlyphs:设定每个按钮对应的小位图的个数。

Flat:设定快速按钮的平面效果。设定该属性为true,当鼠标不在按钮上时,该按钮呈现平面状态;当鼠标移到按钮之上时,按钮马上突了出来。当Flat为false时,则没有这种效果。

工具条按钮(ToolBar)(简称工具条)通常作为工具按钮(tool buttons)或其它按钮的一个容器,以便对其进行统一管理。一般情况下可以在工具条上产生工具按钮(在工具条控件上单击鼠标右键,选择弹出式菜单中的“New Button”或“New Separator”,则可以产生一系列的工具按钮或分割线)或放置快速按钮,以便对应用程序进行更加直接的控制(它一般是一些菜单的快捷方式),其主要属性有:

Flat:工具条上的工具按钮或其它控件是否具有平面特性。

Images:工具条上的工具按钮所对应的图像系列。它一般对应一个ImageList控件。 Wrapable:工具条上的按钮是否可以自动换行,产生一个对齐的新列。

为用工具条产生的一个应用程序界面,它共有四个工具按钮,对应一个“ImageList”控件。

// 本文转自C++Builder研究- https://www.doczj.com/doc/537830512.html,/article.asp?i=173&d=6e505n

C++ Builder3.0提供了一个Splitter控件来实现对用户窗口的分割,只需拖动该控件到窗体上,就可以实现窗口的任意分割。把面板控件(Panel)拖动到窗体上,设置其对齐方式,然后把Splitter控件拖动到面板控件的边缘,设置其对齐方式与面板控件的对的分割方式为例来介绍其具体操作过程:

(1) 放置一个面板“Panel1”到窗体“Form1”上,并设置其“Align”属性为“alLeft”,然后在“Panel1”的右边界处放置一个“Splitter”控件,其“Align”属性为“alLeft”。应当使“Splitter”控件的“Left”属性值大于或等于“Panel1”的“Left”值加上其“Width”的值。再设定“Splitter”控件的“Width”属性值为3。

(2)放置另外一个面板“Panel2”到窗体“Form1”上,并设置其“Align”属性为“alClient”。最后在各面板控件上放置其它所需控件,从而实现了窗口的分割。

图像控件“TImage”位于“Additional”页,主要用于在某一位置来显示

一幅图片。该控件的主要属性有:

Center:图片是否在控件的居中位置。

Picture:用于装入图片。

Stretch:用于图片是否自动伸缩到控件大小。

下面以实例介绍上述几个控件的用法。

假如设计一个图像放大、缩小的演示程序,可以选择任意一幅位图进行演示。

(1) 拖动一个面板(Panel)控件到窗体“Form1”上,设置其“Align”属性为“alTop”,让其充当工具条控件。然后拖动四个快速按钮控件到面板上,设置其“Caption”属性分别为“打开”、“放大”、“缩小”和“退出”,设置其“Flat”属性为“true”,“Layout”属性为“blGlyphBottom”。最后用“Glyph”属性为各个快速按钮设置图像。

(2) 然后拖动一个图像控件和一个“OpenDialog”(打开文件对话框)控件到窗体之上;设置“Form1”的“Caption”属性为。

(3) 另存程序文件“Unit1.cpp”为“imageio.cpp”,另存工程文件为“image.bpr”。转入代码编辑器,在程序“imageio.cpp”中键入如下代码: void __fastcall TForm1::SpeedExitClick(TObject *Sender)

{Close();//关闭应用程序}

void __fastcall TForm1::SpeedOpenClick(TObject *Sender)

{//利用打开文件对话框为图像控件装入位图。

Image1->Stretch = true;//图像大小随图像框的大小而改变

OpenDialog1->Fi lter = “Bmp files (*.bmp)|*.bmp”;//文件过滤器中只

装入位图文件

if(OpenDialog1->Execute())

Image1->Picture->LoadFromFile(OpenDialog1->FileName);

}

void __fastcall TForm1::SpeedInClick(TObject *Sender)

{//图像的长和宽分别增加10各象素

Image1->Height=Image1->Height+10;

Image1->Width=Image1->Width+10;

}

void __fastcall TForm1::SpeedOutClick(TObject *Sender)

{//图像的长和宽分别减少10各象素

Image1->Height=Image1->Height-10;

Image1->Width=Image1->Width-10;

}

用“打开”按钮选择一幅位图,用“放大”或“缩小”按钮对改位图进行任意大小的缩放操作。最后设计一个类似Win95“开始”菜单中的“运行”功能基本.

该应用程序是进程应用程序。进程是装入内存并准备执行的程序,它是资源分配的独立单位。进程有代码、数据,该进程中的线程可用的其他系统资源,如文件、管道和同步对象组成。通过为外部可执行程序创建进程,从而可以在自己的应用程序中调用外部可执行程序。创建进程应使用Windows的API函数“CreateProcess()”,其具体用

法和内部所涉及到的数据结构,读者可以参考其他书籍。

在“Open”标签所对应的编辑框内输入可执行文件的名称(包括路径),单击“Run”按钮,就可运行该外部可执行文件。也可以单击“Browse”按钮,利用打开文件对话框选择外部可执行文件并运行它。拖动如下所示的控件到窗体上,并设置其属性:

控件名称属性设定值

From1(窗体)Caption Process Programming Demo

Label1 (标签) Caption Open:

Edit1(编辑框) Text

OpenDialog1(打开文件对话框)

Button1(按钮) Caption Run

Button2(按钮) Caption Exit

Button3(按钮) Caption Browse

然后在程序中键入代码。

在事件Button1Click中添加如下代码(按“Run”按钮时的响应函数):

void __fastcall TForm1::Button1Click(TObject *Sender)

{

STARTUPINFO StartInfo;

PROCESS_INFORMATION ProcessInformation;

StartInfo.cb=sizeof(STARTUPINFO);

StartInfo.lpDesktop=NULL;

StartInfo.lpReserved=NULL;

StartInfo.lpTitle=NULL;

StartInfo.dwFlags=STARTF_USESHOWWINDOW;

StartInfo.cbReserved2=0;

StartInfo.lpReserved2=NULL;

StartInfo.wShowWindow=SW_SHOWNORMAL;

//为外部可执行程序创建进程,其中的可执行文件名由Edit1编辑框提供。

BOOL

bReturn=CreateProcess(NULL,Edit1->Text.c_str(),NULL,NULL,

FALSE,NULL,NULL,NULL,&StartInfo,

&ProcessInformation);

if(!bReturn)

{

//当输入可执行文件名无效时,弹出信息框,然后控制焦点停留在编辑框上。

Application->Mess ageBox(“你没有指定可执行文件”,“C++ Builder MessageBox”,

MB_OKCANCEL +MB_DEFBUTTON1);

Edit1->SetFocus();

}

}

在事件Button2Click中添加如下代码:

void __fastcall TForm1::Button2Click(TObject *Sender)

{Close();}//按“Exit”按钮时,程序退出。

在事件Button3Click中添加如下代码:

void __fastcall TForm1::Button3Click(TObject *Sender)

{

OpenDialog1->Execute();//执行打开文件对话框

Edit1->Text=OpenDialog1->FileName;//把选中的可执行文件名返回给编辑框。

}

运行该程序,然后利用该程序调用Windows的计算器外部程序

高质量C++/C编程指南(第3章命名规则)

关键字:匈牙利法,共性规则

作者:林锐更新:2002-08-07 浏览:4255

第3章命名规则

比较著名的命名规则当推Microsoft公司的“匈牙利”法,该命名规则的主要思想是“在变量和函数名中加入前缀以增进人们对程序的理解”。例如所有的字符变量均以ch为前缀,若是指针变量则追加前缀p。如果一个变量由ppch开头,则表明它是指向字符指针的指针。“匈牙利”法最大的缺点是烦琐,例如

int i, j, k;

float x, y, z;

倘若采用“匈牙利”命名规则,则应当写成

int iI, iJ, ik; // 前缀i表示int类型

float fX, fY, fZ; // 前缀f表示float类型

如此烦琐的程序会让绝大多数程序员无法忍受。

据考察,没有一种命名规则可以让所有的程序员赞同,程序设计教科书一般都不指定命名规则。命名规则对软件产品而言并不是“成败悠关”的事,我们不要化太多精力试图发明世界上最好的命名规则,而应当制定一种令大多数项目成员满意的命名规则,并在项目中贯彻实施。

3.1 共性规则

本节论述的共性规则是被大多数程序员采纳的,我们应当在遵循这些共性规则的前提下,再扩充特定的规则,如3.2节。

【规则3-1-1】标识符应当直观且可以拼读,可望文知意,不必进行“解码”。

标识符最好采用英文单词或其组合,便于记忆和阅读。切忌使用汉语拼音来命名。程序中的英文单词一般不会太复杂,用词应当准确。例如不要把CurrentValue写成NowValue。

【规则3-1-2】标识符的长度应当符合“min-length && max-information”原则。

几十年前老ANSI C规定名字不准超过6个字符,现今的C++/C不再有此限制。一般来说,长名字能更好地表达含义,所以函数名、变量

名、类名长达十几个字符不足为怪。那么名字是否越长约好?不见得! 例如变量名maxval就比maxValueUntilOverflow好用。单字符的名字也是有用的,常见的如i,j,k,m,n,x,y,z等,它们通常可用作函数内的局部变量。

【规则3-1-3】命名规则尽量与所采用的操作系统或开发工具的风格保持一致。

例如Windows应用程序的标识符通常采用“大小写”混排的方式,如AddChild。而Unix应用程序的标识符通常采用“小写加下划线”的方式,如add_child。别把这两类风格混在一起用。

【规则3-1-4】程序中不要出现仅靠大小写区分的相似的标识符。

例如:

int x, X; // 变量x 与X 容易混淆

void foo(int x); // 函数foo 与FOO容易混淆

void FOO(float x);

【规则3-1-5】程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但会使人误解。【规则3-1-6】变量的名字应当使用“名词”或者“形容词+名词”。

例如:

float value;

float oldValue;

float newValue;

【规则3-1-7】全局函数的名字应当使用“动词”或者“动词+名词”(动

宾词组)。类的成员函数应当只使用“动词”,被省略掉的名词就是对象本身。

例如:

DrawBox(); // 全局函数

box->Draw(); // 类的成员函数

【规则3-1-8】用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。

// 本文转自C++Builder研究- https://www.doczj.com/doc/537830512.html,/article.asp?i=8&d=ct6jpn

例如:

int minValue;

int maxValue;

int SetValue(…);

int GetValue(…);

【建议3-1-1】尽量避免名字中出现数字编号,如Value1,Value2等,除非逻辑上的确需要编号。这是为了防止程序员偷懒,不肯为命名动脑筋而导致产生无意义的名字(因为用数字编号最省事)。

3.2 简单的Windows应用程序命名规则

作者对“匈牙利”命名规则做了合理的简化,下述的命名规则简单易用,比较适合于Windows应用软件的开发。

【规则3-2-1】类名和函数名用大写字母开头的单词组合而成。

例如:

class Node; // 类名

class LeafNode; // 类名

void Draw(void); // 函数名

void SetValue(int value); // 函数名

【规则3-2-2】变量和参数用小写字母开头的单词组合而成。

例如:

BOOflag;

int drawMode;

【规则3-2-3】常量全用大写的字母,用下划线分割单词。

例如:

const int MAX = 100;

const int MAX_LENGTH = 100;

【规则3-2-4】静态变量加前缀s_(表示static)。

例如:

void Init(…)

{

static int s_initValue; // 静态变量

}

【规则3-2-5】如果不得已需要全局变量,则使全局变量加前缀g_(表示global)。

例如:

int g_howManyPeople; // 全局变量

int g_howMuchMoney; // 全局变量

【规则3-2-6】类的数据成员加前缀m_(表示member),这样可以避免数据成员与成员函数的参数同名。

例如:

void Object::SetValue(int width, int height)

{

m_width = width;

m_height = height;

}

【规则3-2-7】为了防止某一软件库中的一些标识符和其它软件库中的冲突,可以为各种标识符加上能反映软件性质的前缀。例如三维图形标准OpenGL的所有库函数均以gl开头,所有常量(或宏定义)均以GL开头。

3.3 简单的Unix应用程序命名规则

高质量C++/C编程指南(第4章表达式和基本语句)

关键字:运算符的优先级,复合表达式,if,for,switch,goto

作者:林锐更新:2002-08-07 浏览:4100

第4章表达式和基本语句

读者可能怀疑:连if、for、while、goto、switch这样简单的东西也要探讨编程风格,是不是小题大做?我真的发觉很多程序员用隐含错误的方式写表达式和基本语句,我自己也犯过类似的错误。表达式和语

句都属于C++/C的短语结构语法。它们看似简单,但使用时隐患比较多。本章归纳了正确使用表达式和语句的一些规则与建议。

4.1 运算符的优先级

C++/C语言的运算符有数十个,运算符的优先级与结合律如表4-1所示。注意一元运算符+ - * 的优先级高于对应的二元运算符。

表4-1 运算符的优先级与结合律

【规则4-1-1】如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用默认的优先级。

由于将表4-1熟记是比较困难的,为了防止产生歧义并提高可读性,应当用括号确定表达式的操作顺序。例如:

word = (high << 8) | low

if ((a | b) && (a & c))

4.2 复合表达式

如a = b = c = 0这样的表达式称为复合表达式。允许复合表达式存在

的理由是:(1)书写简洁;(2)可以提高编译效率。但要防止滥用复合表达式。

【规则4-2-1】不要编写太复杂的复合表达式。

例如:

i = a >= b && c < d && c + f <= g + h ; // 复合表达式过于复杂

【规则4-2-2】不要有多用途的复合表达式。

例如:

d = (a = b + c) + r ;

该表达式既求a值又求d值。应该拆分为两个独立的语句:

a =

b + c;

d = a + r;

【规则4-2-3】不要把程序中的复合表达式与“真正的数学表达式”混淆。

例如:

if (a < b < c) // a < b < c是数学表达式而不是程序表达式

并不表示if ((a

而是成了令人费解的if ( (a

4.3 if 语句

if语句是C++/C语言中最简单、最常用的语句,然而很多程序员用隐含错误的方式写if语句。本节以“与零值比较”为例,展开讨论。4.3.1 布尔变量与零值比较

【规则4-3-1】不可将布尔变量直接与TRUE、FALSE或者1、0进行

相关主题
文本预览
相关文档 最新文档