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

動態元件之動態事件失效

答題得分者是:RaynorPao
shinnuei
一般會員


發表:32
回覆:48
積分:21
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-16 15:40:37 IP:61.221.xxx.xxx 未訂閱
小弟有一個動態產生元件後指定事件給每一個元件的問題想要請教, 因為動態事件有時候很正常,但有時候卻是不正常的,原始碼如下…
 
void __fastcall TForm1::CreateVirtualPanel(int ScreenWidth,int ScreenHeight,int SplitPixel)
{
  panelDynamic = new TPanel(this);
  panelDynamic->Parent  = this;
  panelDynamic->Caption = "";
  panelDynamic->Width   = 176;
  panelDynamic->Height  = 132;
  panelDynamic->Left    = 280;
  panelDynamic->Top     = 0;
//  panelDynamic->OnClick = dynPanelClick;      int hei     = Screen->Height;
  int wid     = Screen->Width;
  ehei        = SplitPixel;
  ewid        = SplitPixel;
  int hCount  = ScreenHeight / ehei;
  wCount      = ScreenWidth  / ewid;
  int panelCount = hCount * wCount;
  int phei    = panelDynamic->Height / hCount;
  int pwid    = panelDynamic->Width  / wCount;      for (int i=0;iParent      = this->panelDynamic;
      panel[i]->Left        = (i%wCount) * pwid;
      panel[i]->Top         = (i/wCount) * phei;
      panel[i]->Height      = phei;
      panel[i]->Width       = pwid;
      panel[i]->Caption     = IntToStr(i);
      panel[i]->OnClick     = dynPanelClick;
      panel[i]->OnMouseMove = dynPanelMouseMove; 指定動態事件OnMouseMove
      panel[i]->Name        = pszNamePrefix   IntToStr(i 1);
  }
}
\\-----------------------------------------------------------------------------------
void __fastcall TForm1::dynPanelMouseMove(TObject *Sender, TShiftState Shift,int X, int Y)
{
  for(int i=0; i <Form1->ComponentCount; i++) 
    if(Components[i]->ClassNameIs("TPanel"))
    {
      TPanel *tmpPanel = (TPanel *)Components[i];
      if(tmpPanel->Name.SubString(1,7) == pszNamePrefix)
      {
        if(tmpPanel->Caption.ToInt() == (int)((TPanel *)Sender)->Caption.ToInt())
        {
          tmpPanel->Color = clSkyBlue;
          CountPos(wCount,ewid,ehei,(int)((TPanel *)Sender)->Caption.ToInt());
        }
        else
          tmpPanel->Color = clBtnFace;
      }
    }
}
而我debug 的結果,錯誤會出現在在上面紅色字的地方 Form1->ComponentCount = 0 為什麼這個變數會變成 0 呢?他不是 Form1 上所有元件的總數嗎? 發表人 - taishyang 於 2003/10/16 21:59:36
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-16 15:59:08 IP:203.73.xxx.xxx 未訂閱
引言: 小弟有一個動態產生元件後指定事件給每一個元件的問題想要請教, 因為動態事件有時候很正常,但有時候卻是不正常的,原始碼如下…
 
void __fastcall TForm1::CreateVirtualPanel(int ScreenWidth,int ScreenHeight,int SplitPixel)
{
  panelDynamic = new TPanel(this);
  panelDynamic->Parent  = this;
  panelDynamic->Caption = "";
  panelDynamic->Width   = 176;
  panelDynamic->Height  = 132;
  panelDynamic->Left    = 280;
  panelDynamic->Top     = 0;
//  panelDynamic->OnClick = dynPanelClick;      int hei     = Screen->Height;
  int wid     = Screen->Width;
  ehei        = SplitPixel;
  ewid        = SplitPixel;
  int hCount  = ScreenHeight / ehei;
  wCount      = ScreenWidth  / ewid;
  int panelCount = hCount * wCount;
  int phei    = panelDynamic->Height / hCount;
  int pwid    = panelDynamic->Width  / wCount;      for (int i=0;iParent      = this->panelDynamic;
      panel[i]->Left        = (i%wCount) * pwid;
      panel[i]->Top         = (i/wCount) * phei;
      panel[i]->Height      = phei;
      panel[i]->Width       = pwid;
      panel[i]->Caption     = IntToStr(i);
      panel[i]->OnClick     = dynPanelClick;
      panel[i]->OnMouseMove = dynPanelMouseMove; 指定動態事件OnMouseMove
      panel[i]->Name        = pszNamePrefix   IntToStr(i 1);
  }
}
\\-----------------------------------------------------------------------------------
void __fastcall TForm1::dynPanelMouseMove(TObject *Sender, TShiftState Shift,int X, int Y)
{
  for(int i=0; i <Form1->ComponentCount; i++) 
    if(Components[i]->ClassNameIs("TPanel"))
    {
      TPanel *tmpPanel = (TPanel *)Components[i];
      if(tmpPanel->Name.SubString(1,7) == pszNamePrefix)
      {
        if(tmpPanel->Caption.ToInt() == (int)((TPanel *)Sender)->Caption.ToInt())
        {
          tmpPanel->Color = clSkyBlue;
          CountPos(wCount,ewid,ehei,(int)((TPanel *)Sender)->Caption.ToInt());
        }
        else
          tmpPanel->Color = clBtnFace;
      }
    }
}
而我debug 的結果,錯誤會出現在在上面紅色字的地方 Form1->ComponentCount = 0 為什麼這個變數會變成 0 呢?他不是 Form1 上所有元件的總數嗎?
shinnuei 你好: 小弟大概看了一下你的程式碼 (並沒有實際測試),我想問題應該是出在 Owner ,你在 Form1 只動態建立了 1 個 TPanel (panelDynamic),而剩下的 TPanel 都動態建立在 panelDynamic 上面,因此你標示為紅色的那一行,看看改成這個 樣子行不行呢?? panelDynamic->ComponentCount 備註: (1)有問題請再提出 (>> --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
shinnuei
一般會員


發表:32
回覆:48
積分:21
註冊:2002-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-16 16:38:59 IP:61.221.xxx.xxx 未訂閱
To RaynorPao: 這一次改成 panelDynamic->ComponentCount 更奇怪,無論怎麼測都是 0 這一個 ComponentCount 的功用不是取得屬於某一個元件的"子元件"嗎? BCB Help 說明如下: Use ComponentCount to find or verify the number of components owned by a component, or when iterating through the Components list to perform some action on all owned components. ComponentCount is used internally for such iterative procedures.
shinnuei
一般會員


發表:32
回覆:48
積分:21
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-16 21:48:34 IP:61.221.xxx.xxx 未訂閱
To RaynorPao: 小弟改用 this->ComponentCount 就很正常了說… 但是為什麼會這樣子呢?跟上面那一篇所說的 Form create的方式有什麼關聯嗎? 我是開一般的 Application .
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-16 22:35:07 IP:61.221.xxx.xxx 未訂閱
引言: To RaynorPao: 小弟改用 this->ComponentCount 就很正常了說… 但是為什麼會這樣子呢?跟上面那一篇所說的 Form create的方式有什麼關聯嗎? 我是開一般的 Application .
shinnuei 你好: 看看這兩篇文章
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
系統時間:2024-05-08 8:19:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!