DBGridEh的输入法切换问题,高分求解(200)。(200分)

  • 主题发起人 主题发起人 danng
  • 开始时间 开始时间
D

danng

Unregistered / Unconfirmed
GUEST, unregistred user!
最近遇到一个小问题,我用DBGridEh做为数据的输入Grid,用户在输入数据的过程中,有检测数据的合法性一项,如果不符要求,弹出一个对话框来提示。但当用户点击确认焦点回到Grid后,之前在Grid中设置的输入法立马自动切换成了默认的英文输入法了,用户是不希望它自动切换的,不知能有什么好方法可以使输入法不切换。
虽然我写程序做了控制,在弹出来的对话框确认后再切换成原来的输入法,在我们的电脑上测试也获得成功,但在少数电脑上在弹出对话框回到Grid后,输入法还是自动切到了英文输入法。
我把我的方法贴出来,希望遇到过此问题来讨论一下。
procedure Tbi_OrderEnterfrm.GrdMainColExit(Sender: TObject);
var
lsSubText,lsErr:string;
liCount:Integer;
myHKL: HKL;
begin
inherited;
myHKL:=GetKeyBoardLayOut(0);//取得当前键盘输入法
try
//业务处理代码
finally
ActivateKeyBoardLayOut(myHKL,KLF_ACTIVATE);//激活键盘输入法
end;
end;
 
试试下面的代码:
// --------------------------------------------------
// 切换到指定的输入法
//
// SetActivateIme('CHAJEI.IME');
==> 切换到仓额输入法
// SetActivateIme('Phon.ime');
==> 切换到注音输入法
// 传入空字符串时, 切换到英数输入法
// --------------------------------------------------
function SetActivateIme(sWanted: string): boolean;
var
iHandleCount : integer;
pList : array[1..nHKL_LIST] of HKL;
szImeFileName : array[0..MAX_PATH] of char;
sImeFileName : string;
bInstalled : boolean;
i : integer;
begin
Result := False;
sWanted := AnsiUpperCase(sWanted);
// 传入空字符串, 切成英数输入模式
if Length(sWanted) = 0 then
begin
ToChinese(0, False);
Result := True;
Exit;
end;
// 看看是否安装了这个输入法
bInstalled := False;
iHandleCount := GetKeyboardLayoutList(nHKL_LIST, pList);
for i := 1 to iHandleCountdo
begin
ImmGetIMEFileName(pList, szImeFileName, MAX_PATH);
sImeFileName := AnsiUpperCase(StrPas(szImeFileName));
if sImeFileName = sWanted then
begin
bInstalled := True;
Break;
end;
end;
// 如果这个输入法已安装了, 让那个输入法的键盘分布(KeyLayout)作用
if bInstalled then
begin
ActivateKeyboardLayout(pList, 0);
Result := True;
end;
end;
{ of SetActivateIme }
// --------------------------------------------------
// 侦测目前作用中的输入法文件名称
// 传回值为空字符串时, 表示英数输入模式
//
// --------------------------------------------------
function GetImeFileName: string;
var
szImeFileName : array[0..MAX_PATH] of char;
begin
if ImmGetIMEFileName(GetKeyboardLayout(0), szImeFileName, MAX_PATH) <> 0 then
Result := AnsiUpperCase(StrPas(szImeFileName))
else
Result := '';
end;

// --------------------------------------------------
// 切换成中文输入法, 并且指定使用半/全角输入模式
// 传回值: True: 成功 / False 切换失败
// 使用示例: ImeFullShape(Form1.Handle, True);
// 全角
// ImeFullShape(Form1.Handle, False);
// 半角
// --------------------------------------------------
(*
这个函数也可以用以下的方式来作作看:
if not ImmIsIME(GetKeyboardLayout(0)) then
ImmSimulateHotKey(hWindow, IME_THOTKEY_IME_NONIME_TOGGLE);
Application.ProcessMessages;
ImmSimulateHotKey(hWindow, IME_THOTKEY_SHAPE_TOGGLE);
*)
function ImeFullShape(hWindow: HWND;
bToFullShape: BOOL): BOOL;
var
hic : HIMC;
Conversion, Sentence: DWORD;
msgPeekResult : TMsg;
begin
Result := False;
if hWindow = 0 then
hWindow := GetFocus;
if hWindow = 0 then
Exit;
// 切换成中文输入法
if not ImmIsIME(GetKeyboardLayout(0)) then
ImmSimulateHotKey(hWindow, IME_THOTKEY_IME_NONIME_TOGGLE);
while PeekMessage(msgPeekResult, hWindow, 0, 0, PM_REMOVE)do
begin
TranslateMessage(msgPeekResult);
DispatchMessage(msgPeekResult);
end;
// 转换成半/全角输入模式
hic := ImmGetContext(hWindow);
if hIC = 0 then
Exit;
try
if not ImmGetConversionStatus(hIc, Conversion, Sentence) then
Exit;
if bToFullShape then
Conversion := Conversion or IME_CMODE_FULLSHAPE
else
Conversion := Conversion and (not IME_CMODE_FULLSHAPE);
if not ImmSetConversionStatus(hic, Conversion, Sentence) then
Exit;
Result := True;
finally
ImmReleaseContext(hWindow, hic);
end;
end;
{ of ImeFullShape }
 
还有没有更好的做法
 
行或不行啊?
 
还有没有其它的做法?
 
后退
顶部