TRichEdit和URL突出显示问题

我正在使用当前代码来突出显示TRichEdit上的URL:

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,但它阻止了我的RichEdit1.OnChange被调用。 我尝试从WndProc和其他方法再次设置,但没有任何工作。 一分钟,我启用URL荧光笔(通过调用FormCreate InitRichEditURLDetection)OnChange停止工作。

这是在Delphi 7上。

有什么build议么? 谢谢!

您的代码中存在一个错误。 更换

 mask := SendMessage(Handle, EM_GETEVENTMASK, 0, 0); 

 mask := SendMessage(RichEdit1.Handle, EM_GETEVENTMASK, 0, 0); 

由于这个错误, mask将不包含Rich Edit控件的默认事件位,所以当您使用EM_SETEVENTMASK时,Rich Edit控件会丢失这些事件标志; 特别是它将缺少ENM_CHANGE位。

更新

Sertac Akyuz发现了另一个显示停止的bug: mask需要是一个整数(这实际上是SendMessage的结果类型)。