Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  4 844

•  TDictionary Custom Sort  6 830

•  Fast Watermark Sources  6 610

•  3D Designer  9 576

•  Sik Screen Capture  6 952

•  Patch Maker  7 398

•  Айболит (remote control)  7 347

•  ListBox Drag & Drop  6 206

•  Доска для игры Реверси  98 221

•  Графические эффекты  7 519

•  Рисование по маске  6 804

•  Перетаскивание изображений  5 656

•  Canvas Drawing  6 035

•  Рисование Луны  5 830

•  Поворот изображения  5 276

•  Рисование стержней  3 869

•  Paint on Shape  3 023

•  Генератор кроссвордов  3 982

•  Головоломка Paletto  3 156

•  Теорема Монжа об окружностях  3 998

•  Пазл Numbrix  2 636

•  Заборы и коммивояжеры  3 451

•  Игра HIP  2 365

•  Игра Go (Го)  2 284

•  Симулятор лифта  2 679

•  Программа укладки плитки  2 242

•  Генератор лабиринта  2 799

•  Проверка числового ввода  2 401

•  HEX View  2 744

•  Физический маятник  2 432

 
скрыть

Delphi Sources

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.