PASSWORD 's Blog

用耳朵去聆听,用心来感受

用户操作
[即时聊天] [发私信] [加为好友]
龙枫ID:libra01
58650次访问,排名1811(1)好友0人,关注者0
libra01的文章
原创 63 篇
翻译 0 篇
转载 4 篇
评论 65 篇
彭为的公告

网名:PASSWORLD
QQ:3569555
MSN:pwzyp#msn.com
现工作在上海
最近评论
mldstk:wow power leveling
zhangjiajun1982:建议你看看这篇文章对你会有帮助的 http://www.150it.cn/bianchengwendang/VC/865064948.html
lovevirus:持之以恒,这是最重要的,谢谢主人的金玉良言,呵呵,郁闷时期给我一点鼓舞
dugang:兄弟,钱多的好找,不累的难找
骆归:楼主还行,但我想没有这么难,不想多说,帮你顶.
文章分类
收藏
    相册
    爱的足迹
    博客图片
    丑男形象
    Delphi
    ★卢培培★
    Angus Johnson's Delphi Components
    CrazyCock专栏
    flier_lu(有价值的文章)
    Think in Patterns 中文
    午夜听风的代码人生
    抉择不悔's blog
    梁甫吟
    超强的Delphi Tips
    风中之歌
    友情链接
    ===天地弦===
    DigJim 的博客(RSS)
    E步·软件资讯
    hkbarton-delphi
    为艺术为技术(RSS)
    孙辉的BLOG
    张硕(CathyEagle)的BLOG
    成片的大树
    我的另外一个生活博客
    编程手札(RSS)
    (RSS)
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 Delphi中为RichEdit加入链接收藏

    新一篇: 利用Delphi编程控制摄像头 | 旧一篇:   对程序员职业的思考

     随着网络的深入应用,各种软件都增加了一些网络功能,常用的文本编辑器也出现了这样的一种功能,当你把一个网址输入完毕后,网址由黑色变成了带下划线的宝蓝色,点击之后,你的缺省Web浏览器将会被启动,显示出该URL所标识的网站内容;而如果你输入的是“mailto:webmaster@yesky.com”那么你的缺省电子邮件程序将被打开,这样你就能通过一个使用文本编辑器来发送电子邮件了。


      这个看似神奇的功能,不需用第三方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的比较不难看出区别。在看到别人程序中的一些技术亮点的时候,不妨多思考一下如何用现有的组件来解决,这也是一个提高水平的好机会,一味等待第三方VCL组件,可能真的会使你成为一只大猩猩的。

    http://soft.yesky.com/SoftChannel/72342371928440832/20040803/1838284.shtml

    发表于 @ 2004年08月04日 15:51:00|评论(loading...)|编辑

    新一篇: 利用Delphi编程控制摄像头 | 旧一篇:   对程序员职业的思考

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 彭为