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);
}