線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1455
推到 Plurk!
推到 Facebook!

TShape的MouseDown可否陣列處理

答題得分者是:taishyang
yeeddt
初階會員


發表:18
回覆:28
積分:29
註冊:2008-11-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-12-01 10:13:08 IP:211.21.xxx.xxx 訂閱
各位前輩好!
我想模擬小畫家中色塊工具列,因此應用了TShape的MouseDown事件。
當左鍵點到某個TShape畫筆顏色就會改變。
但是每個TShape的事件裡判斷式都很類似,只是換個元件名稱。
請問這樣有辦法將它們陣列處理嗎?
[code cpp]
TColor Lcolor=clBlack; //預設左鍵為黑色
TColor Rcolor=clWhite; //預設右鍵為白色
void __fastcall TForm1::Shape1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if (Shift.Contains(ssLeft))
Lcolor=Shape1->Brush->Color;
else if (Shift.Contains(ssRight))
Rcolor=Shape1->Brush->Color;
}

[/code]
將事件變成類似下面這樣?

[code cpp]
void __fastcall TForm1::Shape(i)MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)

[/code]
編輯記錄
yeeddt 重新編輯於 2008-12-01 11:05:14, 註解 無‧
taishyang
站務副站長


發表:377
回覆:5486
積分:4552
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-12-01 10:22:27 IP:118.169.xxx.xxx 訂閱
目前沒看過這樣的作法
但是你可以將MouseDown的事件通通指向同一個
然後用Sender來判斷是哪一個TShape的
yeeddt
初階會員


發表:18
回覆:28
積分:29
註冊:2008-11-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-12-01 11:04:23 IP:211.21.xxx.xxx 訂閱
副站長,您好!
請問這樣是否表示還是會有28個事件?
還是您指的就是這篇討論的方法如何讓不同元件執行同一動作

但是我卻無法如法炮製。
[code cpp]
TShape *Shape[28];
void __fastcall TForm1::Shape3MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
for(int i=1; i<=28; i )
{
TShape *Shape=dynamic_cast(FindComponent("Shape" IntToStr(i))); //我已宣告但是complier後顯示Shpae never used
if (Shift.Contains(ssLeft))
{
Lcolor=Shape[i]->Brush->Color;
leftShape->Brush->Color=Lcolor; //顯示左鍵為何種顏色
}
else if (Shift.Contains(ssRight))
{
Rcolor=Shape[i]->Brush->Color;
rightShape->Brush->Color=Rcolor; //顯示右鍵為何種顏色
}
}
}
[/code]
編輯記錄
yeeddt 重新編輯於 2008-12-01 11:06:15, 註解 無‧
taishyang
站務副站長


發表:377
回覆:5486
積分:4552
註冊:2002-10-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-12-01 11:35:14 IP:118.169.xxx.xxx 訂閱
1.在Object Inspector中將所有Shpae的mouse down事件通通指向Shape1的mouse down事件
2.加入下面的程式碼
TColor Lcolor=clBlack; //預設左鍵為黑色
TColor Rcolor=clWhite; //預設右鍵為白色

void __fastcall TfrmMain::Shape1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
TShape *sp = (TShape*)Sender;
if (sp){
if (Shift.Contains(ssLeft)){
sp->Brush->Color = Lcolor;
}else if (Shift.Contains(ssRight)){
sp->Brush->Color = Rcolor;
}
}
}
編輯記錄
taishyang 重新編輯於 2008-12-01 11:36:00, 註解 無‧
yeeddt
初階會員


發表:18
回覆:28
積分:29
註冊:2008-11-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-12-01 12:10:52 IP:211.21.xxx.xxx 訂閱
謝謝副站長的幫忙。
我還偷偷去Google了一下才知道什麼是Object Inspector,果然可以動作了!

但是可以請教下面這行程式碼什麼意思嗎?

[code cpp]
TShape *sp = (TShape*)Sender;
[/code]
taishyang
站務副站長


發表:377
回覆:5486
積分:4552
註冊:2002-10-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-12-01 12:22:03 IP:118.169.xxx.xxx 訂閱
可以利用TObject *Sender來知道觸發此事件的物件是什麼
可是它的資料型態是TObject,並且沒有
Brush可以用
由於我們可以確定是由TShape來觸發,所以強制轉換型態為
TShape *
yeeddt
初階會員


發表:18
回覆:28
積分:29
註冊:2008-11-10

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-12-01 12:28:04 IP:211.21.xxx.xxx 訂閱
感謝您熱心的解答!
我要繼續對付下個難題了。
系統時間:2017-11-19 22:15:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!