Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как правильно использовать TApplicationEvents для обнаружения изменения размера формы в Delphi 10.4

Delphi , ОС и Железо , Windows

Вопрос, поднятый пользователем, заключается в необходимости обнаружить завершение процесса изменения размера формы в приложении 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Windows ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 02:17:38/0.0050420761108398/1