Самое главное, что мне не нравится в 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.
|
|