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

Как автоматически выделять URL в TRichEdit, не нарушая работу обработчика OnChange

Delphi , Компоненты и Классы , TMemo и TRichEdit

Автоматическое выделение 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-битным целым числом.

Шаги по устранению проблемы

  1. Исправить вызов EM_GETEVENTMASK на правильный объект TRichEdit.
  2. Объявить переменную mask как Longint.
  3. Убедиться, что обработчик 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




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


:: Главная :: TMemo и TRichEdit ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 09:03:46/0.0033540725708008/0