C++Builder使用经验谈,上

原文地址:http://c.chinaitlab.com/ccjq/874278_4.html

C++Builder3.0的问世,对广大爱好C语言的用户来说不啻是个福音。因为以往在Windows下,没有一种真正基于C语言的可视化编程语言。你如果想用VB或Delphi这一类可视化编程语言去编程,你就不得不去重温一遍Basic或Pascal语言,没有了像C语言一样可以灵活应用的指针,没有了"++"、"――"这样一类可爱的运算,总之一切使用起来都不如C语言一样得心应手。现在这一切烦恼都不复存在了。C++Builder3.0不仅支持传统的C语言,也支持Borland的OWL和Microsoft的MFC.可以这样说,C++Builder3.0是目前Windows下功能最为强大的C语言编译器。下面结合笔者的使用情况,谈谈几点经验、体会。

一、动态调用窗体Form

在缺省情况下,由File/NewForm生成添加入项目文件中的窗体都具有"AutoCreate"(自动创建)的特性。即只要程序运行,该窗体就存在于内存中了,不管当前它是否被调用。具有这种特性的窗体一般适用于窗体属性比较固定、经常被调用的情况。其优点是速度快,缺点是占用内存。

在实际程序设计中,会遇见大量类似对话框功能的窗体,它们用于显示状态或输入信息,仅须在程序中调用一下,完成其功能就行了,无需常驻内存。这时可以通过选择Project/Options/Forms,将"Auto--Createforms"栏中相应的窗体,如Form1,用">"键移动到"Availableforms"栏中,并在程序需调用该窗体处,加入下列语句:

TForm1*myform=newTForm1(this);

myform->ShowModal();

deletemyform;

窗体Form1仅是在需要调用时才调入内存,调用完成后,即用delete清除出内存。这样可减少程序对内存资源的占用。

二、遍历窗体控件的方法

要访问或修改窗体上的控件,方法很简单,以TEdit为例子:

Edit1->Text="";

Edit2->Text="";

但如果窗体上有十来个像Edit1这样的控件,需要进行相同的初始化,用上面的方法一个一个地进行,岂不麻烦!所以有必要掌握遍历窗体控件的方法。在介绍该方法之前,让我们先了解一下窗体Form的Components和Controls属性。参见表一。

表一

属性 类型 说明

ComponentCount Int 目前Form上各类控件的总数

ComponentsTCompont * 目前Form上指向所有控件的数组

ControlCount Int 目前Form上某一子区域上各类控件的总数

ControlsTControl * 目前Form上指向某一子区域上所有控件的数组

其中:数组对象

Components[0]Panel1

Components[1]Label1

Components[2]Edit1

Components[3]Label2

Components[4]Edit2

Components[5]Button1

数组对象

Controls[0]Label1

Controls[1]Edit1

Controls[2]Label2

Controls[3]Edit2

下面这段代码完成了对Panel1上所有TEdit控件的遍历初始化。读者稍加修改,即可对其它控件进行遍历。这里有一个小技巧,我们把需要进行初始化的控件放置在了Panel1上,与不需要初始化的控件区分开来,这样便于编程。

AnsiStringnamestring="TEdit";

for(inti=1;iControlCount;i++)

{

if(Panel1->Controls[i]->

ClassNameIs(namestring))

{

TEdit*p=dynamic_cast

(Panel1->Controls[i]);

P->Text="";

}

}

三、用Enter键控制焦点切换的方法

在Windows环境下,要使一个控件取得焦点,可在该控件上用鼠标单击一下,或按Tab键将焦点移至该控件上。这种控制焦点切换的方法有时不符合用户的习惯。就图一而言,用户就希望用Enter键,控制焦点由Edit1切换到Edit2.要实现这样的功能需借助WinAPI函数SendMessage来完成。方法是:先设Form1的KeyPreview属性为true,然后在Form1的OnKeyPress事件中加入如下的代码。这样,用户就可以通过按Enter键控制焦点按定义好的Taborder顺序来移动了!

void__fastcallTForm1::

FormKeyPress(TObject*Sender,char&Key)

{

if(Key==VK_RETURN)

{

SendMessage(this->Handle,WM_NEXTDLGCTL,0,0);

Key=0;

}

}

四、为TStringGrid的文字加上颜色

TStringGrid是C++Builder提供给用户的一种字符网格控件。美中不足的是,它没有提供分别修改各单元字体颜色、大小的方法。其实要为TStringGrid实现这样功能,只需在程序中稍加处理就行了。方法是自定义一个二维数组cellbuf,它的下标与网格单元列行一一对应,用于存放各网格单元的颜色、文字等信息。

structCellStru

{

AnsiStringmsg;//文字信息

TColorcolor;//文字颜色

};

CellStrucellbuf[MAXCOL][MAXROW];

初始化cellbuf后,再在字符网格控件StringGrid1的OnDrawCell响应事件中,加入如下的代码即可。

void__fastcallTForm1::StringGrid1DrawCell

(TObject*Sender,intCol,

intRow,TRect&Rect,TGridDrawStateState)

{

StringGrid1->Canvas->Font->

Color=cellbuf[Col][Row].color;

StringGrid1->Canvas->TextOut(Rect.Left+3,

Rect.Top+3,cellbuf[Col][Row].msg);

}