请问大虾们:
  我想在richedit中设置某行的某个字串如:教务处对大家说中的教务处,为链接文本,当点击它的时候,会触放某个事件处理过程,例如,取得该文本字串,并进行比较,请问该怎么做,最好有代码,先谢谢了

解决方案 »

  1.   

    要实现超级链接的功能,首先必须解决如何在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:[email protected]';
       RichEdit1.Text := s;   s:= 'http://www.yesky.com' #13#10 
       'mailto:[email protected]';
       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;
      

  2.   

    楼上的你好:
      我所要的不是对URL、Mailto的检测,而是对于任意字符串,可随时设置成链接文本,例如对于任意加入的一个字串“中国”,使之成为链接文本。
      

  3.   

    RxRichEdit能实现对http的识别,你看一下源码应该是一样的原理
      

  4.   

    var
      cf2:CHARFORMAT2;begin
      fillchar(cf2, sizeof(CHARFORMAT2),0);//
      cf2.cbSize:= sizeof(CHARFORMAT2);
      cf2.dwMask:= CFM_LINK;
      cf2.dwEffects:= cf2.dwEffects or CFE_LINK or CFE_HIDDEN;
      SendMessage(self.RxRichEdit1.Handle, EM_SETCHARFORMAT, SCF_SELECTION, integer(@cf2));以上语句能对选中的文本增加链接,英文没问题,但对中文有时会出现异常!