Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

RICHEDIT AVEC RECONNAISSANCE DES URLS


Information sur la source

Catégorie :Composants Niveau : Débutant Date de création : 16/09/2002 Date de mise à jour : 17/09/2002 05:07:37 Vu : 4 784

Note :
9 / 10 - par 2 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note

Description

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

  • 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.
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)
 

Commentaires et avis

signaler à un administrateur
Commentaire de djtexas le 17/09/2002 02:12:12

Pas mal mon p'tit gab, j'attends la prochaine source avec impatience ;)))))

signaler à un administrateur
Commentaire de Delphiprog le 18/09/2002 13:40:29 administrateur CS

La surcharge du destructeur Destroy qui ne fait appel qu'au destructeur hérité n'est franchement pas utile. C'est pas beau de recopier sur ses petits camarades ...

signaler à un administrateur
Commentaire de Nebula le 18/09/2002 14:14:39

c'est pas de la copie mais l'adaptation d'un code existant en c++, je suis pas le premier à le faire et surement pas le dernier non plus :)

quand à la surcharge 'inutile' elle a pour seul but de me rappeler de bien libérer les ressources que j'aurais pu allouer dans le constructeur, c'est tout

signaler à un administrateur
Commentaire de BiSi le 19/09/2002 13:52:33

Ca à l'air d'être une belle adaptation, et de plus bien utile.
Malheureusement, j'débute un peu en Delphi et j'ai pas compris comment l'utiliser.

Quelqu'un peu m'aider ?

signaler à un administrateur
Commentaire de Nebula le 19/09/2002 14:20:37

il y a plusieurs méthodes, la plus simple étant la suivante, je pense:
- tu copies/colles le code ci-dessus dans un fichier "RichEditEx.pas",
- tu cliques sur "composants" dans le menu de delphi, "installer", tu sélectionnes le fichier "RichEditEx.pas", puis tu dis à delphi de le placer dans le paquet d'exemple (normalement il suffit de cliquer sur ok)... ensuite tu compiles le paquet, et le composant TRichEditEx devrait apparaitre dans ton onglet Win32 ! ;-)

signaler à un administrateur
Commentaire de BiSi le 19/09/2002 14:27:55

OK, j'avais pas compris qu'il s'utilisait comme un composant à part entière, maintenant c'est plus clair.

Merci du coup de main, je vais voir ce que ca donne.

signaler à un administrateur
Commentaire de Jean-Pierre le 10/12/2004 18:13:10

Bonjour,

>limitations : la détection automatique des urls (et leur clic, le cas échéant)
>ne fonctionne [b]que sur windows 2000 / XP[/b] en raison des différences de
>versions des DLL riched32.dll et riched20.dll,

Je suis sous Windows 98se et [b]je peux désormais[/b] utiliser le super Compo [b]TRichEditEx de Nebula[/b].

Au détour d'un chemin j'ai déniché un patch qui corrige le bug inhérent aux deux DLL citées dito de Windows 98 et Millenium.

Voir le site de l'auteur :
http://perso.wanadoo.fr/maclak/

Le patch se situe dans cette page :
http://perso.wanadoo.fr/maclak/d2backup.html

Plus exactement dans le paragraphe "Support, bugs et retour",

[b]Ce patch se nomme 'RichEdPatch.exe"[/b] poids 511 Ko.

Surtout ne pas oublier de fermer tous les programmes avant de le lancer, sinon un message d'erreur typique intervient.

Merci encore à Nebula pour son super compo qui fonctionne désormais sur presque tous les OS !

Et merci aussi au concepteur et auteur de ce patch véritablement miraculeux.

signaler à un administrateur
Commentaire de grandvizir le 05/03/2005 11:12:38

RxLib fournit un RichEdit amélioré gérant des objets dans son éditeur. Ainsi, il est fortement possible d'insérer des bitmaps. Je n'en suis pas sûr, car je n'utilise pas ce composant...

signaler à un administrateur
Commentaire de Jean-Pierre le 05/03/2005 12:10:31

Bonjour tout le monde,

>RxLib fournit un RichEdit amélioré gérant des objets dans son éditeur.

Grandvizir, c'est exact, le RXRichEdit est un super compo, qui sait aussi gérer le multi-undo, reconnaissance automatique de URL, mailto, etc. mais...

Il est malheureusement "bugué jusqu'à l'os", l'autre fois impossible de faite fonctionner correctement certaines funtions dessus, par exemple celle de TFindDialog ; TReplaceDialog.

Le pointage du curseur devient malheureusement complétement inopérant et anarchisé.

Enfin je suis loin d'être un expert en ce domaine, et si l'un d'entre-vous sait comment résoudre de blème de RXRichEdit, merci je suis prenneur !

Ceci dit le compo TRichEditEx de notre camarade Nebula est tout simplement merveilleux et je l'en remercie encore !

signaler à un administrateur
Commentaire de grandvizir le 12/03/2005 20:50:29

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.

signaler à un administrateur
Commentaire de Jean-Pierre le 12/03/2005 23:39:03

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 !  



signaler à un administrateur
Commentaire de Nebula le 16/06/2005 02:28:17

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 ;-)

signaler à un administrateur
Commentaire de Korda le 30/05/2007 00:31:33

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 ...........

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,437 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.