Richedit avec reconnaissance des urls

5/5 (14 avis)

Snippet vu 8 205 fois - Téléchargée 39 fois

Contenu du snippet

c'est une simple extension du richedit fourni en standard avec la VCL, qui détecte automatiquement les urls et déclenche un évènement en cas de clic sur celles-ci.

une procédure est également disponible pour donner l'attribut "lien" à la sélection courante (par exemple pour mettre comme liens des adresses emails sans avoir besoin du mailto: devant).

j'ai également rajouté deux évènements: OnMouseEnter et OnMouseLeave ;-)

Source / Exemple :


unit RichEditEx;

interface

uses
  Forms, Windows, Messages, SysUtils, Classes, Controls, Graphics, ComCtrls, RichEdit;

type
  PENLink = ^TENLink;
  TLinkClickEvent = procedure(Sender: TObject; LinkClicked: String) of Object;
  TRichEditEx = class(TRichEdit)
  private
    FOnLinkClicked: TLinkClickEvent;
    FOnMouseEnter: TNotifyEvent;
    FOnMouseLeave: TNotifyEvent;
  protected
    procedure CreateWnd; override;
    procedure CNNotify(var Msg: TWMNotify); message CN_NOTIFY;
    procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure SetSelectionLink;
  published
    property OnLinkClicked: TLinkClickEvent read FOnLinkClicked write FOnLinkClicked;
    property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
    property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
  end;

procedure Register;

implementation

constructor TRichEditEx.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FOnLinkClicked := nil;
  FOnMouseEnter := nil;
  FOnMouseLeave := nil;
end;

destructor TRichEditEx.Destroy;
begin
  inherited Destroy;
end;

procedure TRichEditEx.CreateWnd;
begin
  inherited CreateWnd;
  SendMessage(Handle, EM_SETEVENTMASK, 0, SendMessage(Handle, EM_GETEVENTMASK, 0, 0) or ENM_LINK);
  SendMessage(Handle, EM_AUTOURLDETECT, 1, 0);
end;

procedure TRichEditEx.CNNotify(var Msg: TWMNotify);
var
  TR: TTextRangeA;
begin
  if Msg.NMHdr.code = EN_LINK
  then begin
    if Assigned(OnLinkClicked)
    then begin
      if PENLink(Msg.NMHdr).msg = WM_LBUTTONUP
      then begin
        TR.chrg := PENLink(Msg.NMHdr).chrg;
        GetMem(TR.lpStrText, TR.chrg.cpMax - TR.chrg.cpMin + 2);
        SendMessage(Handle, EM_GETTEXTRANGE, 0, Integer(addr(TR)));
        OnLinkClicked(Self, TR.lpStrText);
        FreeMem(TR.lpStrText);
      end;
    end;
    Msg.Result := 0;
  end else begin
    inherited;
  end;
end;

procedure TRichEditEx.CMMouseEnter(var Msg: TMessage);
begin
  if Enabled
  then begin
    if Assigned(OnMouseEnter) then OnMouseEnter(Self);
  end;
end;

procedure TRichEditEx.CMMouseLeave(var Msg: TMessage);
begin
  if Enabled
  then begin
    if Assigned(OnMouseLeave) then OnMouseLeave(Self);
  end;
end;

procedure TRichEditEx.SetSelectionLink;
var
  CF: TCharFormatA;
begin
  FillChar(CF, SizeOf(CF), 0);
  CF.cbSize := SizeOf(CF);
  CF.dwMask := CFM_LINK;
  CF.dwEffects := CFE_LINK;
  SendMessage(Handle, EM_SETCHARFORMAT, SCF_SELECTION, Integer(addr(CF)));
end;

procedure Register;
begin
  RegisterComponents('Win32', [TRichEditEx]);
end;

end.

Conclusion :


composant basé sur le code suivant : http://www.codeguru.com/richedit/RichEdit20.shtml

limitations : la détection automatique des urls (et leur clic, le cas échéant) ne fonctionne que sur windows 2000 / XP en raison des différences de versions des DLL riched32.dll et riched20.dll, si vous savez comment redéfinir l'objet richedit en utilisant riched20.dll plutot que riched32.dll, merci de me l'indiquer ;-)

je cherche également comment insérer des objets bitmaps dans un richedit, si vous le savez, laissez moi un commentaire svp (j'ai bien trouvé des méthodes sur le même site que ci-dessus, mais ça m'a donné mal à la tête, moi et le c++ on est pas copains lol)

A voir également

Ajouter un commentaire Commentaires
cs_Gerard Messages postés 121 Date d'inscription jeudi 10 janvier 2002 Statut Membre Dernière intervention 7 août 2018
31 août 2009 à 14:59
Bonjour,
Je suis intéressé par ce composant, mais j'utilise la version Turbo delphi de Borland et je n'y vois pas la fonction installer un composant.
Comme vous dites qu'il existe d'autres façons d'utiliser ce composant, en existent-lls d'autres? peut-on utiliser directement le source en l'ajoutant au projet?
(J'ai essayé, avec un create le Richedit n'apparait pas sur la fiche...)
merci.
cs_Korda Messages postés 23 Date d'inscription mardi 25 mai 2004 Statut Membre Dernière intervention 9 avril 2016
30 mai 2007 à 00:31
bonjour tt monde je reviend tres tard mais c'est le delphi et pour toujour.
ma question est ce qu'on peut changer les URL par la couleure ( c a dir au lieu de http://....
on color un mot pour faire un lien vers x ?)
merci j'attend ...........
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
16 juin 2005 à 02:28
J'avais testé le RxRichEdit également, et je l'ai très vite abandonné : un code qui fonctionnait parfaitement sur un TRichEdit faisait n'importe quoi sur le RxRichEdit...

Peut-être la version de JediVCL est-elle plus fiable, il faudra que j'y rejette un oeil. En tout cas très mauvais souvenir avec ce composant, ce qui m'a conduit à adapter celui-ci ;-)
cs_Jean-Pierre Messages postés 82 Date d'inscription jeudi 25 septembre 2003 Statut Membre Dernière intervention 20 avril 2010
12 mars 2005 à 23:39
Bonjour à tous,

Merci à toi grandvizir de nous donner les fruits de ton expérience en ce qui concerne aussi le compo en question qu'est le RXRichEdit.

Car je commençais sérieusement à me demander si j'étais le seul utilisateur qui avait été déçu de ce (super) compo ; je n'ai pas vu grand-chose en ce sens sur le Net.

Peut-être que pour les releases à venir de la RX...

En tous les cas, Nebula peut être fier de son TRichEditEx, du super boulot !
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
12 mars 2005 à 20:50
Je suis tout à fait d'accord avec toi Jean-Pierre: ce composant bien que très bien dans ses possibilités n'est pas très fiable. C'est pour cela que je ne l'utilise pas. En fait, ce qui m'a marqué avec Spy++, est que le cadre actif fenêtré ne correspond pas au cadre du composant. Ce qui fait que ça donne l'impression d'un bricolage pas très honnête. L'argument que je donne est bof, car la mini-gouttière de différence sert sûrement à qqch. Mais puisque le composant est d'un niveau très élevé, mieux vaut ne pas trop vouloir s'y jeter.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.