Как определить URL-ссылки после установки EM_AUTOURLDETECT в TRichEdit? - PullRequest
5 голосов
/ 17 января 2012

Я пытаюсь реализовать определение URL для компонента TRichEdit с помощью сообщения EM_AUTOURLDETECT.
У меня проблема со следующим кодом

procedure TForm1.Button1Click(Sender: TObject);
var Mask: Word;
begin
  Mask := SendMessage(Handle, EM_GETEVENTMASK, 0, 0);
  SendMessage(Handle, EM_SETEVENTMASK, 0, Mask or ENM_LINK);
  SendMessage(Handle, EM_AUTOURLDETECT, Integer(True), 0);
end;

Хотя это работает, но я должен изменить текст TRichEdit после этих настроек, чтобы он обнаруживал URL-адреса в уже написанном тексте. И это проблема, потому что мой TRichEdit находится в режиме ReadOnly при применении этой функции.

Что мне следует сделать после выполнения этого кода, чтобы заставить TRichEdit обнаруживать URL-адреса в уже написанном тексте?
Я смотрел на документацию , но ничего подобного не упоминается.

Спасибо

1 Ответ

4 голосов
/ 17 января 2012

У меня была такая же проблема некоторое время назад, и я использовал (вполне) грязный обходной путь для нее.После отправки сообщения EM_AUTOURLDETECT я получаю и сохраняю текущий выбор, затем (пере) устанавливаю текст расширенного редактирования и возвращаю выбор, сохраненный ранее.

procedure TForm1.Button1Click(Sender: TObject);
var
  EventMask: Word;
  CharRange: TCharRange;
begin
  EventMask := SendMessage(RichEdit1.Handle, EM_GETEVENTMASK, 0, 0);
  SendMessage(RichEdit1.Handle, EM_SETEVENTMASK, 0, EventMask or ENM_LINK);
  SendMessage(RichEdit1.Handle, EM_AUTOURLDETECT, WPARAM(True), 0);
  SendMessage(RichEdit1.Handle, EM_EXGETSEL, 0, LPARAM(@CharRange));
  SendMessage(RichEdit1.Handle, WM_SETTEXT, 0, LPARAM(RichEdit1.Text));
  SendMessage(RichEdit1.Handle, EM_EXSETSEL, 0, LPARAM(@CharRange));
end;
...