关于检测只限制录入数字的问题 |
答題得分者是:Stallion
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
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 發送簡訊給我 |
|
adonis
高階會員 發表:140 回覆:258 積分:159 註冊:2002-04-15 發送簡訊給我 |
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 發送簡訊給我 |
要不就干脆搞那个IME属性设置上一劳永逸的方法吧,IMopen的方法我知道,但关键之处就是在于imename的取得,大多数做法是列取当前输入法,然后让用户选择一个,这里面有几个问题,是每次登录时都要取,还是就取一次。就取一次的话在多用户操作时各自有各自喜欢的输入法如何处理?我的想法是在每个窗口中用个变量记下当前的输入法,但又不懂第一次在哪个事件中记录为好,如何记得到?谢谢!
------
我的编程起步于ktop,我将永远支持ktop
編輯記錄
ntjrr 重新編輯於 2007-05-15 17:36:17, 註解 無‧
|
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
我在我的機器上測試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> |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
PeekMessage是WINAPI也就是直接從應用程式的訊息佇列(Applicaton que)存取訊息後存入TMsg的結構中。
參數 WM_KEYFIRST 及 WM_KEYLAST 常數用來取出鍵盤緩衝的所有訊息,因此在發生KeyPress後如果Key值不是所要的值就將鍵盤緩衝區清乾淨。 另外多加一個Key := #0的原因是為確保Winapi將緩衝清乾淨多加上的。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |