Richedit avec reconnaissance des urls

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 608 fois - Téléchargée 37 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

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
24
Date d'inscription
mardi 25 mai 2004
Statut
Membre
Dernière intervention
9 avril 2016

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
790
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
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

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
1237
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
10
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.