我的《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類的方法,使用比較方便,但不如上一種高效,總的來說,兩種方法各有優劣,具體使用那一種,就看個人的喜好了。