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

posted @ 2012-05-23 22:10  Phyking  阅读(1607)  评论(0编辑  收藏  举报