程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi中為RichEdit加入鏈接

Delphi中為RichEdit加入鏈接

編輯:Delphi

隨著網絡的深入應用,各種軟件都增加了一些網絡功能,常用的文本編輯器也出現了這樣的一種功能,當你把一個網址輸入完畢後,網址由黑色變成了帶下劃線的寶藍色,點擊之後,你的缺省Web浏覽器將會被啟動,顯示出該URL所標識的網站內容;而如果你輸入的是“mailto:[email protected]”那麼你的缺省電子郵件程序將被打開,這樣你就能通過一個使用文本編輯器來發送電子郵件了。

這個看似神奇的功能,不需用第三方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:[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;

主要的代碼都列出來了,最後程序的效果如下圖,由兩個Richedit的比較不難看出區別。在看到別人程序中的一些技術亮點的時候,不妨多思考一下如何用現有的組件來解決,這也是一個提高水平的好機會,一味等待第三方VCL組件,可能真的會使你成為一只大猩猩的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved