如何遮蔽漢字輸入

2021-09-05 19:59:53 字數 3966 閱讀 5921

如何遮蔽漢字輸入 vcl元件開發及應用

請問有沒有方法使tedit不能輸入漢字.或者選中該tedit的時候就filter輸入法.

//包括貼上也會過濾掉  

procedure   tform1.edit1change(sender:   tobject);  

var  

s:   widestring;  

i,   j:   integer;  

vselstart:   integer;  

begin  

vselstart   :=   tedit(sender).selstart;  

s   :=   tedit(sender).text;  

j   :=   0;  

for   i   :=   length(s)   downto   1   do  

if   length(string(s[i]))   >=   2   then  

begin  

if   vselstart   <=   length(string(copy(s,   1,   i)))   then   inc(j,   2);  

delete(s,   i,   1);  

end;  

tedit(sender).text   :=   s;  

tedit(sender).selstart   :=   vselstart   -   j;  

end;

謝謝zswang.  

因為工作緣故這幾天才學delphie的,以前都是用c.對tedit(sender)不是很明白.  

是暫時產生乙個物件嗎?>?還是就是被觸發事件的tedit.把s宣告為wstring這樣對其操作的函式(如delete)不用改變成支援wstring的函式嗎?  

其實我是這麼想的.用c的話.只要editchange事件觸發,判斷新加上去的字元是否是乙個位元組大小就行了,因為數字和字母都是乙個位元組.(你覺得怎麼樣)  

sender就是事件的觸發者  

即:就是被觸發事件的tedit  

tedit(sender)相當於c裡的(tedit   *)sender  

其實就是vselstart   :=   edit1.selstart;  

這樣做法更通用一些,不受控件名的限制  

length()、delete()會判斷引數中的字串型別  

for   i   :=   length(s)   downto   1   do  

if   s[i]   >   #255   then   //   這樣判斷更簡潔一些  

begin  

if   vselstart   <=   length(string(copy(s,   1,   i)))   then   inc(j,   2);  

delete(s,   i,   1);  

end;  

太麻煩了,判斷你的輸入框裡是否是漢字,可以利用,字串型別,string和widestring的佔位,1個是1個位元組為單位的,1個是2個位元組為單位的  

function   checkinputstrischinese(var   s:string):boolean;  

var  

str:widestring;  

begin  

str:=s;  

if   length(str)=2*length(s)   then  

result:=false     //沒有漢字  

else   result:=true;   //有了!   

end;

用string和widestring獲得的length值是否相同可以判斷出text中是否有全形字符,並不能保證只要不符就是有漢字(全形的,   。日本字,南韓字)。  

但是每字檢查ascii碼的範圍就可以確切判斷是否漢子,但是稍微顯得效率不高。  

mark

謝謝   zswang   ,也謝謝其他幾位覺   得zswang   的蠻好的.  

winxkm   中的判斷:if   length(str)=2*length(s)   then應該不能滿足我的要求.至少用貼上的話不行.  

我結貼.

如果明天大家都沒有什麼新的想法,我就結貼了!謝謝

type  

tform1   =   class(tform)  

edit1:   tedit;  

procedure   formcreate(sender:   tobject);  

private  

oldwndproc:   twndmethod;  

procedure   editwndproc(var   message:   tmessage);  

public  

end;  

var  

form1:   tform1;  

implementation  

procedure   tform1.editwndproc(var   message:   tmessage);  

var  

ch:   word;  

begin  

if   (message.msg   =   wm_paste)   or   (message.msg   =   wm_cut)  

or   ((message.msg   =   wm_char)   and   (message.wparam   >   127))   then    

exit;  

oldwndproc(message);  

end;  

procedure   tform1.formcreate(sender:   tobject);  

begin  

oldwndproc   :=   edit1.windowproc;  

edit1.windowproc   :=   editwndproc;  

end;  

type  

tform1   =   class(tform)  

edit1:   tedit;  

procedure   formcreate(sender:   tobject);  

private  

oldwndproc:   twndmethod;  

procedure   editwndproc(var   message:   tmessage);  

public  

end;  

var  

form1:   tform1;  

implementation  

procedure   tform1.editwndproc(var   message:   tmessage);  

begin  

if   (message.msg   =   wm_paste)   or   (message.msg   =   wm_cut)  

or   ((message.msg   =   wm_char)   and   (message.wparam   >   127))   then    

exit;  

oldwndproc(message);  

end;  

procedure   tform1.formcreate(sender:   tobject);  

begin  

oldwndproc   :=   edit1.windowproc;  

edit1.windowproc   :=   editwndproc;  

end;  

真不錯.maozefa(阿發伯)子類化視窗過程,我就是用c做window程式設計的.  

分不夠發了.大家委屈點吧.

關於漢字輸入聯想

首先,是資料來源,我用的是乙個excel表 然後可以把錶存在資料庫裡面,或者存在記憶體上面 我把excel匯入到記憶體轉化成table 然後用linq語句查詢匹配的輸入拼音 最後,輸出前五個,備選 如下 string path environment.currentdirectory path d ...

漢字輸入碼和內碼

包括 數字碼 拼音碼 字形碼 1.數字輸入碼 常用的是國標區位碼,用數字串代表漢字 將6763個二級漢字分為94個區,每區94位,把漢字表示成二維陣列,陣列下標就是區位碼。優點 無重碼,輸入碼與內部碼的轉換方便 缺點 難以記憶。2.拼音輸入碼 以漢字拼音為基礎的輸入方法 優點 簡單方便 缺點 同音字...

Windows中漢字輸入方式的啟動和漢字輸入方法

在安裝windows時,系統已經將常用的漢字輸入法安裝好了,並在桌面底部右邊顯示語言欄。語言欄是乙個浮動的工具條,單擊語言欄上表示語言的按鈕或表示鍵盤的按鈕,開啟如圖所示的輸入法列表,在列表中選擇需要的輸入法即可切換到該輸入法。當切換到某種漢字輸入法時,視窗中會出現相應的輸入法狀態框,可以用滑鼠單擊...