【原创】修复TRichView在linux不支持中文输入的bug(2026-07-10更新)
2025-11-30:
修正后实则ibus和fcitx这2种输入法都可以正常输入中文。
TRichView在linux同样也存在不支持中文的bug,不过修复方法还是一样,增加输入法事件就可以,修改方法很简单:
打开RVEdit.pas
找到 procedure WMSysChar(var Message: TRVMSysChar); message RVM_SYSCHAR; ,在这行下添加红色代码行:
修正后实则ibus和fcitx这2种输入法都可以正常输入中文。
TRichView在linux同样也存在不支持中文的bug,不过修复方法还是一样,增加输入法事件就可以,修改方法很简单:
打开RVEdit.pas
找到 procedure WMSysChar(var Message: TRVMSysChar); message RVM_SYSCHAR; ,在这行下添加红色代码行:
procedure CMWantSpecialKey(var Message: TCMWantSpecialKey); message CM_WANTSPECIALKEY; procedure WMSysChar(var Message: TRVMSysChar); message RVM_SYSCHAR; {$ifdef LCLGTK2} procedure WMImeComposition (var Message: TLMessage); message LM_IM_COMPOSITION; {$endif} {$IFnDEF RVUNICODEWINDOW} {$IFnDEF USERVTNT_WINDOWHANDLE} procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN; {$ENDIF} procedure WMChar(var Message: TWMChar); message WM_CHAR; {$ENDIF} procedure WMClear(var Message: TRVMessage); message RVM_CLEAR;
在2835行添加以下代码:
{$ifdef LCLGTK2} procedure TCustomRichViewEdit.WMImeComposition (var Message: TLMessage); var IMStr:string; begin if Message.WParam=GTK_IM_FLAG_COMMIT then begin IMStr:=UTF8Decode(pchar(Message.LParam)); //输入的中文字符 if IMStr<>'' then begin InsertTextW(IMStr, False); end; end; inherited; end; {$endif}
2026-07-10更新:
修复第1次打开IDE,调出输入法,光标点好,敲出汉字,按空格键,会发现,字没上到光标的位置,什么也没有,之后,再输入再空格键,就可以了。
{$ifdef LCLGTK2} procedure TCustomRichViewEdit.WMImeComposition(var Message: TMessage); var IMStr: UTF8String; NeedFormat: Boolean; begin // 处理提交消息 if (Message.WParam = GTK_IM_FLAG_COMMIT) then begin // 释放鼠标捕获,避免首次 BeforeChange 被拒绝 if MouseCapture then MouseCapture := False; if BeforeChange(False) then begin IMStr := UTF8String(Pointer(Message.LParam)); if IMStr <> '' then begin InsertTextW(UTF8Decode(IMStr)); // 如果包含换行符,需要重新布局;否则仅刷新 NeedFormat := (Pos(#13, string(IMStr)) > 0) or (Pos(#10, string(IMStr)) > 0); if NeedFormat then Format else Invalidate; Message.Result := 1; end; end else begin // 若 BeforeChange 拒绝,调用 inherited 保证消息继续传递 inherited; end; end else if Message.WParam = GTK_IM_FLAG_PREEDIT then begin // 预编辑消息:告知系统已处理(GTK2 自动管理位置) Message.Result := 1; end else inherited; end; {$endif}
最后重新编译就可以输入中文了:


浙公网安备 33010602011771号