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;