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