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