小学一年级读后感范文:DBGrid中失去焦点后输入法改变 .

来源:百度文库 编辑:中财网 时间:2024/05/05 00:09:59

有人反映程序中DBGrid切换焦点时中文输入法会自动换成英文状态(自动关闭原输入法),参考网上查得的资料并更正了网上源码http://hi.baidu.com/xmhelp/blog/item/82928e9438da78017af48025.html 的不足,得到如下解决办法:  

 

原理:

    当焦点从TDBGrid移出来的时候,TDBGrid会关闭当前打开的输入法。所以算法要点是记忆上一次的输入法,经试验,可以在非Grid控件焦点切换至DBGrid控件事件,以及DBGRID自身的格输入控件切换事件时记忆最后一次使用过的输入法, 然后在跳转焦点后设置新焦点控件的输入法。 经过测试,已可达到让输入法不自动关闭。 唯一不足之处是,如果在Grid的某数据格切换输入法后不进行数据输入,则没有记忆最后一次输入法,当跳至别控件时不能自动还原上次切换的输入法。

 

解决办法:
 1、为整个项目建立一个窗体类,比如:TAbstractForm
 2、重载 TAbstractForm 的 SetFocusedControl 函数,记住和打开输入法。
 3、将项目的所有Form改成继续TAbstractForm。

 

TAbstractForm代码如下:

 

type
TAbstractForm = class(TForm)
    DBGrid1: TDBGrid;
private
    FLastKeyboardLayout : HKL;
    { Private declarations }
public
    function SetFocusedControl(Control: TWinControl): boolean; override;
    { Public declarations }
end;

var
AbstractForm: TAbstractForm;

implementation

{$R *.dfm}

function TAbstractForm.SetFocusedControl(Control: TWinControl): boolean;
// 因为焦点从TDBGrid移出的时候会关掉输入法的,所以先记住进入TDBGrid之前的输入法。
// 等从TDBGrid移出的时候重新打开之前的输入法。
var
 FLastActiveControl: TWinControl;
begin
 FLastActiveControl := Screen.ActiveControl;

 

  //处理非grid控件跳至Grid控件时,修改全局输入法变量 
 if (FLastActiveControl <> nil) and not (FLastActiveControl is TCustomGrid) then
  FLastKeyboardLayout := GetKeyboardLayout(0);

  //处理grid自已内部的格对象焦点切换时的处理事件,修改全局输入法变量

   if FLastActiveControl <> nil then
    if FLastActiveControl = Control then
      FLastKeyboardLayout := GetKeyboardLayout(0);

 

 Result := inherited SetFocusedControl(Control); 

 if (Result) and (Screen.ActiveControl = Control) and (FLastActiveControl <> nil) then
  ActivateKeyboardLayout(FLastKeyboardLayout, KLF_ACTIVATE);
end;