Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

TRichEdit сам меняет язык при перемещении

01.01.2007
Самое главное, что мне не нравится в Richedit - это то, что он сам меняет язык при перемещении по тексту, не смотря, что вы включили нужный язык, при переходе на участок текста, набраный другим языком.

этот баг я обхожу так.

я создаю потомка Richedit:

меню Component\New Component

указываю предком TRichedit

Переписаю обработку события WM_INPUTLANGCHANGE, при этом я не вызываю обработчик предка, т.е. Richedit-а

Заодно обрабатываю событие WM_INPUTLANGCHANGEREQUEST, которое сообщает, что пользователь изменил язык. Тут надо вызвать обработчик предка, а то не будет переключаться язык.

Вот что из этого получилось. Имеем исправленный компонент VCL с дополнительным событием.

unit RichEditEx;
 
interface
 
uses
 
 
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 
StdCtrls, ComCtrls;
 
type
 
TLangChangeEvent = procedure(Sender: TObject; Lang: HKL) of object;
 
 
TRichEditEx = class(TRichEdit)
 
private
   
FOnLangChange: TLangChangeEvent;
    procedure
WMLangRequest(var M: TMessage); message WM_INPUTLANGCHANGEREQUEST;
    procedure
WMLangChange(var M: TMessage); message WM_INPUTLANGCHANGE;
 
   
{ Private declarations }
 
protected
   
{ Protected declarations }
 
public
   
{ Public declarations }
  published
    property
OnLangChange: TLangChangeEvent read FOnLangChange write
     
FOnLangChange;
 
   
{ Published declarations }
 
end;
 
procedure
Register;
 
implementation
 
procedure tricheditex
.WMLangRequest(var M: TMessage);
begin
 
if assigned(FOnLangChange) then
   
FOnLangChange(self, m.LParam);
  inherited
;
end;
 
procedure tricheditex
.WMLangChange(var M: TMessage);
begin
  m
.Result := 1;
end;
 
procedure
Register;
begin
 
RegisterComponents('Samples', [TRichEditEx]);
end;
 
end.

https://delphiworld.narod.ru/

DelphiWorld 6.0