Использование onRequestResize в TRichEdit в Delphi 11.3: принудительный запуск обработчика событий
Вопрос, который заинтересовал разработчиков, использующих компонент TRichEdit в среде разработки Delphi 11.3, связан с принудительным запуском обработчика события onRequestResize. Это событие должно срабатывать при изменении размера компонента, однако в некоторых случаях оно не вызывается, несмотря на то что событие остается назначенным.
Проблема и контекст
Разработчики столкнулись с ситуацией, когда после загрузки текста из потока в TRichEdit (с использованием метода LoadFromStream), событие onResizeRequest не срабатывало. Несмотря на то что код приложения большой и не может быть полностью представлен, пользователи ищут способ принудительно запустить обработчик события или вызвать функцию, которая будет выполняться по требованию.
Они также заметили, что событие onRequestResize не вызывается после выполнения команды RE.Height := 0. Удаление этой строки приводит к срабатыванию события, но, к сожалению, эта команда является ключевой и не может быть исключена из кода.
Альтернативный ответ
В качестве альтернативы принудительного вызова события было предложено использовать общий обработчик событий из onResizeRequest сразу после выполнения LoadFromStream вместо эмуляции сообщений WM_NOTIFY/CN_NOTIFY.
Подтвержденный ответ
Анализ показал, что библиотека общих элементов управления не генерирует уведомление EN_REQUESTRESIZE, если ширина или высота компонента равны нулю. Для принудительного запуска уведомления EN_REQUESTRESIZE необходимо отправить сообщение EM_REQUESTRESIZE в окно TRichEdit. Это можно сделать следующим образом:
SendMessage(RE.Handle, EM_REQUESTRESIZE, 0, 0);
Для упрощения процесса можно создать вспомогательный класс, который будет включать метод RequestResize:
uses
Vcl.ComCtrls, Winapi.RichEdit;
type
TCustomRichEditHelper = class helper for TCustomRichEdit
public
procedure RequestResize;
end;
procedure TCustomRichEditHelper.RequestResize;
begin
if HandleAllocated then
SendMessage(Handle, EM_REQUESTRESIZE, 0, 0);
end;
Теперь, чтобы принудительно запустить обработчик события onRequestResize, достаточно вызвать метод RequestResize:
RE.RequestResize;
Пример использования
procedure TForm1.FormCreate(Sender: TObject);
begin
// Создаем вспомогательный класс для TRichEdit
TCustomRichEditHelper = type helper for TRichEdit
procedure RequestResize;
end;
// Реализация метода RequestResize
procedure TCustomRichEditHelper.RequestResize;
begin
if HandleAllocated then
SendMessage(Handle, EM_REQUESTRESIZE, 0, 0);
end;
// Допустим, у нас есть TRichEdit с именем RichEdit1
with RichEdit1 do
begin
// Загружаем текст из потока
Lines.LoadFromStream(SomeStream);
// Принудительно вызываем обработчик onRequestResize
RequestResize;
end;
end;
Это решение позволяет разработчикам контролировать момент вызова обработчика onRequestResize, что может быть полезно в различных сценариях использования TRichEdit в приложениях на Delphi.
Разработчики в Delphi 11.3 столкнулись с проблемой, когда после загрузки текста в `TRichEdit` событие `onRequestResize` не срабатывало, и они искали способ принудительно его запустить.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.