Как обнаружить URL-ссылки после установки EM_AUTOURLDETECT в TRichEdit?

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

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

Спасибо


person Martin Reiner    schedule 17.01.2012    source источник


Ответы (1)


У меня была такая же проблема некоторое время назад, и я использовал (довольно) грязный обходной путь. После отправки 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;
person TLama    schedule 17.01.2012
comment
Спасибо, TLama, но нет ли более чистой техники для этого? Какое-то одно уведомление? Выглядит довольно тяжело очистить и вернуть текст TRichEdit. - person Martin Reiner; 17.01.2012
comment
В документации есть следующее: Если включено автоматическое определение URL-адреса, элемент управления расширенным редактированием сканирует любой измененный текст, чтобы определить, соответствует ли текст формату URL-адреса. поэтому кажется, что текст должен быть изменен, чтобы получить этот формат, но если есть более простой способ (некоторое уведомление, как вы говорите), чтобы заставить систему применять эффект CFE_LINK ко всем словам, уже присутствующим в расширенном редактировании, я не знаю. - person TLama; 17.01.2012
comment
нет другого обходного пути AFIK. упрощенный код будет таким: SendMessage(RichEdit1.Handle, WM_SETTEXT, 0, Longint(RichEdit1.Text)); после установки EM_AUTOURLDETECT - person kobik; 17.01.2012
comment
@kobik, ты прав, спасибо. И смотреться будет намного стильнее. Я включу это в ответ с извинениями;) - person TLama; 17.01.2012
comment
Я думаю, что способ VCL сделать это - вызов RecreateWnd - person OnTheFly; 17.01.2012
comment
@user539484 user539484, это невозможно, потому что TRichedit не опубликовано RecreateWnd, и даже если вы хотите, например. выполнить сообщение CM_RECREATEWND явно, ничего не произойдет (что достаточно справедливо, потому что это только для базовых элементов управления:) - person TLama; 18.01.2012
comment
@TLama, этот метод никогда не должен быть published. Цель RecreateWnd – справиться со стилями элементов управления, которые нельзя установить для живого элемента управления: Некоторые изменения в свойствах элементов управления не реализуются до тех пор, пока не произойдет это повторное создание. - person OnTheFly; 18.01.2012
comment
@ user539484, он опубликован, например. для формы; но в любом случае RecreateWnd применяет изменения для некоторых свойств, но не для эффектов, которые заданы явно. TRichedit нигде не хранит этот параметр, и если это так, вам нужно будет вызвать EM_AUTOURLDETECT в каком-либо методе создания или в установщике свойств (а если в установщике свойств, то вам нужно будет установить это свойство в методе создания), чтобы применить его . - person TLama; 18.01.2012
comment
@TLama, опубликовано, например. для формы — нет, она всегда была защищена. TRichedit нигде не хранит этот параметр — TCustomRichEdit имеет предопределенную маску события, если вы хотите установить больше флагов — отправьте сообщение, например: CreateWnd. - person OnTheFly; 19.01.2012
comment
@user539484 user539484, ну, RecreateWnd всегда защищено, но вы можете вызвать его из пространства имен модуля для TForm, поэтому оно опубликовано по смыслу этого слова (не технически). Но тем не менее, даже RecreateWnd не влияет на настройку EM_AUTOURLDETECT без изменения текста (см. мое временное редактирование). - person TLama; 19.01.2012