Дельфы:Как узнать, когда TEdit меняет размер?
Вопрос
мне нужно обновлять элементы вокруг поля редактирования, когда оно меняет размер.
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