lazarus使用DBGridEh控件开发的应用软件在linux运行时发现不能输入中文,经多日研读DBGridEH源码后,发现dbgrideh不响应中文输入法,结合之前处理lazarus中文输入的经验,尝试在GirdsEh.pas的TInplaceEditCoreControl
添加输入法的消息处理 procedure WMImeComposition (var Message: TMessage); message LM_IM_COMPOSITION,增加输入法消息处理,并在GirdsEh.pas添加Gtk2Globals单元,重新编译ehlib及相关应用,这时DBGridEh已可以中文输入问题,这个方法是可行的,如果你有更好的办法也请与我分享,谢谢。
2024-08-30 网友海发现我编译的程序中文输入正常,但他按我的方法修复后还是有问题,经多次远程调试,发现他的linux版本没修复中文输入的Bug,按修复lazarus在linux搜狗词组只能输入第一个字的Bug(2024-08-09更新)这里的修改后就可以正常输入中文了。
2023-7-10修复littley发现的Bug
2024-0604 修复在lazarus 3.2(3.4)+fpc 3.2.2还是不能输入的问题
将
IMStr:=UTF8Decode(pchar(Message.LParam)); //输入的字符
改为:
IMStr:=im_context_string; if ord(imstr[1])<$80 then IMStr:='';
修改后就能输入中文。
测试环境:
开发工具:lazarus 3.3.0 FPC 3.3.1
操作系统:linux(银河麒麟和统信专业版)
CPU:arm64和龙芯3a5000
Ehlib:源码版
interface
uses SysUtils, Classes,
{$IFDEF EH_LIB_17} System.UITypes, {$ENDIF}
{$IFDEF FPC}
{$IFDEF FPC_CROSSP}
{$ELSE}
Windows, UxTheme, Win32Extra,
{$ENDIF}
EhLibLCL, LMessages, LCLType, Maskedit, LCLIntf, LCLProc, LazUTF8,
{$ELSE}
EhLibVCL, Mask, Windows, UxTheme,
{$ENDIF}
{$ifdef linux}
Gtk2Globals,//添加这个单元
{$endif}
Messages, Graphics, Menus, Controls, Forms, StdCtrls, Imglist,
Types, Themes, GridToolCtrlsEh, ToolCtrlsEh,
Dialogs, ExtCtrls, Contnrs;
TInplaceEditCoreControl = class(TCustomMaskEdit) private FParentEdit: TInplaceEdit; function GetGrid: TCustomGridEh; procedure WMGetDlgCode(var Message: TWMNoParams); message WM_GETDLGCODE; procedure WMKillFocus(var Msg: TWMKillFocus); message WM_KILLFOCUS; procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS; procedure WMPaste(var Message: TMessage); message WM_PASTE; procedure WMCut(var Message: TMessage); message WM_CUT; procedure WMClear(var Message: TMessage); message WM_CLEAR; procedure WMImeComposition (var Message: TMessage); message LM_IM_COMPOSITION; protected function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; override; function EditCanModify: Boolean; override;
procedure TInplaceEditCoreControl.WMImeComposition (var Message: TMessage);//输入法消息 var IMStr,s1,s2:string; i:integer; pos:TPoint; begin if Message.WParam=GTK_IM_FLAG_COMMIT then begin IMStr:=UTF8Decode(pchar(Message.LParam)); //输入的字符 if IMStr<>'' then begin KeyPress(IMStr[1]); pos.X:=GetSelStart+GetSelLength+utf8length(imstr);//计算添加字符串后的光标位置 pos.Y:=0; s1:=utf8copy(Edittext,1,GetSelStart); s2:=utf8copy(editText,GetSelStart+GetSelLength+1,length(edittext)); EditText:= s1+IMStr+s2; SetCaretPos(pos);//设置光标位置 end; end; im_context_use:=false; inherited; end;
按上面的方法修改后,重新安装ehlib就可以在linux输入中文。
存在问题:
使用搜狗输入法时可能第一次不能输入中文,再次输入就可以,其他输入法无此问题,如果那位有更好的方法请与我分享,谢谢!