Delphi中为RichEdit加入链接

爽朗的孙子曰

爽朗的孙子曰

2016-01-29 14:25

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

  这个看似神奇的功能,不需用第三方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的比较不难看出区别。在看到别人程序中的一些技术亮
展开更多 50%)
分享

猜你喜欢

Delphi中为RichEdit加入链接

Delphi
Delphi中为RichEdit加入链接

Delphi中RichEdit的奥妙

Delphi
Delphi中RichEdit的奥妙

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

在RichEdit中实现超链接

编程语言 网络编程
在RichEdit中实现超链接

Delphi 对象链接与嵌入

编程语言 网络编程
Delphi 对象链接与嵌入

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

RichEdit中实现查找功能

编程语言 网络编程
RichEdit中实现查找功能

Delphi中动态链接库(DLL)的建立和使用

Delphi
Delphi中动态链接库(DLL)的建立和使用

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

《烈焰遮天》新手职业攻略 法师篇

《烈焰遮天》新手职业攻略 法师篇

制作一个Flash的填色游戏

制作一个Flash的填色游戏
下拉加载更多内容 ↓