偿试修复DBGridEh在linux不能输入中文的Bug

发布时间 2023-06-28 11:15:19作者: 秋·风
在linux使用DBGridEh时发现不能输入中文,参考之前修复lazarus不能在linux输入中文的经验,只需在GirdsEh.pas添加输入法的消息处理(
 procedure WMImeComposition (var Message: TMessage); message LM_IM_COMPOSITION
)就可以解决中文输入问题。
  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
  IMStr:=UTF8Decode(pchar(Message.LParam)); //输入的字符
  if IMStr<>'' then
  begin
    for i:=1 to Length(IMStr) do
    begin
      KeyPress(IMStr[i]);
    end;
    pos.X:=GetSelStart+GetSelLength+utf8length(imstr);//计算添加字符串后的光标位置
    pos.Y:=0;
    s1:=utf8copy(Edittext,1,GetSelStart);
    //GetSelStart--当前光标位置, GetSelLength--选择字符的长度
    s2:=utf8copy(editText,GetSelStart+GetSelLength+1,length(edittext));
    EditText:= s1+IMStr+s2;
    SetCaretPos(pos);//设置光标位置
  end;
  inherited;
end;

按上面的方法修改后,重新安装ehlib就可以在linux输入中文。

开发工具:lazarus 3.3.0 FPC 3.3.1
操作系统:linux
存在问题:
可能第一次不能输入中文,再次输入就可以,如果那位有更好的方法请与我分享,谢谢!