Author: Mike Shkolnik
How can I highlight URLs in RichEdit and how can I detect a mouse click in text
where URL is?
Answer:
Very popular question in delphi forums is: how can I highlight URLs in RichEdit and
how can I detect a mouse click in text where URL is... And everytime I see the
answers like "go to XXXX site and use this superb XXX product instead RichEdit".
Today I want to show how to implement URL highlighting and URL navigation without
any third-party components. This functionality is implemented in RichEdit from
Microsoft (and MS Outlook use this feature, for example) and only Borland's
developers didn't publish it for us.
So what we need:
1. drop on your form a RichEdit component from win32 page of component palette
2. in OnCreate event of your form write the next code:
1 var
2 mask: Word;
3 begin
4 mask := SendMessage(RichEdit1.Handle, EM_GETEVENTMASK, 0, 0);
5 SendMessage(RichEdit1.Handle, EM_SETEVENTMASK, 0, mask or ENM_LINK);
6 SendMessage(RichEdit1.Handle, EM_AUTOURLDETECT, Integer(True), 0);
7
8 RichEdit1.Text := 'Scalabium Software'#13#10 +
9 ' Site is located at www.scalabium.com. Welcome to our site.';
10 end;
After that your Richedit will convert automatically any URLs in highlighted (blue
color and underlined). Even if you'll start to enter any text directly in Richedit,
any begings for URL will be converted too (not only existing text string but new
too)
3. now we must detect mouse clicks in URL range. For this task we must override
WndProc method of our form:
11 type
12 TForm1 = class(TForm)
13 protected
14 procedure WndProc(var message: TMessage); override;
15 end;
16 {... }
17
18 procedure TForm1.WndProc(var message: TMessage);
19 var
20 p: TENLink;
21 strURL: string;
22 begin
23 if (message.Msg = WM_NOTIFY) then
24 begin
25 if (PNMHDR(message.LParam).code = EN_LINK) then
26 begin
27 p := TENLink(Pointer(TWMNotify(message).NMHdr)^);
28 if (p.msg = WM_LBUTTONDOWN) then
29 begin
30 SendMessage(RichEdit1.Handle, EM_EXSETSEL, 0, LongInt(@(p.chrg)));
31 strURL := RichEdit1.SelText;
32 ShellExecute(Handle, 'open', PChar(strURL), 0, 0, SW_SHOWNORMAL);
33 end
34 end
35 end;
36
37 inherited;
38 end;
Now you can compile your project (don't forget to include Richedit and ShellAPI
units in uses clause) and your RichEdit component will work like a sharm.
Of course, you can modify a code and process this parsed strURL as you like instead implemented navigation in browser as I did...
|