DBGrid 失去焦点时输入法问题的最终解决方案 ( 积分: 0 )

  • 主题发起人 主题发起人 凤冠坡
  • 开始时间 开始时间

凤冠坡

Unregistered / Unconfirmed
GUEST, unregistred user!
很多人提出了这个问题,就是在一个窗口里,有许多控件包括 DBGrid(EH),当焦点从
DBGrid(EH)移走时,输入法就会变成系统默认的输入法,这个问题的根源就在 DBGrid(EH)的 WMKillFocus 方法的那段程序,只要稍作修改:
procedure TCustomDBGridEh.WMKillFocus(var Message: TMessage);
.......................
if not SysLocale.FarEast
then inherited
else begin
ImeName := Screen.DefaultIme;
ImeMode := imDontCare;
inherited;
// 关键地方:去掉下面2行就可以了
// if not ((InplaceEditor <> nil) and (HWND(Message.WParam)
// = InplaceEditor.Handle))
// then ActivateKeyboardLayout(Screen.DefaultKbLayout, KLF_ACTIVATE);
end;
...................
 
很多人提出了这个问题,就是在一个窗口里,有许多控件包括 DBGrid(EH),当焦点从
DBGrid(EH)移走时,输入法就会变成系统默认的输入法,这个问题的根源就在 DBGrid(EH)的 WMKillFocus 方法的那段程序,只要稍作修改:
procedure TCustomDBGridEh.WMKillFocus(var Message: TMessage);
.......................
if not SysLocale.FarEast
then inherited
else begin
ImeName := Screen.DefaultIme;
ImeMode := imDontCare;
inherited;
// 关键地方:去掉下面2行就可以了
// if not ((InplaceEditor <> nil) and (HWND(Message.WParam)
// = InplaceEditor.Handle))
// then ActivateKeyboardLayout(Screen.DefaultKbLayout, KLF_ACTIVATE);
end;
...................
 
请问这个函数在哪?
 
// if not ((InplaceEditor <> nil) and (HWND(Message.WParam)
// = InplaceEditor.Handle))
// then ActivateKeyboardLayout(Screen.DefaultKbLayout, KLF_ACTIVATE);
能解释一下么?看不懂的说
 
不行,我试过了,除非修改DBGrid.pas,但不知如何编译DBGrid,令它起作用
 
是不是把DBGrid.pas修改完了保存就行了呢?

下面有个关于编译的方法
控件安装
1、对于单个控件,Componet-->Install Component..-->PAS或DCU文件-->Install;
2、对于带*.dpk文件的控件包,File-->Open(下拉列表框中选*.dpk)-->Install即可;
3、对于带*.bpl文件的控件包,Install Packages-->Add-->bpl文件名即可;
4、如果以上Install按钮为失效的话,试试Compile按钮;
5、是Run Time Lib则在Option下的Packages下的RunTimePackes加之。
如果编译时提示文件找不到的话,一般是控件的安装目录不在Delphi的Lib目录中,有两种方法可以解决:
1、反安装的源文件拷入到Delphi的Lib目录下;
2、或者Tools-->Environment Options中把控件源代码路径加入到Delphi的Lib目录中。
注意:所安装的控件是否与你所用的Delphi版本相适应。

控件删除
在Component/Install Packages中删除。
选Component/Configure Palette…
有Pages和Components两个区域
双击Components区域,选中要删除的控件,下面有Delete按钮
但系统提供的控件只能Hide,不能Delete。
打开控件所在的包文件(*.dpk),从中删除控件那个文件,再重新编译该包。
如果是整个控件包都要删除的话,Project->Option->Packages,删掉那个Packages即可。

没试呢 一会试试
 
这个函数在 DBGrid 控件文件 DBGridS.PAS 里面,
需要编译该单元,把生成的 DBGrids.DCU 复制到 Delphi/lib 目录

使用 DBGridEH 的,直接修改那个 DBGridEH.Pas 就可以了
 
TO: kunkun571:
这个函数就是:满足条件的话就激活当前的输入法
 
有谁试过成功吗,俺的DBGridEh不行,Ehlib 3.04版
 
to ZYYCC:

需要的话我把 DBGridEH 3.5 发送给你(For Delphi 6.0)
 
还需要修改
procedure TDBGridInplaceEdit.WMKillFocus(var Message: TWMKillFocus);
去掉
if HWND(Message.FocusedWnd) <> Grid.Handle then
ActivateKeyboardLayout(Screen.DefaultKbLayout, KLF_ACTIVATE);
否则进入编辑状态之后再离开输入法还会变化.
 
接受答案了.
 
凤冠坡:
你好!我用的是EH 3.6按您的方法改过后还是不行!我的问题是在同一个dbgridEh中同col(同列)中换行没问题,在不同列中,如焦点在第1列,变换输入法,用鼠标点击第2列,输入法就回去了,困扰多时,望老兄搭救!!! Email: hb-zgh@163.com
 
后退
顶部