RichEdit的EM_AUTOURLDETECT消息并不总是被发送

为了描述这个问题,最好的方法是用下面的用例来testing我的应用程序:

申请: http : //ubuntuone.com/p/nF/

  1. 公开申请;
  2. 点击“>”标题button;
  3. 再次点击相同的button;
  4. 再次点击相同的button。

正如你所看到的 – URL在第一次扩展中被正确地检测到,但在任何进一步不是。

希望有你的帮助解决这个问题:)

目前我每次都会发送WM对话框,但仍然不起作用。

展开/折叠button代码snipp:

if (PreviewOpn.Caption = '<') and (Width >= 499) then // if form is expanded begin PreviewOpn.Caption := '>'; if CheckWin32Version(6,0) then begin Constraints.MinWidth := 252; ClientWidth := Round(252 - ((Width - ClientWidth) / 2)); end else begin Constraints.MinWidth := 248; ClientWidth := Round(248 - ((Width - ClientWidth) / 2)); end; PopupActionBar1.Items[1].Enabled := False; PopupActionBar1.Items[1].Checked := False; if (PreviewOpn.Caption = '<') and (Width >= 248) then PreviewOpn.Caption := '>'; end else // else if form is collapsed begin SendMessage(RichEdit1.Handle, EM_SETEVENTMASK, 0, EM_GETEVENTMASK or ENM_LINK); //| SendMessage(RichEdit1.Handle, EM_AUTOURLDETECT, Integer(True), 0); PreviewOpn.Caption := '<'; if CheckWin32Version(6,0) then begin Constraints.MinWidth := 252; ClientWidth := Round(510 - ((Width - ClientWidth) / 2)); end else begin Constraints.MinWidth := 248; ClientWidth := Round(499 - ((Width - ClientWidth) / 2)); end; PopupActionBar1.Items[1].Enabled := True; PopupActionBar1.Items[1].Checked := True; if (PreviewOpn.Caption = '>') and (Width >= 499) then PreviewOpn.Caption := '<'; if (FileExists(Edit1.Text)) or (FileExists(Edit2.Text)) or (FileExists(ParamStr(1))) then RAWInputBtnClick(TabSet1); end; vClick(VKPInputBtn); // calls PopuMenu items enabling triggers for n := 0 to RichEdit1.Lines.Count - 1 do if RichEdit1.Width < Canvas.TextWidth(RichEdit1.Lines[n]) then // enable automatic scroolbar settup RichEdit1.ScrollBars := ssBoth; 

内部表单OnCreate事件:

  SendMessage(RichEdit1.Handle, EM_SETEVENTMASK, 0, EM_GETEVENTMASK or ENM_LINK); //| SendMessage(RichEdit1.Handle, EM_AUTOURLDETECT, Integer(True), 0); //| RichEdit1.Lines[5] := RichEdit1.Lines[5] + ' '; //| resend message for line to fix update issue 

正如http://msdn.microsoft.com/en-us/library/bb787991%28VS.85%29.aspx文档所述,通过文本修改来检测URL,这意味着只有重新调用检测的方法是发送某种消息添加/删除字符,但:

在键盘isp被重置之后,仅在INSIDE线之后,URL被立即检测到。 可能的修复将是非常讨厌的,因此我甚至不认为开发代码sinpp为此:)想法:Lopp通过所有有用的字符,例如,添加字符(#10),然后删除字符(#10)。 缺点:想象一下RichEdit控件里的大型RTF文本会发生什么…

您没有正确设置事件掩码,EM_GETEVENTMASK是一条消息,而不是一个标志。 你应该这样设置;

  SendMessage(RichEdit1.Handle, EM_SETEVENTMASK, 0, SendMessage(RichEdit1.Handle, EM_GETEVENTMASK, 0, 0) or ENM_LINK); 

我不知道如何一旦得到它就丢失了URL检测,但是如果上面的内容没有帮助,据我所知,没有其他办法可以清除和重新分配文本,或者修改URL文本本身,你已经注意到了。

作为一个侧面说明,你设置的滚动条取决于线宽,这似乎是错误的,垂直滚动条应该没有任何线宽。

作为另一个边节点,你关于改变窗体宽度的测试是错误的。

  if (PreviewOpn.Caption = '<') and (Width >= 499) then begin ... end else begin if CheckWin32Version(6,0) then begin Constraints.MinWidth := 252; ClientWidth := Round(510 - ((Width - ClientWidth) / 2)); ... 

在上面,当你的表单展开时,它的宽度为〜510,最小宽度为252.这意味着表单可以调整为小于499的宽度,那么你的“if”将失败,尽管表单扩大它不会收缩。 忘了标题和宽度,并采用像FFormExpanded私人领域的标志,并将其设置为true或false ..等…