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

關於edit的限制輸入,還有key的問題

尚未結案
elctppo
一般會員


發表:28
回覆:22
積分:10
註冊:2005-04-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-01 13:32:00 IP:202.175.xxx.xxx 未訂閱
大家好!我是delphi的初學者!希望大家能幫幫忙,也希望大家不要只是給答案我,麻煩能夠詳細解釋當中的道理。thx!!! 1.如何限制edit只能輸入數字? 2.marksedit我知道也可以限制用戶的輸入,比如在marksedit裏999好像是代表只可以輸入三位數的數字,但是如果我不想限制長度?該怎樣做呢? 3.如果我在key事件裏,判斷key的值,如果key不是數字0-9,可否使key不在edit裏顯示出來呢?key好像有兩個型態char和word,其分別是什麼呢?
pillar62
資深會員


發表:9
回覆:324
積分:271
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-01 13:56:11 IP:210.64.xxx.xxx 未訂閱
你好 可以在edit的keypress的事件裡面寫 if (not (Key in ['1'..'9'])) then Key := #0; 這樣的寫法可以限制在輸入的時候只能夠輸入1~9,也可以限制輸入字母例如 if (not (Key in ['k', 'M'])) then Key := #0; 就會限制只能輸入k以及m . Pillar Wang
------
Pillar Wang
elctppo
一般會員


發表:28
回覆:22
積分:10
註冊:2005-04-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-01 18:04:05 IP:202.175.xxx.xxx 未訂閱
引言: 你好 可以在edit的keypress的事件裡面寫 if (not (Key in ['1'..'9'])) then Key := #0; 這樣的寫法可以限制在輸入的時候只能夠輸入1~9,也可以限制輸入字母例如 if (not (Key in ['k', 'M'])) then Key := #0; 就會限制只能輸入k以及m . Pillar Wang
謝謝你的回覆~這樣的話會使edit的其他鍵也不能用例如backspace 和方向鍵~~~
jimmy_wei
高階會員


發表:9
回覆:176
積分:147
註冊:2003-08-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-01 18:41:31 IP:210.68.xxx.xxx 未訂閱
elctppo你好:     
      ShowMessage(IntToStr(Ord(Key)));  //這可以show出你按的每一個鍵的ascii碼,所以想要什麼自己加了,如下#8是backspace      if (not (Key in [#48..#57, #8])) then
    Key := #0;    
還有你問的CHAR和WORD其他們是不同的資料型態, 你可以按F1打CHAR和WORD去查就知道了
elctppo
一般會員


發表:28
回覆:22
積分:10
註冊:2005-04-01

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-04-01 22:25:31 IP:202.175.xxx.xxx 未訂閱
引言: elctppo你好:
      ShowMessage(IntToStr(Ord(Key)));  //這可以show出你按的每一個鍵的ascii碼,所以想要什麼自己加了,如下#8是backspace      if (not (Key in [#48..#57, #8])) then
    Key := #0;    
