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

動態產生TEdit該如何處理OnChange事件

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


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-12-14 16:44:37 IP:218.167.xxx.xxx 訂閱
各位前輩好:
我現在正在寫一個讓電腦解數獨的程式,所以利用動態物件產生81個Tedit。
想讓使用者只能輸入1~9的數字,但是不知道該如何對動態物件指定事件。

bruce0211前輩分享的BCB心得中Tag & Hint 屬性的妙用裡有提到相關使用方式。

[code cpp]
edit[i][j]->forbidden=&FF_Plu_MouseDown; //此行顯示錯誤因forbidden不是TEdit的member
[/code]

順便請教&FF_Plu_MouseDown所代表的意義,是否僅代表一個變數?


希望前輩能幫幫忙,謝謝!
編輯記錄
yeeddt 重新編輯於 2008-12-14 18:11:25, 註解 無‧
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-12-15 10:55:10 IP:118.169.xxx.xxx 訂閱
本站網頁顯示的關係
應該是
edit[i][j]->OnMouseDown

FF_Plu_MouseDown這個是你為動態元件所寫的MouseDown事件procedure



===================引 用 yeeddt 文 章===================
各位前輩好:
我現在正在寫一個讓電腦解數獨的程式,所以利用動態物件產生81個Tedit。
想讓使用者只能輸入1~9的數字,但是不知道該如何對動態物件指定事件。

bruce0211前輩分享的BCB心得中Tag & Hint 屬性的妙用裡有提到相關使用方式。

[code cpp]
edit[i][j]->forbidden=&FF_Plu_MouseDown; //此行顯示錯誤因forbidden不是TEdit的member
[/code]

順便請教&FF_Plu_MouseDown所代表的意義,是否僅代表一個變數?


希望前輩能幫幫忙,謝謝!
yeeddt
初階會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-12-15 13:52:49 IP:211.21.xxx.xxx 訂閱
謝謝前輩的解答!

之前請教過前輩元件陣列的使用方式,但是二維陣列卻無法依樣畫葫蘆。

[code cpp]
void __fastcall TForm1::FF_Plu_MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
bv[((TLabel *)Sender)->Tag]->Style=bsLowered;
}

[/code]
我想按照上面的方式改成二維陣列,是不是要改變一下 TObject *Sender的寫法才能符合?

[code cpp]
//這是我自己宣告的OnChange事件
void __fastcall TFormMain::OnChange(TObject *Sender)
{
edit[ ][ ]->Enabled=false; //不知該如何在[ ]中加入TObject *Sender
}
[/code]
編輯記錄
yeeddt 重新編輯於 2008-12-15 13:53:37, 註解 無‧
yeeddt 重新編輯於 2008-12-15 14:16:28, 註解 無‧
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-12-15 14:13:39 IP:118.169.xxx.xxx 訂閱
應該要反問您打算如何得知edit[i][j]其中的i和j?
編輯記錄
taishyang 重新編輯於 2008-12-15 14:14:34, 註解 無‧
yeeddt
初階會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-12-15 15:23:43 IP:211.21.xxx.xxx 訂閱
前輩一個反問讓我做了點測試來確認自己的想法。
原本認為所有edit指向同一個事件後,能利用Sender來判斷是哪個edit。
所以才會有上一個回覆所提到的問題。

但發現自己宣告的OnChange事件並不是我所想的全部edit都會指向這裡。
甚至任何一個edit都無法觸發這個事件,不曉得宣告方式是不是有錯。


[code cpp]
//此為Unit1.h
class TFormMain : public TForm
{
__published: // IDE-managed Components
TButton *StartBut;
TButton *CleanBut;
TButton *CloseBut;
TButton *StopBut;
TButton *showBut;
TEdit *Edit1;
void __fastcall FormCreate(TObject *Sender);
void __fastcall CleanButClick(TObject *Sender);
void __fastcall CloseButClick(TObject *Sender);
void __fastcall showButClick(TObject *Sender);
void __fastcall StartButClick(TObject *Sender);
void __fastcall Edit1Change(TObject *Sender);
private: // User declarations
void __fastcall TFormMain::OnChange(TObject *Sender); //在此加入我設定的事件
public: // User declarations
__fastcall TFormMain(TComponent* Owner);
};
[/code]

[code cpp]
//Unit1.cpp
edit[i][j]->OnChange; //並在產生動態物件的迴圈中加入此行
//但是這行有沒有加入我判斷不出差別
void __fastcall TFormMain::OnChange(TObject *Sender)
{
int x;
if (TryStrToInt(edit[1][1]->Text,x)){
//依照原本的想法在edit[1][1]輸入非1~9的數字會ShowMessage但是毫無反應
switch (x)
{
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
break;
default:
edit[1][1]->Text="";
ShowMessage("請輸入數字1~9");
}
}
else{
edit[1][1]->Text="";
ShowMessage("請輸入數字1~9");
}
}

[/code]

再麻煩前輩幫幫忙了!
編輯記錄
yeeddt 重新編輯於 2008-12-15 15:24:42, 註解 無‧
yeeddt 重新編輯於 2008-12-15 15:26:22, 註解 無‧
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-12-15 16:07:25 IP:118.169.xxx.xxx 訂閱
參考看看吧

[code cpp]
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
private: // User declarations
void __fastcall MyEditChange(TObject *Sender);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};

#define EDT_ROW 2
#define EDT_COL 2
TEdit *edt[EDT_ROW][EDT_ROW];
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
for (int i=0; i for (int j=0; j edt[i][j] = new TEdit(this);
edt[i][j]->Parent = this;
edt[i][j]->Width = 20;
edt[i][j]->Height = 20;
edt[i][j]->Left = j*edt[i][j]->Width;
edt[i][j]->Top = i*edt[i][j]->Height;
edt[i][j]->Tag = j 2*i;
edt[i][j]->OnChange = MyEditChange;
}
}

}
//---------------------------------------------------------------------------
void __fastcall TForm1::MyEditChange(TObject *Sender)
{
TEdit *edt = (TEdit*)Sender;
switch (edt->Tag){
case 0: edt->Text = "0"; break; //故意顯示"0"表示事件有觸發到
case 1: edt->Text = "1"; break;
case 2: edt->Text = "2"; break;
case 3: edt->Text = "3"; break;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
for (int i=0; i for (int j=0; j delete edt[i][j];
edt[i][j] = NULL;
}
}
}
//---------------------------------------------------------------------------

[/code]
編輯記錄
taishyang 重新編輯於 2008-12-15 16:08:27, 註解 無‧
yeeddt
初階會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-12-15 16:34:33 IP:211.21.xxx.xxx 訂閱
謝謝前輩熱心的幫助!
這篇段程式不僅解決我的問題,也發現變數命名應該要更靈活。
謝謝!
kostin
一般會員


發表:18
回覆:43
積分:22
註冊:2010-03-11

發送簡訊給我
#8 引用回覆 回覆 發表時間:2010-04-01 11:19:39 IP:122.127.xxx.xxx 訂閱
獲益良多 甘恩
------
工程師的世界太深奧了 ~ 總是有不斷的驚奇發生
在解決問題的當下 , 才能確認我的存在
在得到幫助的當下 , 才能發現我不孤單
系統時間:2024-04-19 18:59:31
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!