begin process at 2010 02 09 23:45:11
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Composants

 > RICHEDIT AVEC RECONNAISSANCE DES URLS

RICHEDIT AVEC RECONNAISSANCE DES URLS


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

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

Auteur : Nebula

Ecrire un message privé
Site perso
Commentaire sur cette source (14)
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)


 Sources du même auteur

Source avec Zip Source avec une capture LISTBOX POUR CLIENTS IRC
Source avec Zip Source avec une capture COLOR PICKER (CAPTURE D'ÉCRAN, ZOOM ET CONVERSION DE COULEUR...
Source avec Zip Source avec une capture RICHEDIT AVEC SUPPORT DES THÈMES XP
Source avec Zip Source avec une capture FORCER LA TRANSPARENCE DES FENÊTRES (WINDOWS XP ET SUPÉRIEUR...
Source avec Zip Source avec une capture UNITÉS SQLITE POUR DELPHI

 Sources de la même categorie

Source avec Zip Source avec une capture TQGRID UN STRINGGRID AMÉLIORER. par yanb
Source avec Zip DYNAMIC LIBRARY LOADER CLASS: GAGNEZ DU TEMPS POUR CHARGER L... par f0xi
Source avec Zip Source avec une capture COMPOSANTS NDSOFT par diglas
Source avec Zip Source avec une capture GESTION DES "CRASHS D'APPLICATION" par Bacterius
Source avec Zip COMPOSANT TTHRESCOLLECTION par ThWilliam

Commentaires et avis

Commentaire de djtexas le 17/09/2002 02:12:12

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

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

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

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 ?

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

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.

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.

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

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 !

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.

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 !  



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

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

Commentaire de Gerard le 31/08/2009 14:59:47

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.

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,608 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales