Firemonkey: Dateien per Drag ’n‘ Drop in ListBox einfügen

Wenn es nötig ist Dateien vom Windows-Explorer per Drag ’n‘ Drop in die ListBox einer Firemonkey-Anwendung zu ziehen kann man sich der Events OnDragDrop und OnDragOver der ListBox bedienen. Folgender Code-Auszug erstellt für jede gedropte Datei einen Eintrag in der ListBox. Der gesammte Code inkl. kompilierter Demo-Anwendung kann unten heruntergeladen werden.

uses
  System.IOUtils;
 
procedure TfrmMain.AddListItem(AFileName: String);
var
  ListItem: TListBoxItem;
begin
  // Neues Item erstellen
  ListItem := TListBoxItem.Create(Self);
 
  // Dem Item muss die ListBox als Parent zugewiesen
  // werden damit der Eintrag auch sichtbar wird
  ListItem.Parent := lstFiles;
 
  // In der Text-Eigenschaft des Items wird hier der
  // absolute Dateiname (also inkl. Pfad) eingetragen
  ListItem.Text := AFileName;
 
  // Hier wird je nach Datei-Typ der ImageIndex gesetzt
  ListItem.ImageIndex := Self.GetImageIndex(AFileName);
end;
 
function TfrmMain.GetDragOperation: TDragOperation;
begin
  // Die DragOperation anhand der ComboBox ermitteln
  Result := TDragOperation.None;
  case cboDragOperation.ItemIndex of
    1: Result := TDragOperation.Move;
    2: Result := TDragOperation.Copy;
    3: Result := TDragOperation.Link;
  end;
end;
 
function TfrmMain.GetImageIndex(AFileName: String): Integer;
var
  Extension: String;
begin
  // Datei-Endung ermitteln
  Extension := TPath.GetExtension(AFileName);
 
  // ImageIndex je nach Datei-Endung ermitteln
  if Extension = '' then
    Result := 1 // Ordner
  else if (Extension = '.dll') or (Extension = '.exe') then
    Result := 3 // Binär
  else if (Extension = '.ini') or (Extension = '.conf') then
    Result := 4 // Konfig
  else if (Extension = '.txt') or (Extension = '.doc') then
    Result := 5 // Text
  else if Extension = '.pdf' then
    Result := 6 // PDF
  else if (Extension = '.html') or (Extension = '.htm') then
    Result := 7 // HTML
  else if (Extension = '.cs') or (Extension = '.bat') or (Extension = '.cmd') or (Extension = '.h') or (Extension = '.js') or (Extension = '.php') then
    Result := 8 // Code
  else if Extension = '.pas' then
    Result := 9 // Delphi
  else if (Extension = '.dfm') or (Extension = '.fmx') then
    Result := 10 // Dialog
  else
    Result := 2; // Unbekannte Datei
end;
 
procedure TfrmMain.lstFilesDragDrop(Sender: TObject; const Data: TDragObject;
  const Point: TPointF);
var
  FileIndex: Integer;
begin
  lstFiles.BeginUpdate;
  try
    // "Data.Files" ist ein Array of String der alle
    // gedropten Dateien & Ordner enthält.
    // Um diese Dateinamen zu ermitteln wird durch das
    // Array iteriert und der Wert an AddListItem übergeben
    for FileIndex := Low(Data.Files) to High(Data.Files) do
      Self.AddListItem(Data.Files[FileIndex]);
  finally
    lstFiles.EndUpdate;
  end;
end;
 
procedure TfrmMain.lstFilesDragOver(Sender: TObject; const Data: TDragObject;
  const Point: TPointF; var Operation: TDragOperation);
begin
  // Dem Parameter "Operation" können folgende Werte
  // zugewiesen werden: TDragOperation = (None, Move, Copy, Link)
  // Je nach Wert ändert sich der Cursor beim Drag 'n' Drop.
  Operation := Self.GetDragOperation;
end;

Code und Demo-Anwendung herunterladen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.