2010-03-19 7 views
5

में यूआरएल पर क्लिक करें मैं RichEdit को अपडेट करने की कोशिश कर रहा हूं ताकि यह यूआरएल का पता लगा सके और ब्राउज़र में खोलने के लिए उस पर क्लिक करने में सक्षम हो। पता लगा रहा यूआरएल आसान है, मैं तो बस से http://www.scalabium.com/faq/dct0146.htmRichEdit

mask := SendMessage(MNote.Handle, EM_GETEVENTMASK, 0, 0); 
    SendMessage(MNote.Handle, EM_SETEVENTMASK, 0, mask or ENM_LINK); 
    SendMessage(MNote.Handle, EM_AUTOURLDETECT, Integer(True), 0); 

निम्नलिखित कोड का उपयोग लेकिन दूसरे भाग में मेरे लिए काम नहीं करता। वे EN_LINK संदेश और उसके प्रसंस्करण पर कब्जा करने के लिए निम्न कोड दे:

type 
    TForm1 = class(TForm) 
    protected 
    procedure WndProc(var Message: TMessage); override; 
    end; 
... 

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; 

जब मैं कार्यक्रम चलाने, यूआरएल का पता चला है, लेकिन इस पर क्लिक कुछ भी नहीं है। डीबग का उपयोग करके मुझे पता चला कि जब मैं यूआरएल पर क्लिक करता हूं तो संदेश। संदेश = WM_NOTIFY सत्य नहीं है। मैंने फिर TRichEdit के WndProc को ओवरराइड करने का प्रयास किया, लेकिन परिणाम वही है। कोई सुझाव?

+0

यह भी देखें [समृद्ध संपादन नियंत्रण पर यूआरएल के लिए माउस क्लिक को कैसे लागू करें] (http://stackoverflow.com/q/11398248/850848)। –

+0

यह मेरे लिए काम करता है। – Ampere

उत्तर

7

उपवर्ग RichEdit के WindowProc संपत्ति और CN_NOTIFY संदेश देखने के लिए, उदाहरण के लिए:

type 
    TForm1 = class(TForm) 
    RichEdit1: TRichEdit; 
    procedure FormCreate(Sender: TObject); 
    private 
    PrevRichEditWndProc: TWndMethod; 
    procedure RichEditWndProc(var Message: TMessage); 
    procedure SetRichEditMasks; 
    end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    PrevRichEditWndProc := RichEdit1.WindowProc; 
    RichEdit1.WindowProc := RichEditWndProc; 
    SetRichEditMasks; 
end; 

procedure TForm1.SetRichEditMasks; 
var 
    mask: Longint; 
begin 
    mask := SendMessage(RichEdit1.Handle, EM_GETEVENTMASK, 0, 0); 
    SendMessage(RichEdit1.Handle, EM_SETEVENTMASK, 0, mask or ENM_LINK); 
    SendMessage(RichEdit1.Handle, EM_AUTOURLDETECT, 1, 0); 
end; 

procedure TForm1.RichEditWndProc(var Message: TMessage); 
begin 
    PrevRichEditWndProc(Message); 
    case Message.Msg of 
    CN_NOTIFY: 
     begin 
     if (TWMNotify(Message).NMHdr^.code = EN_LINK) then 
     begin 
      with PENLink(Message.LParam)^ do 
      begin 
      if (msg = WM_LBUTTONDOWN) then 
      begin 
       SendMessage(RichEdit1.Handle, EM_EXSETSEL, 0, LongInt(@chrg)); 
       ShellExecute(Handle, 'open', PChar(RichEdit1.SelText), 0, 0, SW_SHOWNORMAL); 
      end; 
      end; 
     end; 
     end; 
    CM_RECREATEWND: 
     begin 
     SetRichEditMasks; 
     end; 
    end; 
end; 
0

क्या आपने यह सुनिश्चित करने के लिए एक स्ट्रिप डाउन एप्लिकेशन के साथ प्रयास किया है कि यह आपके प्रोग्राम में कुछ और समस्याएं पैदा नहीं कर रहा है? मैंने डेल्फी 200 9 में उस वेबसाइट के चरणों का पालन किया और यूआरएल पर क्लिक करने से ठीक काम किया।

1

मेरे लिए, यह केवल तभी प्रदर्शित पाठ अंतर्निहित हाइपरलिंक के रूप में एक ही पाठ है काम करता है।

मुझे लगता है कि मेरी समस्या यह है कि अंतर्निहित हाइपरलिंक में विशेषता CFE_HIDDEN है, और इसलिए EM_EXSETSEL द्वारा चुना नहीं जा सकता है।

उदाहरण के तौर पर, यदि मैं यूआरएल http://www.rubbish.com के साथ एक लिंक बना देता हूं, लेकिन जो पाठ RUBBISH प्रदर्शित करता है, हालांकि चयनित पाठ का chrg 11-33 है जो 22 वर्ण है - वही लंबाई यूआरएल, विधि द्वारा लौटा वास्तविक पाठ रबिश है।

हालांकि, मुझे पता चला है कि अगर मैं WM_GETTEXT का उपयोग करें, लिंक के पूरे दिया जाता है:

हाइपरलिंक "http://www.rubbish.com" बकवास

जहां से मैं निकाल सकते हैं यूआरएल chrg पर आधारित है।

यह थोड़ा बेकार लगता है ... लेकिन यह काम करता है। :-)

+2

चूंकि RichEdit दोस्ताना नाम यूआरएल के लिए 'CFE_LINK' और' CFE_HIDDEN' प्रभावों का उपयोग करता है (http://blogs.msdn.com/b/murrays/archive/2009/09/24/richedit-friendly-name-hyperlinks देखें .aspx), शायद आप निर्दिष्ट charrange के चारों ओर वर्णों को स्कैन करने के लिए 'EM_GETCHARFORMAT' का उपयोग करने का प्रयास कर सकते हैं यह पता लगाने के लिए कि छुपा यूआरएल वास्तव में कहां स्थित है। –

+0

मेरे लिए 'WM_GETTEXT' सीआरएलएफ लाइन-एंडिंग के साथ टेक्स्ट लौटाता है। जबकि 'ENLink.chgr' गायक-चरित्र (एलएफ) लाइन समाप्ति के साथ पाठ में अनुक्रमणिका का उपयोग करता प्रतीत होता है। इसलिए मुझे 'ENLink.chgr' का उपयोग करके URL निकालने से पहले पाठ को एलएफ में परिवर्तित करना पड़ा। यह भी ध्यान रखें कि 'EM_EXSETSEL' विधि विंडोज 10 पर छिपे हुए ग्रंथों पर काम करती है (लेकिन विंडोज 7 और इससे पहले नहीं)। विवरण के लिए, मेरा जवाब देखें [अमीर संपादन नियंत्रण पर यूआरएल के लिए माउस क्लिक को कैसे लागू करें] (http://stackoverflow.com/a/34825079/850848)। –