秋·风

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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输入中文。
存在问题:

使用搜狗输入法时可能第一次不能输入中文,再次输入就可以,其他输入法无此问题,如果那位有更好的方法请与我分享,谢谢!

posted on 2023-06-28 11:10  秋·风  阅读(517)  评论(11编辑  收藏  举报