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

自訂VCL元件

尚未結案
gmobug
一般會員


發表:10
回覆:28
積分:12
註冊:2004-02-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-14 20:54:05 IP:221.169.xxx.xxx 未訂閱
我想做一個類似Edit的元件 但他只能輸入數字    1.首先我新增一個元件讓他繼承TEdit,他的名字叫TNumEdit    2.在Private:裡AnsiString ori; (儲存舊字串)    3.在TNumEdit的建構函式
__fastcall TNumEdit::TNumEdit(TComponent* Owner)
        : TEdit(Owner)
{
        TEdit::change;
        ori=TEdit::Text;
}
4.接著自定一個函式
change(TObject *Sender){
        if(TEdit::Text符合條件){
                ori=TEdit::Text;
        }else{
                TEdit::Text=ori;
        }
//        if(TNumEdit::OnChange){
//                TNumEdit::OnChange();
//        }
}
我在NumEdit.h裡寫了
typedef void __fastcall (__closure *OnChange)(System::TObject *Sender);
想蓋掉TEdit的OnChange事件 可是好像沒有成功 如果在設計時期指定了OnChange的EventHandler 則change()就沒有動作 請問要如何解決? 發表人 - gmobug 於 2005/07/14 20:55:02 發表人 - gmobug 於 2005/07/14 20:57:49
gmobug
一般會員


發表:10
回覆:28
積分:12
註冊:2004-02-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-15 16:17:16 IP:221.169.xxx.xxx 未訂閱
我在網路上查了一些資料 要覆蓋TEdit的OnChange事件似乎不用重新typedef 好像是會用到DYNAMIC 但我不太清楚怎麼用
liangnet
中階會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-15 16:36:19 IP:211.20.xxx.xxx 未訂閱
我建議你可以從TCustomEdit繼承。 然後再重載這函式! DYNAMIC void __fastcall KeyPress(Char &Key); 當有按鍵發生時,你可以檢查按下的Key是否為數值? 發表人 - liangnet 於 2005/07/15 16:39:57
gmobug
一般會員


發表:10
回覆:28
積分:12
註冊:2004-02-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-15 16:52:10 IP:221.169.xxx.xxx 未訂閱
但是用KeyPress遇到用貼上的方式會有問題
liangnet
中階會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-15 17:06:12 IP:211.20.xxx.xxx 未訂閱
嗯~不好意思,沒想的週到一點^^" 以下這是我剛試的方法。 重載 DYNAMIC void __fastcall Change(void); 然後再這函式裡,去檢查Text是否為正確的數值資料。
void __fastcall TNumberEdit::Change(void)
{
        int nValue;
        if (!TryStrToInt(Text, nValue))
        {
                //非整值
                Text = "";
        }
        TCustomEdit::Change();
}
附上這一段小程式給你參考。 發表人 - liangnet 於 2005/07/15 17:08:09 發表人 - liangnet 於 2005/07/15 17:11:23
gmobug
一般會員


發表:10
回覆:28
積分:12
註冊:2004-02-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-15 18:07:08 IP:221.169.xxx.xxx 未訂閱
謝謝! 我不知道他有Change這個方法 請問OnXXX的事件都有對應的XXX方法嗎?
liangnet
中階會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-07-15 18:15:52 IP:211.20.xxx.xxx 未訂閱
引言: 謝謝! 我不知道他有Change這個方法 請問OnXXX的事件都有對應的XXX方法嗎?
不一定~ 你可以按Ctrl後,然後再把你的Mouse移到TCustomEdit這個字上Click, 就會跳到定義TCustomEdit的地方,可以看一下原型的定義有那些東西^^ 如果要看到每個函式裡面的實作程式,可以到BCB的目錄下 C:\Program Files\Borland\CBuilder6\Source\vcl 裡面會有Source Code,不過是用Pascal寫的。 發表人 - liangnet 於 2005/07/15 18:17:14
gmobug
一般會員


發表:10
回覆:28
積分:12
註冊:2004-02-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-07-15 18:35:23 IP:221.169.xxx.xxx 未訂閱
我發現如果繼承TCustomEdit的話 很多東西好像要在自己讓他變published 而且Events那裡是空白的....
gmobug
一般會員


發表:10
回覆:28
積分:12
註冊:2004-02-04

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-07-15 18:46:12 IP:221.169.xxx.xxx 未訂閱
按著Ctrl再去按TCustomEdit跑出來的StdCtrls.hpp 裡面有TCustomEdit和TEdit TEdit的__published那邊宣告了很多 我可不可以直接把他複製到NumEdit.h的__published裡面 這樣設計時期看起來就比較像TEdit
gmobug
一般會員


發表:10
回覆:28
積分:12
註冊:2004-02-04

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-07-15 19:00:20 IP:221.169.xxx.xxx 未訂閱
嘿...似乎可以:) 現在有個比較不重要的問題就是 平常把TEdit在畫面上拉好之後 Text屬性預設會是EditX, X屬於N 並自動遞增 (通常跟Name一樣) 可是做出來的元件 他的Text預設是空白 在StdCtrls.hpp那邊也沒有特別寫什麼 還是他是寫在建構子那邊? 可是建構子那時候就有作用了嗎 發表人 - gmobug 於 2005/07/15 19:16:59
gmobug
一般會員


發表:10
回覆:28
積分:12
註冊:2004-02-04

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-07-15 19:37:14 IP:221.169.xxx.xxx 未訂閱
為什麼我在Change()裡 寫了一部分程式碼 有動到SelStart 可以通過編譯 可是拉元件的時候出現 Control 'NumEdit1' has no parent window. 把動到SelStart的那幾行註解掉又沒問題了?
系統時間:2024-05-02 14:22:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!