Хитрость заключается в том, чтобы вклиниться в обработке сообщений родительской формы (доказательство правильности концепции кода, тестирование с Delphi 2009, ошибка и угловой случай обработки нужно больше работать):
type
TFrame2 = class(TFrame)
strict private
fOnEnterSizeMove: TNotifyEvent;
fOnExitSizeMove: TNotifyEvent;
fSavedWndProc: TWndMethod;
procedure DoEnterSizeMove;
procedure DoExitSizeMove;
procedure ParentWindowProc(var AMessage: TMessage);
protected
procedure CreateWnd; override;
procedure DestroyWnd; override;
published
property OnEnterSizeMove: TNotifyEvent read fOnEnterSizeMove
write fOnEnterSizeMove;
property OnExitSizeMove: TNotifyEvent read fOnExitSizeMove
write fOnExitSizeMove;
end;
{ TFrame2 }
procedure TFrame2.CreateWnd;
var
ParentForm: TCustomForm;
begin
inherited;
ParentForm := GetParentForm(Self);
if ParentForm <> nil then begin
fSavedWndProc := ParentForm.WindowProc;
ParentForm.WindowProc := ParentWindowProc;
end;
end;
procedure TFrame2.DestroyWnd;
var
ParentForm: TCustomForm;
begin
ParentForm := GetParentForm(Self);
if ParentForm <> nil then
ParentForm.WindowProc := fSavedWndProc;
inherited;
end;
procedure TFrame2.DoEnterSizeMove;
begin
if Assigned(fOnEnterSizeMove) then
fOnEnterSizeMove(Self);
end;
procedure TFrame2.DoExitSizeMove;
begin
if Assigned(fOnExitSizeMove) then
fOnExitSizeMove(Self);
end;
procedure TFrame2.ParentWindowProc(var AMessage: TMessage);
begin
fSavedWndProc(AMessage);
if AMessage.Msg = WM_ENTERSIZEMOVE then
DoEnterSizeMove;
if AMessage.Msg = WM_EXITSIZEMOVE then
DoExitSizeMove;
end;
Примечание что сообщения отправляются всякий раз, когда был запущен или оставлен вторичный цикл сообщений для перемещения/калибровки - нет способа различать перемещение и калибровку. Если вам нужно убедиться, что вы уловили только размер, вы должны сравнить старый и новый размер кадра в обработчике.
Я думаю, что он хочет отложить изменение размера («делать это в событии изменения размера слишком занято»). PS. Изменение размера также можно сделать, разместив панель на кадре со всеми компонентами. – BennyBechDk
Событие OnResizeEnd сразу после вызова Paren'ts OnResize. Только там, где говорится «FOnResize (Parent)», вы можете вставить туда любой код для его обработки – zz1433