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

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

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

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

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

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

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


person Ian Boyd    schedule 14.09.2009    source источник
comment
Вы хотите активировать OnResize при изменении кода? Как так?   -  person Havenard    schedule 14.09.2009
comment
@Havenard: Ян имеет в виду, если размер изменяется в коде во время выполнения, а не если он действительно изменяет код во время разработки.   -  person Bruce McGee    schedule 15.09.2009


Ответы (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;
person Bruce McGee    schedule 14.09.2009
comment
Самый элегантный и демонстрирует дырявые недостатки абстракции в большинстве объектно-ориентированных библиотек. - person Ian Boyd; 16.09.2009

Вы пробовали что-то вроде этого:

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.
person Jeroen Wiert Pluimers    schedule 14.09.2009

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

См. Также: wm_WindowPosChanged

person Rob Kennedy    schedule 14.09.2009