RichEdit: Probleme mit Links beim Laden aus einer Datei



  • Hi,

    wie Powerpaule schon schrieb, wann rufst du die Funktion überhaupt auf?

    und was, wenn du deine Funktion während des Ladens aufrufst

    void __fastcall TForm1::Open1Click(TObject *Sender)
    {
       if (OpenDialog->Execute()) {
           URL_RE->Lines->LoadFromFile(OpenDialog->FileName);
           InitREURLDetection( URL_RE, true);
       }
    }
    

    mfg
    kpeter



  • Also, ich verwende diese Funktion beim Initialisieren des RichEdits.

    Aber es ist egal wann ich diese Funktion verwende, weil ich auch nach dem Laden des Textes aus einer Datei ich diese Funktion durch ein Button aufrufe und es trotzdem nicht geht.

    Wie schon mal gesagt, wenn der Text da ist, dann muss ich einmal hinter dem Link was schreiben und wieder entfernen, dann erkennt er die Links.

    Gibt es irgendwie eine Message, die das Parsen der Links aktivert/neustartet??



  • ..da ich für die Schule gerade einen LAN-Chat zuende geschrieben habe, interessiere ich mich sehr für die Methode Links zu erkennen.
    Würdest du mir den Quelltext vielleicht schicken?



  • Also,

    verwende die oben genannte Funktion 'InitREURLDetection' um bei einem RichEdit die URL-Erkennung zu aktvivieren.

    Aber um das Klicken eines Links machbar zu machen musst du die TRichEdit-Klasse ableiten, so wie ich z.B. heisst meine neue Klasse TURLRichEdit, und dann die WindowProc des RichEdits überschreiben:

    Unit1.h:

    class TURLRichEdit : public TRichEdit
    {
    __published:	// IDE-managed Components
    
    private:	// User declarations
    
    public:		// User declarations
    	__fastcall TURLRichEdit(TComponent* Owner);
    	TWndMethod	old_wndproc;
    	void __fastcall NewWindowProc(TMessage &Message) ;
    };
    

    Unit1.cpp:

    //---------------------------------------------------------------------------
    __fastcall TURLRichEdit::TURLRichEdit(TComponent* Owner)
    	: TRichEdit(Owner)
    {
    	old_wndproc=WindowProc; //----BackUp der Alten WindowProc machen
    	WindowProc=NewWindowProc; //---Neu WindowProc zuweisen
    
    }
    
    //---------------------------------------------------------------------------
    void __fastcall TURLRichEdit::NewWindowProc(TMessage &Message)
    {
    
    	if (Message.Msg==48206) //---Maus über Link-Message (kenne leider das Flag nicht!)
    	{
    		TENLink *link;
    		TRichEdit *rd;
             String url;
    		link=(TENLink*)((TWMNotify&)Message).NMHdr;
    		if (link->msg==WM_LBUTTONDOWN) //--Aktion bei linkem Mausklick
    		{
    			rd=(TURLRichEdit*)Form1->ActiveControl; //---Hier RichEdit zuweisen
    			SendMessage(rd->Handle, EM_EXSETSEL, 0,(long) &link->chrg); //---Link-Text in RichEdit markieren
    			url= rd->SelText;
    			ShellExecute(Handle, "open", url.t_str(), 0, 0, SW_SHOWNORMAL); //---Standard-Browser öffnen, Link übergeben
    
    		}
    
    	}
    
    	old_wndproc(Message); //---Messages dann an alte WindowProc weiterleiten - ganz wichtig!!!
    }
    

    Wenn du das hast, dann Erstelle ein TURLRichEdit dynamisch, aktiviere die Linkerkennung mit InitREURLDetection und dann tipp etwas ein...

    Dann dürfte es funktionieren, wenn ich nichts vergessen habe.... 😉



  • Hawkxxx schrieb:

    if (Message.Msg==48206) //---Maus über Link-Message (kenne leider das Flag nicht!)
    

    Dürfte

    #define CN_NOTIFY (int)(48206)
    

    in controls.hpp sein 😉

    mfg
    kpeter



  • CN_NOTIFY ?? Echt?
    Also WM_NOTIFY funktionierte nicht, obwohl es in vielen Code-Beispielen darüber stand (weiss auch nicht warum)! Aber ich werde es mal ausprobieren!

    Danke!



  • Hui, das funktioniert ja super!
    Vielen Dank, Hawkxxx

    Grüße, halloei



  • Aber hat jemand ne Idee über mein Problem mit dem Laden von Text und den Links?



  • Hi,

    schreib den Funktionsaufruf in die Routine, in der du dein
    RichEdit erstellst; bei mir ist das der Konstruktor des Hauptformulars
    als Beispiel:

    __fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
    {
       URL_RE             = new TMyRichEdit(this);
       URL_RE->Parent     = Form1;
       URL_RE->ScrollBars = ssBoth;
       URL_RE->Top        = 20;
       URL_RE->Left       = 20;
       URL_RE->Width      = 600;
       URL_RE->Height     = 400;
       InitREURLDetection( URL_RE, true);   // <= hier Aufruf
    }
    //---------------------------------------------------------------------------
    

    mfg
    kpeter



  • Habe den Fehler gefunden!

    Ich hatte die Daten erst immer geladen und dann das RichEdit auf URL-Erkennung gesetzt - was nicht klappt! Also zuerst URL-Erkennung und dann die Daten aus der Datei laden!

    Trotzdem Danke!!


Anmelden zum Antworten