Announcement

Collapse
No announcement yet.

Drag & Drop aus Explorer

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Drag & Drop aus Explorer

    Hallo

    Ich weis dass es viele Themen zu Drag&Drop hat, aber ich fand keines, welches sich mit meinem Problem befasst.

    Ich möchte den Pfad einer Datei, welche ich per Drag&Drop aus dem Explorer in eine CheckListBox ziehe angezeigt haben.

    Ich habe mir den Code http://www.bytesandmore.de/rad/cpp/snipp/sc03026.php hier angesehen und ausprobiert. Es funktioniert wunderbar, solange es eine ListBox ist, sobald ich eine CheckListBox verwende, akzeptiert er das File nicht.

    Wenn ich
    Code:
    DragAcceptFiles(lboxFiles -> Handle, true);
    zu
    Code:
    DragAcceptFiles(Form1->Handle, true);
    ändere, geht es aber dann akzeptiert das ganze Formular das File, ich möchte aber dass das File nur über der CheckListBox akzeptiert wird.

    Kann mir da jemand helfen?

    Danke und freundliche Grüsse

    tacter
    Zuletzt editiert von tacter; 05.09.2007, 07:21.

  • #2
    sobald ich eine CheckListBox verwende, akzeptiert er das File nicht.
    Die entsprechenden Eigenschaften in der Checklistbox wurden gesetzt....
    Christian

    Comment


    • #3
      Originally posted by tacter View Post
      Ich habe mir den Code ... http://www.bytesandmore.de/rad/index.htm hier angesehen ...
      Dieser Link führt nicht zu einem Code-Snippet...

      Aber vielleicht hilft Dir davon etwas weiter: torry.net

      Ich hatte mal vor einiger Zeit etwas mit TDragDropPanel gebastelt, das funktionierte auch ganz gut, allerdings musste ich die Liste "von Hand" füllen (Listbox auf dem Panel, Align = alClient).

      Gruß Knut

      Comment


      • #4
        Hallo,

        Originally posted by tacter View Post
        Ich möchte den Pfad einer Datei, welche ich per Drag&Drop aus dem Explorer in eine CheckListBox ziehe angezeigt haben.
        Am besten leitest du dazu die WndProc-Methode der CheckListBox um, so dass du Nachrichten selbst behandeln kannst. Die Nachricht "WM_DROPFILES" ist dann die gesuchte.

        Falls du ein Beispiel suchst, im Quelltext von Qezz solltest du fündig werden.
        Mit freundlichen Grüßen,
        Freiheit
        ---
        //don't question it ... it's clearly an optimization
        ---
        lafin.de lanmonitor.de

        Comment


        • #5
          Danke für die Antworten.

          @Christian Marquardt: Was für Eigenschaften meinst du?

          @Knut Lohse: Sry, jetzt stimmt der Link.

          @Freiheit: Ich werde mir die Source ansehen.

          Comment


          • #6
            Hallo,

            Originally posted by tacter View Post
            @Knut Lohse: Sry, jetzt stimmt der Link.
            Danke.

            Gruß Knut

            Comment


            • #7
              Ich hab mal dies ausprobiert:
              .cpp
              Code:
              void __fastcall THF_List::NewCheckListBoxWP(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); 
                  CheckListBox1->Items->Add(FileName);
              
                  // clean up 
                  delete [] FileName; 
                  DragFinish(HDrop); 
              
                  Msg.Result = 0; 
                  return; 
                } 
              
                // un-subclass the RichEdit 
                if (Msg.Msg == WM_DESTROY) 
                  CheckListBox1->WindowProc = OldCheckListBoxWP; 
              
                OldCheckListBoxWP(Msg); 
              } 
              
              
              void __fastcall THF_List::FormCreate(TObject *Sender)
              {
                       DragAcceptFiles(CheckListBox1->Handle, true);
              
                       OldCheckListBoxWP = CheckListBox1->WindowProc;
                       CheckListBox1->WindowProc = NewCheckListBoxWP;
              }
              .h
              Code:
              private:	// User declarations
                      TWndMethod OldCheckListBoxWP;
                      void __fastcall NewCheckListBoxWP(TMessage &Msg);
              Doch es geht immer noch nicht.

              Comment


              • #8
                Zugriff auf Nachrichten:

                http://www.marquardtnet.info/cecke/q...quicky_55.html
                Christian

                Comment


                • #9
                  Originally posted by tacter View Post
                  Doch es geht immer noch nicht.
                  Das ist eigenartig, bei mir (BDS2006) funktioniert dein Code.
                  Mit freundlichen Grüßen,
                  Freiheit
                  ---
                  //don't question it ... it's clearly an optimization
                  ---
                  lafin.de lanmonitor.de

                  Comment


                  • #10
                    Danke Freiheit!

                    Hab die ganze Form nochmals erstellt mit anderem Namen und jetzt gehts.

                    Wenn ich jetzt 2 CheckListBoxen auf einer Form habe, wie kann ich auswerten, in welche der Boxen das File gedropt wurde?
                    Zuletzt editiert von tacter; 07.09.2007, 11:30.

                    Comment


                    • #11
                      Originally posted by tacter View Post
                      Wenn ich jetzt 2 CheckListBoxen auf einer Form habe, wie kann ich auswerten, in welche der Boxen das File gedropt wurde?
                      Warum möchtest du das auswerten? Solange du nicht die Nachrichten beider CheckListBoxes über eine WndProc "prügelst", weißt du doch grundsätzlich, über welcher CheckListBox die Datei abgeworfen wurde. Oder?

                      Eine Lösung wäre also, für beide CheckListBoxes eigene WndProcs zu definieren und dann die Message WM_DROPFILES plus einen Pointer auf die CheckBox an eine Extra-Funktion weiter zu leiten:

                      Code:
                      void __fastcall TForm1::CheckListBox1_WindowProc(TMessage &Message)
                      {
                      if (Message.Msg == WM_DROPFILES)
                         DropFilesTo(Message, CheckListBox1);
                      }
                      //
                      
                      void __fastcall TForm1::CheckListBox2_WindowProc(TMessage &Message)
                      {
                      if (Message.Msg == WM_DROPFILES)
                         DropFilesTo(Message, CheckListBox2);
                      }
                      Mit freundlichen Grüßen,
                      Freiheit
                      ---
                      //don't question it ... it's clearly an optimization
                      ---
                      lafin.de lanmonitor.de

                      Comment


                      • #12
                        Danke, habs hingekriegt.

                        Sobald ich
                        Code:
                        CheckListBox->MultiSelect=true
                        setze, ist Drag&Drop nicht mehr möglich. Die Files werden gar nicht erst akzeptiert. Kann ich das ändern oder kann man das umgehen?
                        Zuletzt editiert von tacter; 11.09.2007, 10:20.

                        Comment


                        • #13
                          Originally posted by tacter View Post
                          Sobald ich
                          Code:
                          CheckListBox->MultiSelect=true
                          setze, ist Drag&Drop nicht mehr möglich. Die Files werden gar nicht erst akzeptiert.
                          Kann ich so nicht nachvollziehen, bei mir hat MultiSelect keinen Einfluss auf Drag&Drop.
                          Mit freundlichen Grüßen,
                          Freiheit
                          ---
                          //don't question it ... it's clearly an optimization
                          ---
                          lafin.de lanmonitor.de

                          Comment


                          • #14
                            Ich kanns auch nicht nachvollziehen.
                            Sobald ich MultiSelect auf true setze, kommt das Verboten-Zeichen wenn ich die Files in die Box ziehen will. Hab auch mal ein neues projekt angelegt und es geht immer noch nicht.

                            Comment

                            Working...
                            X