我的《BCB中使用VCL控件数组》中,提到了用TList来实现时无法释放资源的问题,结果今天就得到了答案,邬彦华等等网友都指教了TList实现的释放方法,定义代码同前文:
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的指针 } 释放资源的代码如下:
int num = button->Count; for(int i=0;i<num;i++) { delete (TSpeedButton *)button->Items[i]; } 其实说穿了就是删除TList的每一项,不过因为TList->Items的类型是void *,在C/C++中,void *可匹配任何类型,所以只要加一个强制类型转换(TSpeedButton *)就可以了,当然用(TObject *)等也是可以的,因为TObject是VCL中所有类的基类,而基类的指针是可以指向它的直接或间接子类的。
两种方法的比较:我上次的方法可说是典型的C++解决方法,而这种方法可说是C++Builder的解决方法,用双重指针比较灵活、高效,但大家都知道,多重指针可不那么好懂,想当初我曾用过4重指针(不要用那么目光看着我!),到后来我自已都糊涂了。而这次的方法比较好懂,并且能用TList类的方法,使用比较方便,但不如上一种高效,总的来说,两种方法各有优劣,具体使用那一种,就看个人的喜好了。  
2/2 首页 上一页 1 2 |