2010-08-24 4 views
2

J'utilise le code actuel pour mettre en évidence les URL sur un TRichEdit:TRichEdit et URL mettant en lumière les problèmes

procedure TForm1.WndProc(var Message: TMessage); 
var 
    p: TENLink; 
    strURL: string; 
begin 
    if (Message.Msg = WM_NOTIFY) then 
    begin 
    if (PNMHDR(Message.lParam).code = EN_LINK) then 
    begin 
     p := TENLink(Pointer(TWMNotify(Message).NMHdr)^); 
     if (p.Msg = WM_LBUTTONDOWN) then 
     begin 
     SendMessage(RichEdit1.Handle, EM_EXSETSEL, 0, Longint(@(p.chrg))); 
     strURL := RichEdit1.SelText; 
     ShellExecute(Handle, 'open', PChar(strURL), 0, 0, SW_SHOWNORMAL); 
     end 
    end; 
    end; 

    inherited; 
end; 

procedure TForm1.InitRichEditURLDetection; 
var 
     mask: Word; 
begin 
     mask := SendMessage(Handle, EM_GETEVENTMASK, 0, 0); 
     SendMessage(RichEdit1.Handle, EM_SETEVENTMASK, 0, mask or ENM_LINK); 
     SendMessage(RichEdit1.Handle, EM_AUTOURLDETECT, Integer(True), 0); 
     form1.RichEdit1.OnChange := form1.RichEdit1Change; 
end; 

Il met en évidence les URL, mais il me empêchent RichEdit1.OnChange d'être appelé. J'essaie de nouveau à partir de WndProc et d'autres approches, mais rien ne fonctionne. La minute j'active le surligneur d'URL (en appelant InitRichEditURLDetection sur FormCreate) OnChange cesse de fonctionner.

Ceci est sur Delphi 7.

Des suggestions? merci!

Répondre

2

Il y a un bug dans votre code. Remplacer

mask := SendMessage(Handle, EM_GETEVENTMASK, 0, 0); 

avec

mask := SendMessage(RichEdit1.Handle, EM_GETEVENTMASK, 0, 0); 

En raison de ce bug, mask ne contiendra pas les bits d'événement par défaut du contrôle Rich Edit, de sorte que le contrôle Rich Edit desserre ces drapeaux d'événement lorsque vous EM_SETEVENTMASK; en particulier, il manquera le bit ENM_CHANGE.

Mise à jour

Sertac Akyuz trouvé un autre bug show-arrêt: mask doit être un entier (ce qui est en effet le type de résultat de SendMessage).

+0

merci, je l'ai essayé. Je reçois une exception eRangeError sur cette ligne lorsque j'essaie de l'exécuter – Jessica

+0

@Jessica: Etes-vous sûr? (Peut-être une question stupide, mais ça devrait vraiment fonctionner.) –

+0

oui: lecture de l'adresse 0000000 – Jessica

Questions connexes