Delphi: Как узнать, когда TEdit меняет размер?

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

У TEdit нет события OnResize.

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

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

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

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

3 ответа

Решение

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

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

Другие вопросы по тегам