Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
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.

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay