在BCB中使用VCL控件数组1

2016-02-19 16:34 30 1 收藏

下面图老师小编要向大家介绍下在BCB中使用VCL控件数组1,看起来复杂实则是简单的,掌握好技巧就OK,喜欢就赶紧收藏起来吧!

【 tulaoshi.com - 编程语言 】

  昨晚和网友邬彦华在OICQ上闲聊,他言及正在为朋友编一个游戏菜单,其中动态创建了一组按纽,最后却无法释放。他的实现方法如下:

  

for (int i=1;i=ButtonCount;i++)
{
TSpeedButton *spdBtn=new TSpeedButton(this);
spdBtn-Parent=ScrollBox;//指定父控件
spdBtn-Caption=IntToStr(i);
spdBtn-Width=80;
spdBtn-Height=80;
spdBtn-OnClick=ButtonClick;
spdBtn-Left=intLeft;
spdBtn-Top=intTop;
spdBtn-GroupIndex=1;
spdBtn-Flat=true;
intLeft=intLeft+80+intSpace;
if (i%LineCount==0)
{
intTop=intTop+80+intSpace;
intLeft=intSpace;
}
buttons-Add(spdBtn);//buttons是一个TList的指针
}

  最后用TList的Clear()方法无法释放内存,

  其实Clear()方法只是把List清空,要删除还是得用delete,但是delete运算符必须要有删除的指针,可这种实现方法无法得到指针!所以我就放弃了这种思路,忽然,电光一闪(不是要打雷了,而是我想出办法来了),能不能用数组呢?说干就干!数组的分配?我想想,对!

  TSpeedButton *Buttons[]=new TSpeedButton[4](this);

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  可是编译器告诉我:ERROR!

  TSpeedButton *Buttons[]=new TSpeedButton(this)[4]

  还是错!最后我利令智昏,把JAVA的分配方式都拿出来了:

  TSpeedButton []*Buttons=new TSpeedButton[](this)

  结果么?不用说也知道!难道没办法了吗?我想起了简单类型的指针数组int x[]={1,2,3};于是就试

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  TSpeedButton *Buttons[]={new TSpeedButton(this),new TSpeedButton(this),new TSpeedButton(this)};

  居然可以了!我正想得意的笑,忽然发现:如果要定义100个按钮怎么办打那么一串重复的字谁受得了?就算是用COPY/PARST也难免要数错,毕竟100次啊。难道就没法子了?经过苦思冥想,又想起了一个办法,一步一步的来怎么样?

  TSpeedButton **button=new TButton*[100];

  for(int i=0;i100;i++)button[i]=new TSpeedButton(this);

  哈哈!居然OK!再试试释放:

  for(int i=0;i4;i++)delete x[i];

  delete[]x;

  哈哈!居然还是OK!于是我就写了一例子:在一个窗口上放两按纽,单击可以显示或关闭动态生成的按钮。

  首先声明一个全局变量TButton **x;

  然后在Button1的onClick中加入生成代码:

  

x=new TButton*[4];
for(int i=0;i4;i++)
{
x[i]=new TButton(this);
x[i]-Left=100;
x[i]-Top=10+i*30;
x[i]-Width=90;
x[i]-Height=25;
x[i]-Parent=this;
x[i]-Caption="按纽"+AnsiString(i);
}

  单击它就可以生成并显示4个按钮,然后在Button2加入释放代码:

  for(int i=0;i4;i++)delete x[i];

  delete[]x;

  运行一试,OK!大功告成!

  所以,使用VCL数组的过程是:首先声明一个二重指针,然后分配所要VCL组件的个数,最后再对每个VCL元件进行分配;在释放的时侯,要释放每个VCL元件的资源,最后才回收VCL数组的资源。

来源:http://www.tulaoshi.com/n/20160219/1612444.html

延伸阅读
一、 为什么写这篇东西 自己在使用 BCB5 写一些程序时需要检查很多东西,例如内存泄漏、资源是否有释放等等,在使用了很多工具后,发觉 BCB5 本身自带的工具—— CodeGuard ,非常不错,使用也挺方便的,但是摸索了很久(以及翻查了一些资料,包括 HELP )才算是会用了。写这篇文章的目的希望有这方面的问题的朋友可以借鉴一下,大家互相学习,...
重载TControl的WndProc方法 还是先谈谈VCL的继承策略。VCL中的继承链的顶部是TObject基类。一切的VCL组件和对象都继承自TObject。 打开BCB帮助查看TControl的继承关系: TObject-TPersistent-TComponent-TControl 呵呵,原来TControl是从TPersistent类的子类TComponent类继承而来的。TPersistent抽象基类具有使用流str...
方法3 来自TApplication的方法 不用我多废话,大家都知道TApplication在BCB中的重要性。在BCB的帮助中指出:TApplication、TScreen和TForm构成了所有BCB风格的Win32 GUI程序的脊梁,他们控制着您程序的行为。TApplication类提供的属性和方法封装了标准Windows程序的行为。TApplication表现了在Windows操作系统中创建、运行、支持和销...
通过限制焦点验证控件数据 Validate事件和CausesValidation属性是在允许用户将焦点移开控件之前,串联使用以确认对控件的输入的。例如:假设有几个文本框和一个Help按钮的应用程序,当每个文本框接收焦点时,您想在文本框的特殊验证准则被满足之前阻止用户移动焦点;然而,您也想允许用户在任何时候都能单击Help按钮。要做到这点,...
VCL 中网格控件原理分析 lxpbuaa(桂枝香在故国晚秋)2004-9-15 去年还在成都的时候,因为同事工作需要,我研究了一下TDBGrid,最后有点收获,在TDBGrid中加入了固定列及相关一些(如固定列可得到焦点、可拖放、数据可修改等)功能。前几天,有人在我的Blog(http://blog.csdn.net/lxpbuaa)上开骂:“TMD,我还准备来看点技术文章,Delp...

经验教程

437

收藏

25
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部