2012-01-17 10 views
5

Sto cercando di implementare il rilevamento degli URL per il componente TRichEdit utilizzando il messaggio EM_AUTOURLDETECT.
ho un problema con il seguente codice
Come rilevare i collegamenti URL dopo aver impostato EM_AUTOURLDETECT in TRichEdit?

procedure TForm1.Button1Click(Sender: TObject); 
var Mask: Word; 
begin 
    Mask := SendMessage(Handle, EM_GETEVENTMASK, 0, 0); 
    SendMessage(Handle, EM_SETEVENTMASK, 0, Mask or ENM_LINK); 
    SendMessage(Handle, EM_AUTOURLDETECT, Integer(True), 0); 
end; 

Funziona se ma devo cambiare il testo del TRichEdit dopo queste impostazioni per ottenere il si di rilevare gli URL nel testo già scritto. E questo è il problema perché il mio TRichEdit è in modalità ReadOnly quando si applica questa funzione.

Cosa devo fare dopo aver eseguito questo codice per forzare TRichEdit a rilevare gli URL nel testo già scritto?
Stavo guardando lo documentation ma non si parla di qualcosa di simile.

Grazie

risposta

4

Ho avuto lo stesso problema qualche tempo fa e utilizzato (abbastanza) una soluzione sporco per esso. Dopo aver inviato il messaggio EM_AUTOURLDETECT, ottengo e memorizzo la selezione corrente, quindi (ri) imposta il testo del Rich Edit e ripristina la selezione precedentemente memorizzata.

procedure TForm1.Button1Click(Sender: TObject); 
var 
    EventMask: Word; 
    CharRange: TCharRange; 
begin 
    EventMask := SendMessage(RichEdit1.Handle, EM_GETEVENTMASK, 0, 0); 
    SendMessage(RichEdit1.Handle, EM_SETEVENTMASK, 0, EventMask or ENM_LINK); 
    SendMessage(RichEdit1.Handle, EM_AUTOURLDETECT, WPARAM(True), 0); 
    SendMessage(RichEdit1.Handle, EM_EXGETSEL, 0, LPARAM(@CharRange)); 
    SendMessage(RichEdit1.Handle, WM_SETTEXT, 0, LPARAM(RichEdit1.Text)); 
    SendMessage(RichEdit1.Handle, EM_EXSETSEL, 0, LPARAM(@CharRange)); 
end; 
+1

Grazie TLama ma non c'è più tecnica pulita per farlo? Qualche tipo di notifica singola? Sembra abbastanza "pesante" per cancellare e impostare il testo di TRichEdit. –

+3

Nella documentazione è presente quanto segue: _Se il rilevamento URL automatico è abilitato, il controllo Rich Edit esegue la scansione di qualsiasi testo modificato per determinare se il testo corrisponde al formato di un URL._ quindi sembra che il testo debba essere modificato per ottenere questo formato, ma se c'è un modo più semplice (alcune notifiche come dici tu) per forzare il sistema ad applicare l'effetto 'CFE_LINK' per tutte le parole già presenti in Rich Edit che non conosco. – TLama

+2

nessun'altra soluzione alternativa AFIK. un codice semplificato potrebbe essere: 'SendMessage (RichEdit1.Handle, WM_SETTEXT, 0, Longint (RichEdit1.Text));' dopo aver impostato 'EM_AUTOURLDETECT' – kobik

Problemi correlati