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

关于检测只限制录入数字的问题

答題得分者是:Stallion
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-05-15 15:43:54 IP:222.184.xxx.xxx 訂閱
procedure form.EditKeyPress(Sender: TObject; var Key: Char);
begin
if not (key in['0'..'9',#13,#8,#46]) then
begin
key:=#0;
MessageBeep(1);
Application.MessageBox('请输入数字!','提示',MB_OK);
end ;
如果输入的是字母,那么会提示一次“请输入数字”如果不小心没关系输入法,录了一个中文,那么提示两次请输入数字,有时提示三到四次,不懂如何完美解决。
------
我的编程起步于ktop,我将永远支持ktop
wpf
一般會員


發表:11
回覆:22
積分:6
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-05-15 16:25:44 IP:210.76.xxx.xxx 未訂閱
把edit 的输入法关闭,有属性设置的,ime xxxx 什么的,看一下就知道了
adonis
高階會員


發表:140
回覆:258
積分:159
註冊:2002-04-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-05-15 16:26:42 IP:210.201.xxx.xxx 訂閱
ntjrr,您好
個人認為 if not (key in['0'..'9',#13,#8,#46])? then key:=#0; 就好了
至於訊息的顯示改以用 Hint 的方式 ~~

你出現的問題在於 OnKeyPress 會很忠誠的對所輸入的字元作事件上的觸發,當輸入英文字母的時候僅對該字元作觸發,但若輸入中文時,因中文的組成並非單一字元,所以會依據當下收到多少個字元就會觸發多少次,所以才建議上述的作法。
當然,或許還有更好的解決之道。

我也在努力學習中,若有錯謬請見諒 ~

===================引 用 ntjrr 文 章===================
procedure form.EditKeyPress(Sender: TObject; var Key: Char);
begin
if not (key in['0'..'9',#13,#8,#46])? then
begin
key:=#0;
MessageBeep(1);
Application.MessageBox('请输入数字!','提示',MB_OK);
end ;
如果输入的是字母,那么会提示一次“请输入数字”如果不小心没关系输入法,录了一个中文,那么提示两次请输入数字,有时提示三到四次,不懂如何完美解决。
------
我也在努力學習中,若有錯謬請見諒。
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-05-15 17:34:57 IP:222.184.xxx.xxx 訂閱
要不就干脆搞那个IME属性设置上一劳永逸的方法吧,IMopen的方法我知道,但关键之处就是在于imename的取得,大多数做法是列取当前输入法,然后让用户选择一个,这里面有几个问题,是每次登录时都要取,还是就取一次。就取一次的话在多用户操作时各自有各自喜欢的输入法如何处理?我的想法是在每个窗口中用个变量记下当前的输入法,但又不懂第一次在哪个事件中记录为好,如何记得到?谢谢!
------
我的编程起步于ktop,我将永远支持ktop
編輯記錄
ntjrr 重新編輯於 2007-05-15 17:36:17, 註解 無‧
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-05-15 20:16:42 IP:211.22.xxx.xxx 未訂閱
我在我的機器上測試OK~不知道你的環境可否?試試吧!
<textarea cols="60" rows="10" class="delphi" name="code"> procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); var Msg:TMsg; begin if not (key in['0'..'9',#13,#8,#46]) then begin key:=#0; While Windows.PeekMessage(Msg,Self.Edit1.Handle,WM_KEYFIRST,WM_KEYLAST,PM_REMOVE) do key:=#0; MessageBeep(1); Application.MessageBox('number only','hint',MB_OK); end; end; </textarea>
編輯記錄
Stallion 重新編輯於 2007-05-15 20:28:53, 註解 無‧
Stallion 重新編輯於 2007-05-15 20:31:28, 註解 無‧
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-05-15 20:55:07 IP:222.184.xxx.xxx 訂閱
前辈,我的电脑也成功的。我想麻烦前辈简单的说明一下代码实现的原理,还有那个key:=#0为什么要出现两次?谢谢!
------
我的编程起步于ktop,我将永远支持ktop
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-05-15 21:06:29 IP:211.22.xxx.xxx 未訂閱
PeekMessage是WINAPI也就是直接從應用程式的訊息佇列(Applicaton que)存取訊息後存入TMsg的結構中。
參數 WM_KEYFIRST 及 WM_KEYLAST 常數用來取出鍵盤緩衝的所有訊息,因此在發生KeyPress後如果Key值不是所要的值就將鍵盤緩衝區清乾淨。
另外多加一個Key := #0的原因是為確保Winapi將緩衝清乾淨多加上的。
編輯記錄
Stallion 重新編輯於 2007-05-15 21:14:05, 註解 改錯字!‧
Stallion 重新編輯於 2007-05-15 22:20:45, 註解 再改錯字~@@‧
系統時間:2024-06-26 22:37:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!