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

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

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

меню Component\New Component

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

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

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

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

 

 

Code:

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.

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить