Автоматическое выделение URL в TRichEdit без нарушения работы обработчика OnChange
При работе с компонентом TRichEdit в Delphi может возникнуть проблема, когда автоматическое выделение URL приводит к тому, что обработчик события OnChange перестаёт работать. Это может быть вызвано ошибкой в коде, связанном с инициализацией автоматического выделения URL.
Описание проблемы
Разработчик использует следующий код для выделения URL в TRichEdit:
procedure TForm1.WndProc(var Message: TMessage);
var
p: TENLink;
strURL: string;
begin
if (Message.Msg = WM_NOTIFY) then
begin
if (PNMHDR(Message.lParam).code = EN_LINK) then
begin
p := TENLink(Pointer(TWMNotify(Message).NMHdr)^);
if (p.Msg = WM_LBUTTONDOWN) then
begin
SendMessage(RichEdit1.Handle, EM_EXSETSEL, 0, Longint(@(p.chrg)));
strURL := RichEdit1.SelText;
ShellExecute(Handle, 'open', PChar(strURL), 0, 0, SW_SHOWNORMAL);
end
end;
end;
inherited;
end;
procedure TForm1.InitRichEditURLDetection;
var
mask: Word;
begin
mask := SendMessage(Handle, EM_GETEVENTMASK, 0, 0);
SendMessage(RichEdit1.Handle, EM_SETEVENTMASK, 0, mask or ENM_LINK);
SendMessage(RichEdit1.Handle, EM_AUTOURLDETECT, Integer(True), 0);
form1.RichEdit1.OnChange := form1.RichEdit1Change;
end;
После активации автоматического выделения URL, обработчик OnChange перестаёт вызываться.
Подтверждённый ответ
В коде присутствует ошибка, из-за которой маска событий не инициализируется правильно. Вместо SendMessage(Handle, EM_GETEVENTMASK, 0, 0); следует использовать SendMessage(RichEdit1.Handle, EM_GETEVENTMASK, 0, 0);. Это приводит к тому, что маска событий не содержит необходимых битов для отслеживания изменений в TRichEdit.
Кроме того, важно, чтобы переменная mask была объявлена как Longint, так как SendMessage возвращает LRESULT, который должен быть представлен 32-битным целым числом.
Шаги по устранению проблемы
Исправить вызов EM_GETEVENTMASK на правильный объект TRichEdit.
Объявить переменную mask как Longint.
Убедиться, что обработчик OnChange не содержит ошибок и корректно обрабатывает изменения в тексте TRichEdit.
Пример исправленного кода
procedure TForm1.InitRichEditURLDetection;
var
mask: Longint;
begin
mask := SendMessage(RichEdit1.Handle, EM_GETEVENTMASK, 0, 0);
SendMessage(RichEdit1.Handle, EM_SETEVENTMASK, 0, mask or ENM_LINK or ENM_CHANGE);
SendMessage(RichEdit1.Handle, EM_AUTOURLDETECT, Integer(True), 0);
// Восстанавливаем обработчик OnChange
form1.RichEdit1.OnChange := form1.RichEdit1Change;
end;
Заключение
Автоматическое выделение URL в TRichEdit не должно мешать работе обработчика OnChange, если при инициализации компонента правильно установить маску событий. Исправление кода, как описано выше, должно восстановить функциональность обработчика OnChange без потери возможности автоматического выделения URL.
При работе с компонентом `TRichEdit` в Delphi при активации автоматического выделения URL происходит сбой в работе обработчика события `OnChange` из-за неправильной инициализации маски событий.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.