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



Автор: Максим Гуменюк

Заходит негр в компьютерную фирму и говорит:
- Здравствуйте, я ищу работу. У меня степень доктора наук по компьютерам.
Ему отвечают:
- Хорошо, мы вас возьмем. Для начала мы дадим вам 100 тысяч долларов в год, мы же вас пока плохо знаем. Согласны?
- Согласен.
- Да, мы вам дадим автомобиль, но покамест только "опель", потом что-нибудь лучше дадим. Согласны?
- Согласен.
- И еще мы вам дадим квартиру в хорошем районе, но пока только однокомнатную. Вас это устраивает?
Тут негр не выдерживает:
- Послушайте! Вы что, надо мной прикалываетесь?!
- Но ты же первый начал.

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

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

  1. я создаю потомка Richedit:
    • меню Component\New Component
    • указываю предком TRichedit
  2. Переписаю обработку события WM_INPUTLANGCHANGE, при этом я не вызываю обработчик предка, т.е. Richedit-а
  3. Заодно обрабатываю событие 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.


Далее: Возвращать сообщения на родном языке компьютера »»