還有你問的CHAR和WORD其他們是不同的資料型態, 你可以按F1打CHAR和WORD去查就知道了
謝謝你~我已經解決了我的問題,但是如果key := #0;的話,edit本身的其他功能鍵就會失效,所以我甘脆用readonly只是不讓有文字在edit顯示出來~不會像#0把所有鍵都吞了~~但是有一點我想問的是,我用chr(8),看到backspace的字元是keyboard上沒有的,如果我想查上下左右方向鍵的內碼又如何查呢?用ord()的話,又不知道它們的字元~按它們是不會有字元出現的呀~最後還是謝謝你幫我解決了我的問題~
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-04-02 09:30:20 IP:202.62.xxx.xxx 未訂閱
您好﹗    因為鍵盤事件中有OnKeyDown&OnKeyUp這一組和OnKeyPress這一組﹐兩者的區別在于前者接受ASCII鍵和非ASCII鍵﹐Key的形態為Integer﹐而后者只接受ASCII鍵﹐Key的形態為Char(字元)﹐您可在OnKeyDown事件中取出所按鍵的十進位Key值和十六進位Key值﹐範例如下﹕
begin
  ShowMessage('十進位的Key值為﹕' + IntToStr(Key) + #10#13 + '十六進位的Key值為﹕' + IntToHex(Key, 4));
end;
在上述範例程式碼所取得的十進位Key值中﹐其和OnKeyPress事件中對應的的有些字元是相同的﹐只是表達的方法和形態不同﹐因為OnKeyDown事件中﹐輸入值Key的形態為Integer﹐而OnKeyPress事件中﹐輸入值Key的形態為字元﹐所以可以用Chr來表示﹐也可在值前加上#符號來表示﹐如﹕
所按鍵        OnKeyDown值   OnKeyPress值
Enter         013           #13
BackSpace鍵   008           #8
從以上的結果可以看出兩者之間的部分相似性﹐當然這不是絕對的﹐畢竟OnKeyDown&OnKeyUp所接受的是所有ASCII鍵和非ASCII鍵﹐而OnKeyPress只接受ASCII鍵﹒ 個人意見﹐歡迎指正﹒ ================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================ 發表人 - cashxin2002 於 2005/04/02 12:38:14
------
忻晟
elctppo
一般會員


發表:28
回覆:22
積分:10
註冊:2005-04-01

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-04-02 12:24:01 IP:202.175.xxx.xxx 未訂閱
引言: 您好﹗ 因為鍵盤事件中有OnKeyDown&OnKeyUp這一組和OnKeyPress這一組﹐兩者的區別在于前者接受ASCII鍵和非ASCII鍵﹐Key的形態為Integer﹐而后者只接受非ASCII鍵﹐Key的形態為Char(字元)﹐您可在OnKeyDown事件中取出所按鍵的十進位Key值和十六進位Key值﹐範例如下﹕
begin
  ShowMessage('十進位的Key值為﹕' + IntToStr(Key) + #10#13 + '十六進位的Key值為﹕' + IntToHex(Key, 4));
end;
在上述範例程式碼所取得的十進位Key值中﹐其和OnKeyPress事件中對應的的有些字元是相同的﹐只是表達的方法和形態不同﹐因為OnKeyDown事件中﹐輸入值Key的形態為Integer﹐而OnKeyPress事件中﹐輸入值Key的形態為字元﹐所以可以用Chr來表示﹐也可在值前加上#符號來表示﹐如﹕
所按鍵        OnKeyDown值   OnKeyPress值
Enter         013           #13
BackSpace鍵   008           #8
從以上的結果可以看出兩者之間的部分相似性﹐當然這不是絕對的﹐畢竟OnKeyDown&OnKeyUp所接受的是所有ASCII鍵和非ASCII鍵﹐而OnKeyPress接受的是非ASCII鍵﹒ 個人意見﹐歡迎指正﹒ ================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
OnKeyPress的KEY不是ASCII鍵嗎?
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-04-02 12:39:41 IP:202.62.xxx.xxx 未訂閱
您好﹗    抱歉﹐筆誤了﹐應為﹕OnKeyPress事件只接受ASCII碼﹐而不是非ASCII碼﹐以上回覆已做更正﹒    ================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-04-02 19:26:31 IP:210.201.xxx.xxx 未訂閱
大家好, 我想不可能把 TEdit 的其中一個字元改為 #0 吧? 因為,如果使用者輸入了 9a99,就應該把 a 踢掉,成為999, 但強行把 a 改為 #0,那麼原本應該是三個字元的字串,卻變成四個字元了。 雖然顯示出來是 999 沒有錯,但如果拿這個字串來跟一堆字串比對,那肯定會產生錯誤結果。 我想,補救的辦法是,在 OnKeyDown 一開始就檢查 TEdit 的 Text 的最後一個字元是不是數字,如果不是,就把它刪除掉。然後再在 OnKeyUp 裡檢查Text最後一個字元是不是數字,如果不是,也刪除掉。 原理是,按住同一個按鍵不放,就一直產生 OnKeyDown ,OnKeyUp 根本沒有機會消除先前 OnKeyDown 產生的非數字字元,所以就必須在下一個 OnKeyDown 一開始的地方就檢查前一個 OnKeyDown 是否在 Text 的尾巴補上了一個非數字字元,有則刪除之。等使用者完全放開按鍵後,則由 OnKeyUp 來清除最後一個非數字字元,因為 OnKeyDown 不會再發生了。 這樣可以嗎?
elctppo
一般會員


發表:28
回覆:22
積分:10
註冊:2005-04-01

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-04-04 19:07:30 IP:202.175.xxx.xxx 未訂閱
引言: 大家好, 我想不可能把 TEdit 的其中一個字元改為 #0 吧? 因為,如果使用者輸入了 9a99,就應該把 a 踢掉,成為999, 但強行把 a 改為 #0,那麼原本應該是三個字元的字串,卻變成四個字元了。 雖然顯示出來是 999 沒有錯,但如果拿這個字串來跟一堆字串比對,那肯定會產生錯誤結果。 我想,補救的辦法是,在 OnKeyDown 一開始就檢查 TEdit 的 Text 的最後一個字元是不是數字,如果不是,就把它刪除掉。然後再在 OnKeyUp 裡檢查Text最後一個字元是不是數字,如果不是,也刪除掉。 原理是,按住同一個按鍵不放,就一直產生 OnKeyDown ,OnKeyUp 根本沒有機會消除先前 OnKeyDown 產生的非數字字元,所以就必須在下一個 OnKeyDown 一開始的地方就檢查前一個 OnKeyDown 是否在 Text 的尾巴補上了一個非數字字元,有則刪除之。等使用者完全放開按鍵後,則由 OnKeyUp 來清除最後一個非數字字元,因為 OnKeyDown 不會再發生了。 這樣可以嗎?
你好!你所說的問題我已經試過了!沒錯#0的lenght的確是1,但是edit的text所顯示的string,是當觸發key事件,然後把key傳到edit的text,在觸發key事件時用#0,但是key也是存在的,這是你說的lenght會等於1的原因,但是並不會傳到edit的text裏,這點是可以確定的,我已試過了,我在onkeypress事件裏,先把key :=#0;然後showmessge(IntToString(key.lenght)),顯示,然後再看edit.text的lenght卻是0~~~~~~~~~謝謝!
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-04-04 23:57:59 IP:210.201.xxx.xxx 未訂閱
elctpoo, 我也自己試過一次,的確如此,#0 不會被加到 TEdit的 text 裡面。 說明檔好像沒有這樣講,還得自己實驗才能知道結果。
系統時間:2024-05-02 21:29:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!