![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyFmjNTjAK8GdY2Z8ICHKX61acWlnUEHgv1IIfz1plu-KkYCkSC27UdzwHkfwFKxO5Of5C66P752R8xiQWK8E1Q2-xtts-53EncMhpn3Fd2yvL2lxEvx02t5V4RL0CWSTHu6NIm6nFt_o/s400/week06%E9%B9%B9%E8%9B%8B%E8%B6%85%E4%BA%BA.jpg)
老話一句,教授給出程式碼之後一切就都變得很簡單
但是在此之前卻會查資料查的半死,然後又沒甚麼收穫
最吐血的是家裡的vista不能看程式附的help檔,真是~!#$%^&*(_+
發個牢騷 = =a
【這堂課新學的指令】Rect是一個特殊的數據結構,又是一個函數
他的作用就是定義一個矩形位址
Rect( 左上角x , 左上角y , 右下角x , 右下角y );CopyRect 則是將一個Canvas(A)的矩形位址,'
複製到另一個Canvas(B)的矩形位址
CopyRect( B的矩形位址 , A的Canvas , A的矩形位址 );【讓Image在程式一打開就有圖片】點選一個Image,在屬性視窗裡,尋找 Picture ( Name 的下面第二個)
點進去後可以載入bmp 圖檔
只能載入 bmp 圖檔,雖然其他如 jpg 的圖也可以開啟,
但是會在CopyRect時發生錯誤
【其他1】 【 動態使用指定 Image 】
如果要像教授播放的範例一樣,弄出九宮格
那至少會有10個 Image ,一個來源圖片,九個空 Image
這樣的話,就要每個 Image 都設定一次
ex:
Image1:
int x=280,y=68;
TRect rtTile,rtOI;
rtTile = Rect(0,0,90,90);
rtOI = Rect(x,y,x+90,y+90);
Image1->Canvas->CopyRect(rtTile,Image1->Canvas,rtOI);
Image2:
int x=280,y=68;
TRect rtTile,rtOI;
rtTile = Rect(0,0,90,90);
rtOI = Rect(x,y,x+90,y+90);
Image2->Canvas->CopyRect(rtTile,Image1->Canvas,rtOI);
Image3:
...
...
...
...
9個 Image 就要設定9次,數量一多不就寫到死了
所以我就想,難道 Image 只能固定使用,不能用其他的變數替代嗎??
或是用陣列來設定 Image ??
然後開始上網翻資料
我找到的是使用 FindComponent 函數
使用方法如下:
(TImage*)FindComponent( "Image"+IntToStr( i ) )(Timage*) 這個應該是元件type的宣告
( "Image"+IntToStr( i ) ) 這裡是 "元件名稱"+(編號)
((TImage*)FindComponent("Image"+IntToStr(
1)))->Canvas
相等於 Image1->Canvas
這樣的話,要使用哪個 Image 就隨自己了
九個 Image 就可以只要更改 rtOI 的 x,y 坐標
int x=0,y=0;
TRect rtTile,rtOI;
rtTile = Rect(0,0,88,88);
rtOI = Rect(x,y,x+88,y+88);
for(int i=0;i<8;i+=3)
{
for(int j=i+1;j<i+4;j++)<>
{
((TImage*)FindComponent("Image"+IntToStr(j)))->Canvas->
CopyRect(rtTile,Image10->Canvas,rtOI);
x+=88;
rtOI = Rect(x,y,x+88,y+88);
}
x=0;
y+=88;
rtOI = Rect(x,y,x+92,y+92);
}
最後我發現!!
比起去想 for loop 裡面怎麼改 x,y 的座標
還不如複製貼上用個9次來的快 ...... XD
【其他2】 【 指定 Image 為陣列 】
懂了 FindComponent 怎麼用之後,就有更簡單的方法啦
先找個地方宣告 global 變數
Timage *BMP[9];
然後把下列程式碼放在 butten 裡面或隨便哪裡 看你想怎麼使用
for(int i=0;i<9;i++)
BMP[i]=(TImage*)FindComponent("Image"+IntToStr(i+1));
這樣一來,
Image1->Canvas 就可以替換成 BMP[0]->Canvas
Image2->Canvas 則可以替換成 BMP[1]->Canvas
...
...
依此類推
這樣上面po的程式碼又可以更簡潔易看了
int x=0,y=0;
TRect rtTile,rtOI;
rtTile = Rect(0,0,88,88);
rtOI = Rect(x,y,x+88,y+88);
int k=0;
for(int i=0;i<8;i+=3)
{
for(int j=i+1;j<i+4;j++)
{
BMP[k++]->Canvas->CopyRect(rtTile,Image10->Canvas,rtOI);
x+=88;
rtOI = Rect(x,y,x+88,y+88);
}
x=0;
y+=88;
rtOI = Rect(x,y,x+92,y+92);
}
問題:
暫無