Вопрос, поднятый пользователем, заключается в необходимости обнаружить завершение процесса изменения размера формы в приложении VCL на Delphi 10.4. Было предложено использовать компонент TApplicationEvents и обработчик событий OnMessage для перехвата сообщения WM_EXITSIZEMOVE, однако это не принесло желаемого результата.
Описание проблемы
При работе с формами в Delphi 10.4, разработчики часто сталкиваются с необходимостью реагирования на изменения размера формы. В частности, в данном случае требуется обнаружить момент, когда пользователь завершил изменение размера формы, используя размерную ручку.
Попытка решения
В качестве попытки решения было добавлено на форму компонент TApplicationEvents, и создан обработчик событий OnMessage, который должен был перехватить сообщение WM_EXITSIZEMOVE. Однако, несмотря на все усилия, обработчик событий так и не был выполнен после изменения размера формы.
procedure TFormMain.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
if (Msg.Message = WM_EXITSIZEMOVE) then
begin
// Действия при завершении изменения размера формы
end;
end;
Подтвержденный ответ
Проблема заключается в том, что сообщение WM_EXITSIZEMOVE отправляется непосредственно окну, а не в основной очередь сообщений, поэтому TApplicationEvents не может его перехватить. Для обнаружения этого сообщения необходимо переопределить метод WndProc формы:
type
TForm1 = class(TForm)
private
protected
procedure WndProc(var Message: TMessage); override;
public
end;
implementation
procedure TForm1.WndProc(var Message: TMessage);
begin
inherited;
case Message.Msg of
WM_EXITSIZEMOVE:
begin
// Действия при завершении изменения размера формы
ShowMessage('Размер формы изменен');
end;
end;
end;
Или использовать метод message, который автоматически перехватывает нужное сообщение:
type
TForm1 = class(TForm)
protected
procedure WMExitSizeMove(var Message: TMessage); message WM_EXITSIZEMOVE;
public
end;
procedure TForm1.WMExitSizeMove(var Message: TMessage);
begin
inherited;
// Действия при завершении изменения размера формы
ShowMessage('Размер формы изменен');
end;
Однако стоит отметить, что WM_EXITSIZEMOVE отправляется не только при изменении размера, но и при перемещении окна, и только если операция включала модальный цикл.
Альтернативные способы
Для обнаружения начала изменения размера формы можно использовать сообщение WM_ENTERSIZEMOVE. Также существуют и другие сообщения, такие как WM_SYSCOMMAND, WM_MOVE, WM_WINDOWPOSCHANGING, WM_SIZING, которые могут быть полезны для обнаружения различных событий, связанных с перемещением и изменением размера формы.
Для определения факта изменения размера, а не перемещения, можно сравнить размер формы до начала изменения и после его завершения. Это позволит с точностью определить, произошло ли изменение размера.
Заключение
Использование TApplicationEvents для обнаружения изменений размера формы неэффективно, так как сообщение WM_EXITSIZEMOVE не обрабатывается через этот компонент. Необходимо переопределить метод WndProc формы или использовать метод message для корректного перехвата сообщений, связанных с изменением размера формы.
Проблема состоит в необходимости правильно обнаружить завершение процесса изменения размера формы в приложении VCL на Delphi 10.4, что требует переопределения метода `WndProc` формы или использования метода `message` для перехвата сообщения `WM_EXITSIZEM
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.