unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, Buttons; type TForm1 = class(TForm) RichEdit1: TRichEdit; RichEdit2: TRichEdit; Edit1: TEdit; Button1: TButton; FontDialog1: TFontDialog; SpeedButton1: TSpeedButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private procedure InitRichEditURLDetection(RE : TRichEdit); public { Public declarations } protected procedure WndProc(var Msg: TMessage); override; end; var Form1: TForm1; implementation {$R *.dfm} uses ShellApi, RichEdit; 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; procedure TForm1.FormCreate(Sender: TObject); var s: string; begin InitRichEditURLDetection(RichEdit2); s:='Great Delphi tutorials and articles at ' + 'http://www.delphi.about.com.' + #13#10 + 'About Delphi Programming site!' + #13#10 + 'Send an email to your Guide: mailto:delphi.guide@about.com'; RichEdit1.Text := s; s:= 'http://www.delphi.about.com. ' + #13#10 + ' This Rich Edit does not recognize URLs!'+ #13#10 + 'http://delphi.about.com. '; RichEdit2.Text := s end; 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; (* TForm1.WndProc *) procedure TForm1.Button1Click(Sender: TObject); begin richedit2.Lines.Add(edit1.Text); end; end.