小学一年级读后感范文: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;