老話一句,教授給出程式碼之後一切就都變得很簡單
但是在此之前卻會查資料查的半死,然後又沒甚麼收穫
最吐血的是家裡的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 的座標
比起去想 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;
{
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);
}
}
問題:
暫無
FindComponent 真的是一個很棒的method!
回覆刪除讓我們把一些需要用的的物件的指標通通存到陣列中, 這樣我們就可以透過控制陣列的index, 來簡化我們所撰寫的程式碼了!!
其實這是week6的作業,
回覆刪除所以標籤應該是week6.
另外,現在目前po的有week2,week3,week4,week5,week6(,week7)各一篇.
問題和程式要和起來po.
每週用一次標籤就好.