Delphi中为RichEdit加入链接

2016-01-29 14:25 54 1 收藏

Delphi中为RichEdit加入链接,Delphi中为RichEdit加入链接

【 tulaoshi.com - Delphi 】


  这个看似神奇的功能,不需用第三方VCL组件就能搞定(据网上的“大牛”们说,第三方组件用多了,大脑会因长期得不到思考而逐渐退化成大猩猩的程度,所以尽量少用)。TRichEidt是Delphi提供的一个非常有用的VCL组件(你可以在Delphi的组件面板的Win32标签页中找到它),它提供了一个文本编辑程序的大部分的功能,甚至还可以对段落进行格式化、改变文本的颜色,这样一来,你完全可以用它制作一个类似Windows操作系统自带的写字板程序,这次我们靠的就是它。

  要实现超级链接的功能,首先必须解决如何在TRichRdit中对URL、Mailto等进行检测的问题,还是以实例开始吧,新建一个Delphi工程,在空白的Form上摆放两个TRichRdit组件,组件的名字就用缺省的名字RichEdit1和RichRdit2,对URL的感知功能的实现思路是:

  1、发送一个消息(EM_GETEVENTMASK)给RichEdit组件,获取事件模板(EventMask),它将会指定哪一个消息通知(notification)将被发送到给父窗口。

  2、发送一个包含ENM_LINK标志的EM_SETEVENTMASK消息给EichEdit,ENM_LINK将被包含在Mask中,当鼠标单击ULR时EN_LINK消息将被发送。

  3、发送EM_AUTOURLDETECT消息给RichEdit,EM_AUTOURLDETECT消息将会自动检测URL。
然后,我们来解决URL高亮显示的问题。

  在我们刚刚建立的程序中找到RichEdit1组件,进入它的OnCreate事件,在该事件中加入一个自定义的InitRichEditURLDetection过程,以便能够在程序启动时就触发它;RichEdit2组件的OnCreate事件则不加入InitRichEditURLDetection过程,让两者比较一下效果,代码如下所示:

//这个是我们自定义的InitRichEditURLDetection过程
//它是最关键的一步
procedure TForm1.InitRichEditURLDetection(RE: TRichEdit);
 var
  mask: Word;
 begin
  mask := SendMessage(RE.Handle, EM_GETEVENTMASK, 0, 0);
  SendMessage(RE.Handle, EM_SETEVENTMASK, 0, mask or ENM_LINK);
  SendMessage(RE.Handle, EM_AUTOURLDETECT, Integer(True), 0);
 end;
 //这是FormCreate事件,它加入了我们自定义的过程
 //使得程序一运行就出现我们想要实现的效果
 procedure TForm1.FormCreate(Sender: TObject);
  var
   s: string;
  begin
   InitRichEditURLDetection(RichEdit1);

   s:=http://www.yesky.com + #13#10 +
   mailto:software@chinabyte.com;
   RichEdit1.Text := s;

   s:= http://www.yesky.com + #13#10 +
   mailto:software@chinabyte.com;
   RichEdit2.Text := s
end;
  最后我们来实现鼠标单击后自动调用浏览器或邮件程序的功能,我们用覆盖(Override)Form的WndProc方法来捕获EN_LINK消息,然后我们用ShellExecute过程来启动缺省的浏览器,代码如下所示:

//Form的WndProc过程
procedure TForm1.WndProc(var Msg: TMessage);
 var
  p: TENLink;
  sURL: string;
  CE : TRichEdit;
 begin
  if (Msg.Msg = WM_NOTIFY) then
  begin
   if (PNMHDR(Msg.lParam).code = EN_LINK) then
   begin
    p := TENLink(Pointer(TWMNotify(Msg).NMHdr)^);
    if (p.Msg = WM_LBUTTONDOWN) then
    begin
    try
     CE := TRichEdit(Form1.ActiveControl);
     SendMessage(CE.Handle, EM_EXSETSEL, 0, Longint(@(p.chrg)));
     sURL := CE.SelText;
     ShellExecute(Handle, open, PChar(sURL), 0, 0, SW_SHOWNORMAL);
    except
    end;
   end;
  end;
 end;
 inherited;
end;
  主要的代码都列出来了,最后程序的效果如下图,由两个Richedit的比较不难看出区别。在看到别人程序中的一些技术亮

来源:https://www.tulaoshi.com/n/20160129/1493245.html

延伸阅读
如何在PowerPoint中加入超链接   1、单击插入选项卡的文本框按钮,在弹出的下拉列表中单击横排文本框选项。 2、 在幻灯片的空白处拖拽出一个横排文本框,在文本框中输入点击查看四个字。 3、单击插入选项卡下的超链接按钮,弹出超链接对话框。 4、 选择超链接的文件,或直接输入链接地址,再单击确定按钮。 pow...
笔者设计了一段程序。首先在窗体上添加一个DBGrid来显示我们所要打印的数据,在这里,DBGrid不只是起到显示数据的作用,而且用户对DBGrid作的调整,例如改变了各字段的排列顺序,各字段的显示宽度等,都将直接反映到打印结果中去,也就是说,我们实际上就是要把DBGrid的内容直接输出到打印机。以下程序在Win 98+Delphi 4下编译通过,代码如...
标签: Delphi
  Delphi作为一种面向对象的可视化开发工具,以其开发程序的高速度和编译代码的高效率越来越受到广大编程人员的喜爱。尽管Delphi已经提供了非常强大的开发组件(VCL),但灵活使用API函数一定可以使你的程序增色不少。 状态键的检查 当今不少流行软件的编辑窗口(包括Delphi的代码编辑窗口)的底部都有一个状态条...
标签: word
Word 2003将文档中的内容复制粘贴为超链接   动画演示: ①在文档中选中你需要的作为超链接的文本,然后单击鼠标右键,选择复制。 ②将鼠标的光标置于你想放置超链接的位置。 ③单击编辑→粘贴为超链接。则复制的对象以超链接的方式粘贴到光标所在位置,被创建超链接的文本将变成有颜色的、加下划线的文字。 ...
为MSN Messenger加入背景皮肤方法 MSN没有QQ提供的换肤功能,这对于喜欢个性的用户来说,确实是件比较遗憾的事情。不过虽然没法换肤,但咱给MSN换换背景图还是完全可以做到的。 制作背景图 启动图像处理软件(如Photoshop等),新建一个宽度为249像素,高度为369像素,分辨率为96像素/英寸的文件,然后进入编辑处理,你可以自...

经验教程

625

收藏

92
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部