5/5 (14 avis)
Snippet vu 8 205 fois - Téléchargée 39 fois
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.
31 août 2009 à 14:59
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.
30 mai 2007 à 00:31
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 ...........
16 juin 2005 à 02:28
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 ;-)
12 mars 2005 à 23:39
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 !
12 mars 2005 à 20:50
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.