C++ Builder Snippets  

Dateien aus dem Explorer in die Anwendung ziehen (Drag and Drop):

Programmierung von DragAndDrop-Funktionitäten innerhalb einer Anwendung gestaltet sich sind mit Hilfe der VCL relativ einfach. Etwas schwieriger wird es, wenn die zu "droppenden" Objekte Dateien aus dem Explorer (oder einem Explorer-Style-Fenster) sind. In diesem Fall muss ein Message-Handler für die Windows-Botschaft WM_DROPFILES erstellt werden, der beim Ablegen von Dateien auf den dafür vorgesehenen Steuerelementen die Namen der "gedroppten" Dateien mit Hilfe der API-Funktion DragQueryFile() ausliest.

Folgendes Beispielprojekt beinhaltet ein Formular frmMain und eine ListBox lboxFiles. Die Namen der auf der Listbox abgelegten Dateien werden als Einträge in der Listbox angezeigt.

Der Message Handler für die WM_DROPFILES-Botschaft wird in der Header-Datei deklariert:

//---
// Deklaration des Message Handlers für die 
// WM_DROPFILES-Botschaft in der Header-Datei 
// der frmMain
private:  
  void __fastcall WMDropFiles(TWMDropFiles &Message);

public:  
  BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(WM_DROPFILES,TWMDropFiles,WMDropFiles)
  END_MESSAGE_MAP(TForm)
//---

Als Nächstes wird festgelegt, welche Steuerelemente das Ablegen von Dateien akzeptieren sollen. Dies kann z.B. im OnCreate-Behandlungsroutine des Formulars erfolgen:

#include <shellapi.h>  // für die Drag...()-Funktionen

//---
void __fastcall TfrmMain::FormCreate(TObject *Sender)
{
  DragAcceptFiles(lboxFiles -> Handle, true);
}
//---

Nun fehlt uns nur noch die eigentliche Behandlungsroutine für die WM_DROPFILES-Botschaft. Diese könnte z.B. so aussehen:

//---
void __fastcall TfrmMain::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);
    // ...und ab in die Listbox:
    lboxFiles -> Items -> Add(caFileName);
  }
}
//---


  Download BCB4
Projekt-Quellcode
Download
Demo-Exe

© '99-2000 by S. Kreutzmann