uses Winapi.RichEdit, ShellAPI;
  public
    procedure WndProc(var Msg: TMessage); override;
procedure TMainForm.FormCreate(Sender: TObject);
var
  mask: Word;
begin
  mask := SendMessage(editor.Handle, EM_GETEVENTMASK, 0, 0);
  SendMessage(editor.Handle, EM_SETEVENTMASK, 0, mask or ENM_LINK);
  SendMessage(editor.Handle, EM_AUTOURLDETECT, Integer(True), 0);
end;

 

procedure TMainForm.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(Self.ActiveControl);
          SendMessage(CE.Handle, EM_EXSETSEL, 0, Longint(@(p.chrg)));
          sURL := CE.SelText;
          ShellExecute(0, 'open', PChar(sURL), 0, 0, SW_SHOWNORMAL);
        except
        end;
      end;
    end;
  end;
  inherited;
end;

image