我正在使用当前代码来突出显示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
的结果类型)。