全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1676
推到 Plurk!
推到 Facebook!

動態產生元件後的控制

答題得分者是:liangnet
dachura
一般會員


發表:2
回覆:3
積分:1
註冊:2004-03-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-04-01 03:04:02 IP:163.28.xxx.xxx 未訂閱
各位先進好:    最近在寫打磚塊的小遊戲 我希望打到磚塊後會有額外的小東西掉下來(ex:可以加分之類的) 我的想法是 對每個磚塊創造動態的image元件 再另外產生一個動態的Timer去控制他們的移動(在ontimer事件裡讓image的Top增加) 目前的進度是image已經可以弄出來了 但是不知道要怎麼控制讓它動 學長說要用dynamic_cast 看了bcb的help(看不太懂||) 也搜尋過很多站上的文章 可是都弄不出來 希望大家可以幫忙解答一下 p.s 我的C++基礎有點爛,其實都是看站上的討論文章東拼西湊去解決問題, 所以如果程式碼或觀念有很愚蠢的錯誤希望大家見諒....    
 
void __fastcall TForm1::plus()//這是要加在我主程式的迴圈裡
{
  img[7*i j]=new TImage(Panel1);//我的磚塊排列是7*7,因為不大會用二維陣列所以都改成一維的
  tim=new TTimer(this);
  img[7*i j]->Parent=Panel1;
  img[7*i j]->Height=25;
  img[7*i j]->Width=25;
  img[7*i j]->Transparent=true;
  img[7*i j]->Top=i*25 20;
  img[7*i j]->Left=j*75 30;
  ImageList2->Draw(img[7*i j]->Canvas,0,0,0,true);
  tim->Enabled=true;
  tim->Interval=10;
  tim->OnTimer=timOnTimer;
}    void __fastcall TForm1::timOnTimer(TObject *Sender)
{
   for(i=0;i<7;i  )
       {
         for(j=0;j<7;j  )
          { 
             img[7*i j]=dynamic_cast(Sender);
             img[7*i j]->Top  ;//跑到這就當機了
             if(img[7*i j]->Top>350)
                  delete[] img;
          }
       }
}    
< >< > 發表人 - taishyang 於 2004/04/01 13:47:10
ENIX007
高階會員


發表:28
回覆:274
積分:185
註冊:2003-11-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-04-01 08:39:42 IP:210.243.xxx.xxx 未訂閱
dachura您好 抱歉,不是很確定問題所在,只是在OnTimer事件中,  
引言:
 void __fastcall TForm1::timOnTimer(TObject *Sender)
{
   for(i=0;i<7;i  )
       {
         for(j=0;j<7;j  )
          { 
             img[7*i j]=dynamic_cast(Sender);
             img[7*i j]->Top  ;//跑到這就當機了
             if(img[7*i j]->Top>350)
                  delete[] img;   //只要有一個img滿足條件就釋放整個img陣列??
          }
       }
}
delete[] img;是釋放全部喔...那當下一圈進來時要執行 img[7*i j]->Top ;就會當機了< > 請參考看看< > 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-04-01 09:22:52 IP:61.63.xxx.xxx 未訂閱
引言: 各位先進好: 最近在寫打磚塊的小遊戲 我希望打到磚塊後會有額外的小東西掉下來(ex:可以加分之類的) 我的想法是 對每個磚塊創造動態的image元件 再另外產生一個動態的Timer去控制他們的移動(在ontimer事件裡讓image的Top增加) 目前的進度是image已經可以弄出來了 但是不知道要怎麼控制讓它動 學長說要用dynamic_cast 看了bcb的help(看不太懂||) 也搜尋過很多站上的文章 可是都弄不出來 希望大家可以幫忙解答一下 p.s 我的C++基礎有點爛,其實都是看站上的討論文章東拼西湊去解決問題, 所以如果程式碼或觀念有很愚蠢的錯誤希望大家見諒....
 
void __fastcall TForm1::plus()//這是要加在我主程式的迴圈裡
{
  img[7*i j]=new TImage(Panel1);//我的磚塊排列是7*7,因為不大會用二維陣列所以都改成一維的
  tim=new TTimer(this);
  img[7*i j]->Parent=Panel1;
  img[7*i j]->Height=25;
  img[7*i j]->Width=25;
  img[7*i j]->Transparent=true;
  img[7*i j]->Top=i*25 20;
  img[7*i j]->Left=j*75 30;
  ImageList2->Draw(img[7*i j]->Canvas,0,0,0,true);
  tim->Enabled=true;
  tim->Interval=10;
  tim->OnTimer=timOnTimer;
}    void __fastcall TForm1::timOnTimer(TObject *Sender)
{
   for(i=0;i<7;i  )
       {
         for(j=0;j<7;j  )
          { 
             img[7*i j]=dynamic_cast(Sender);
             img[7*i j]->Top  ;//跑到這就當機了
             if(img[7*i j]->Top>350)
                  delete[] img;
          }
       }
}    
< >< >
dachura你好: 應該是這行轉型的問題吧: < class="code"> img[7*i j]=dynamic_cast(Sender); 在一個Timer的onTimer事件中傳入的參數"Sender"是指一個Timer Object,表示這一個Timer Object觸發這事件的! 所以這樣是合法的:

void __fastcall TForm1::timOnTimer(TObject *Sender)
{
 TTimer* mytimer;
 mytimer=(TTimer*)Sender;
 ShowMessage(mytimer->Name);
}    
所以你這行不合法,但可compiler過:
img[7*i j]=dynamic_cast(Sender);
雖然compiler是可以過,但是img[7*i j]這個Image物件並沒有真正被assign到東西! 所以這行就錯了: img[7*i j]->Top ; 因為一個沒有真正new(no initialize)的物件不可能做top 的動作,因為它連top是多少都沒有! 應該是這樣! 發表人 -
liangnet
中階會員


發表:19
回覆:148
積分:83
註冊:2004-01-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-04-01 10:08:15 IP:218.163.xxx.xxx 未訂閱
dachura你好:    你的timOnTimer裡面寫的有很大問題。 你在建立TImage後並且存到img陣列裡面,但是我看你timOnTimer卻寫了這一行  img[7*i+j]=dynamic_cast(Sender); 就會把你剛剛建立好的TImage指摽給蓋掉了。 如果你的img是一個TImage型態的陣列,那可不必用dynamic_cast Timer物件也只需建立一個就好了。
 
void __fastcall TForm1::timOnTimer(TObject *Sender)
{
   for(i=0;i<7;i  )
       {
         for(j=0;j<7;j  )
          { 
             if (img[7*i j] != NULL)
             {
                  img[7*i j]->Top  ;                      if(img[7*i j]->Top>350)
                  {
                      delete img[7*i j];
                      img[7*i j] = NULL; // 不好意思少了這一行^^"
                  }
             }
          }
       }
}
img[]最好一開始前先將內容清為NULL。
發表人 - liangnet 於 2004/04/01 10:14:41 發表人 - liangnet 於 2004/04/01 10:22:05
dachura
一般會員


發表:2
回覆:3
積分:1
註冊:2004-03-29

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-04-01 10:19:36 IP:163.28.xxx.xxx 未訂閱
很感謝各位.... 已經可以了.....再度感謝~~~~
ENIX007
高階會員


發表:28
回覆:274
積分:185
註冊:2003-11-27

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-04-01 16:34:03 IP:210.243.xxx.xxx 未訂閱
啊... 應該是如m8815010和liangnet兩位大大說的這般... 基本上還沒執行到delete應該就掛了... 之前沒有想清楚,真是抱歉 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
系統時間:2024-05-19 6:26:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!