RichEdit - Drag und Drop



  • Wie kann ich mit Drag und Drop im RichEdit arbeiten so wie es in der ListBox geht. Oder ist das nicht möglich? Ich habe ein beispiel für eine listBox aber beim RichEdit funktioniert es nicht! 😞

    h
    //---------------------------------------------------------------------------
    private:    // Anwender-Deklarationen
    void __fastcall WMDropFiles(TWMDropFiles &Message);
    public:     // Anwender-Deklarationen
      BEGIN_MESSAGE_MAP
        MESSAGE_HANDLER(WM_DROPFILES,TWMDropFiles,WMDropFiles)
      END_MESSAGE_MAP(TForm)
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    
    cpp
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
      DragAcceptFiles(ListBox1->Handle, true);
    }
    //---------------------------------------------------------------------------
    //---------------------------------------------------------------------------
    void __fastcall TForm1::WMDropFiles(TWMDropFiles &Message)
    {
      int ilFilesCount, ilStrLength;
      char caFileName[MAX_PATH];
      // Anzahl der Dateien bestimmen:
      ilFilesCount=DragQueryFile((HDROP)Message.Drop,-1,NULL,0);
      for(int ilIndex=0; ilIndex<ilFilesCount; ilIndex++)
      {
        // Länge des Dateinamens bestimmen:
        ilStrLength=DragQueryFile((HDROP)Message.Drop,ilIndex,NULL,0);
        // Dateinamen in char-Array caFileName übernehmen:
        DragQueryFile((HDROP)Message.Drop, ilIndex, caFileName, ilStrLength+1);
    
        RichEdit1->Lines->LoadFromFile(caFileName);
      }
    }
    //---------------------------------------------------------------------------
    

    Bitte um Hilfe. Danke 😉

    [ Dieser Beitrag wurde am 04.10.2002 um 00:40 Uhr von Jansen editiert. ]



  • Aus irgendeinem Grund scheint das RichEdit WM_DROPFILES nicht zu empfangen, zumindest nicht beim Verwenden einer Messagemap. Mit dem Überschreiben der WindowProc funktioniert es aber:

    // in .h
    private:    // User declarations
      TWndMethod OldRichEditWP;
      void __fastcall NewRichEditWP(TMessage &Msg);
    
    // in .cpp
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
      : TForm(Owner)
    {
      // register the RichEdit as a drop site
      DragAcceptFiles(RichEdit1->Handle, true);
    
      OldRichEditWP = RichEdit1->WindowProc;
      RichEdit1->WindowProc = NewRichEditWP;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::NewRichEditWP(TMessage &Msg)
    {
      if (Msg.Msg == WM_DROPFILES)
      {
        // grab a handle to the drop structure
        HDROP HDrop = (HDROP)Msg.WParam;
    
        // find the number of files dropped
        int num_files = DragQueryFile(HDrop, 0xFFFFFFFF, (LPSTR)NULL, NULL);
    
        // only accept one file at a time
        if (num_files != 1)
        {
          ShowMessage("Only one file at a time please!");
          Msg.Result = 0;
          return;
        }
    
        // load the file
        int NameLength = DragQueryFile(HDrop, 0, NULL, NULL) + 1;
        char *FileName = new char[NameLength];
        DragQueryFile(HDrop, 0, FileName, NameLength);
        RichEdit1->Lines->LoadFromFile(FileName);
    
        // clean up
        delete [] FileName;
        DragFinish(HDrop);
    
        Msg.Result = 0;
        return;
      }
    
      // un-subclass the RichEdit
      if (Msg.Msg == WM_DESTROY)
        RichEdit1->WindowProc = OldRichEditWP;
    
      OldRichEditWP(Msg);
    }
    //---------------------------------------------------------------------------
    

    Quelle: Borland Newsgroups



  • Genau das was ich gesucht habe!

    Danke 😃


Anmelden zum Antworten