国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

在BCB中使用VCL控件數組

2019-11-17 05:20:25
字體:
來源:轉載
供稿:網友
昨晚和網友鄔彥華在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);
可是編譯器告訴我:ERROR!

TSpeedButton *Buttons[]=new TSpeedButton(this)[4]
還是錯!最后我利令智昏,把java的分配方式都拿出來了:


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

結果么?不用說也知道!難道沒辦法了嗎?我想起了簡單類型的指針數組int x[]={1,2,3};于是就試

TSpeedButton *Buttons[]={new TSpeedButton(this),new TSpeedButton(this),new TSpeedButton(this)};
居然可以了!我正想自得的笑,忽然發現:假如要定義100個按鈕怎么辦……打那么一串重復的字誰受得了?就算是用COPY/PARST也難免要數錯,究竟100次啊。難道就沒法子了?經過苦思冥想,又想起了一個辦法,一步一步的來怎么樣?

TSpeedButton **button=new TButton*[100];
for(int i=0;i<100;i++)button[i]=new TSpeedButton(this);

哈哈!居然OK!再試試釋放:

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

哈哈!居然還是OK!于是我就寫了一例子:在一個窗口上放兩按紐,單擊可以顯示或關閉動態生成的按鈕。


首先聲明一個全局變量TButton **x;
然后在Button1的onClick中加入生成代碼:


x=new TButton*[4];
for(int i=0;i<4;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;i<4;i++)delete x[i];
delete[]x;

運行一試,OK!大功告成!

所以,使用VCL數組的過程是:首先聲明一個二重指針,然后分配所要VCL組件的個數,最后再對每個VCL元件進行分配;在釋放的時侯,要釋放每個VCL元件的資源,最后才回收VCL數組的資源。 三層交換技術 交換機與路由器密碼恢復 交換機的選購 路由器設置專題 路由故障處理手冊 數字化校園網解決方案
我的《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類的方法,使用比較方便,但不如上一種高效,總的來說,兩種方法各有優劣,具體使用那一種,就看個人的喜好了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 贵定县| 岳普湖县| 蓝山县| 交口县| 盐城市| 会东县| 宿松县| 渭源县| 靖江市| 汝城县| 昌江| 邢台市| 天峨县| 墨竹工卡县| 东乌| 昆山市| 新野县| 广汉市| 肇州县| 调兵山市| 锡林郭勒盟| 名山县| 全南县| 商丘市| 明星| 黑水县| 衡水市| 白银市| 修水县| 永善县| 房产| 二手房| 高阳县| 唐海县| 北京市| 湛江市| 南京市| 黎城县| 福鼎市| 昌都县| 穆棱市|