Вопрос

мне нужно обновлять элементы вокруг поля редактирования, когда оно меняет размер.

TEdit не имеет Увеличенный размер событие.

Размер окна редактирования может изменяться в разное время, например:

  • изменение ширины / высоты в коде
  • форма, масштабируемая для масштабирования DPI
  • изменен шрифт

И я уверен, что есть и другие, о которых я не знаю.

мне нужно одно событие, чтобы узнать, когда поле редактирования изменило свой размер.Есть ли сообщение Windows, для которого я могу подклассировать поле редактирования и захватить?

Это было полезно?

Решение

OnResize объявлен как защищенное свойство TControl.Вы могли бы предоставить его с помощью так называемого класса "cracker".Хотя это немного халтурно.

type
  TControlCracker = class(TControl);

...

procedure TForm1.FormCreate(Sender: TObject);
begin
  TControlCracker(Edit1).OnResize := MyEditResize;
end;

procedure TForm1.MyEditResize(Sender: TObject);
begin
  Memo1.Lines.Add(IntToStr(Edit1.Width));
end;

Другие советы

Вы пробовали что-нибудь подобное:

unit _MM_Copy_Buffer_;

interface

type
  TMyEdit = class(TCustomEdit)
  protected
    procedure Resize; override;
  end;

implementation

procedure TMyEdit.Resize;
begin
  inherited;
  if not (csLoading in ComponentState) then
  begin
    // react on new size
  end;
end;

end.

или это:

unit _MM_Copy_Buffer_;

interface

type
  TCustomComboEdit = class(TCustomMaskEdit)
  private
    procedure WMSize(var Message: TWMSize); message WM_SIZE;
  end;

implementation

procedure TCustomComboEdit.WMSize(var Message: TWMSize);
begin
  inherited;
  if not (csLoading in ComponentState) then
  begin
    // react on new size
  end;
  UpdateBtnBounds;
end;

end.

Обращаться с wm_Size Сообщение.Подкласс элемента управления путем присвоения нового значения его WindowProc свойство;обязательно сохраните старое значение, чтобы вы могли делегировать туда другие сообщения.

Смотрите также: wm_WindowPosChanged

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top