Советы по Delphi


              

Об модернизации объекта Richedit


Максим Гуменюк пишет:

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

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

  1. я создаю потомка 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.

    Максим Гуменюк, max1gu@fiberia.com [001631]



    Содержание  Назад  Вперед