Конференция "Компоненты" » Странное наследника TCustomMaskEdit со стилем ES_MULTILINE
 
  • Дмитрий Тимохов (05.05.11 18:15) [0]
    Добрый день!

    1. СИТУАЦИЯ
    Мне понадобилось создать потомка TCustomMaskEdit, но со стилем ES_MULTILINE.

    Данный стиль - это единственная (судя по MSDN) созможность заставить класс EDIT (а именно на основе этого класса windows сделан TCustomMaskEdit, см. TCustomEdit.CreateParams) работать так, чтобы только часть едита была под текст, а не вся область (т.е. чтобы можно было едиту слать EM_SETRECTNP и EM_SCROLLCARET - см. подробнее в grids.pas - я свое время писал по мотивам этого модуля).

    Мне нужна непрорисовываемая область для того, чтобы там самому нарисовать кнопочку для внешнего редактора (маленькая кнопочка с тремя точками при нажатии на которую вызывается диалоговое окошко).

    Одним словом, мне нужно:
    а. Чтобы была маска ввода.
    б. И была кнопочка для внешнего редактора.

    2. ПРОБЛЕМЫ
    Проблемы заключаются в том, что неверно происходит позиционирование при клике мыши на моем новом едите.
    Кликаешь на первый символ, а позиционирование происходит на +3 символа.

    Вот ссылка на архив с простейшим http://exchange.vkkb.ru/_tda/MaskEditError.zip

    Как поставить:
    а. Из папки Package скомпилировать и установить пакет Package1.dpk. Добавить закладка "Timokhov" с компонентом TMaskEdit.
    б. Из папки Project скомпилировать и запустить  Project1.dproj

    Как увидеть ошибку:
    а. При старте программы фокус будет на TEdit1.
    б. Кликните мышкой на второе поле ввода на первом символе.
    Ожидаемый результат: выделен первый символ.
    Фактический результат: выделен четвертый символ.

    Помогите, пожалуйста, справиться с проблемой!

    (дельфи 2007, XP sp 3)
  • DimaBr © (06.05.11 02:22) [1]

    type
     TMyButtonEdit = class(TCustomMaskEdit)
     private
       FButton: TSpeedButton;
       procedure WMSize(var Msg: TWMSize); message WM_SIZE;
       procedure WMSetCursor(var Msg: TWMSetCursor); message WM_SETCURSOR;
       procedure SetEditRect;
     protected
       procedure CreateParams(var Params: TCreateParams);override;
     public
       constructor Create(AOwner: TComponent); override;
       property EditMask;
     end;

    constructor TMyButtonEdit.Create(AOwner: TComponent);
    begin
     inherited Create(AOwner);
     Height := 21;
     Width := 121;
     FButton := TSpeedButton.Create(Self);
     ParentBackground := False;
     with FButton do begin
       Parent := Self;
       Align := alRight;
       Width := 18;
     end;
    end;

    procedure TMyButtonEdit.CreateParams(var Params: TCreateParams);
    begin
     inherited CreateParams(Params);
     with Params do Style := Style or WS_CLIPCHILDREN;
    end;

    procedure TMyButtonEdit.SetEditRect;
    var R: TRect;
    begin
     R := ClientRect;
     Dec(R.Right, FButton.Height);
     SendMessage(Handle, EM_SETRECTNP, 0, Longint(@R));
    end;

    procedure TMyButtonEdit.WMSize(var Msg: TWMSize);
    begin
     inherited;
     SetEditRect;
    end;

    procedure TMyButtonEdit.WMSetCursor(var Msg: TWMSetCursor);
    var P: TPoint;
       W: Integer;
    begin
     GetCursorPos(P);
     P := ScreenToClient(P);
     W := ClientWidth - FButton.Width;
     if P.X >= W
       then Windows.SetCursor(Screen.Cursors[crDefault])
       else inherited;
    end;


 
Конференция "Компоненты" » Странное наследника TCustomMaskEdit со стилем ES_MULTILINE
Есть новые Нет новых   [119142   +32][b:0][p:0.001]