Wir nutzen die DropMaster-Komponente von Rize.
Delphi-Quellcode:
procedure TMyDragSource.ExecuteFileDrag(FileSaveName, AlternateFileName: array of string);
var
SL: TStringList;
i: Integer;
Data: AnsiString;
begin
SL := TStringList.Create;
try
CustomFormatData.Clear;
for i := 0 to High(FileSaveName) do
if (i <= High(AlternateFileName)) and (AlternateFileName[i] <> '') then
SL.Add(ExtractFileName(AlternateFileName[i]))
else
SL.Add(ExtractFileName(FileSaveName[i]));
CustomFormatData.AddFormat(DMFileGroupDescriptorFormatName, FileGroupDescriptorFromFileList('', SL));
for i := 0 to High(FileSaveName) do begin
with TFileStream.Create(FileSaveName[i], fmOpenRead or fmShareDenyWrite) do
try
SetLength(Data, Size);
if Data <> '' then
ReadBuffer(Data[1], Size);
finally
Free;
end;
CustomFormatData.AddFormatEx('FileContents', Data, TYMED_HGLOBAL, i);
CustomFormatData.Items[CustomFormatData.Count - 1].AllowTrailingNull := False;
end;
Execute;
finally
SL.Free;
end;
end;
Dafür hatte ich mir mal eine Prozedur geschieben, um den Drag-Vorgang zu initialisieren.
Das Drag und Drop der
WinAPI kennt mehrere Modi, einmal Dateiname als Quelle und anderseits ein Stream als Quelle, mit zusätzlichem Namen.
Das Prinzip sollte sich auch mit anderen D&D-Komponenten umsetzen lassen.
Mein einziges Problem war, dass das Drag&Drop der
VCL nicht mit dem des Windows kompatibel sind und ich nicht gleichzeitig in einer Gridkomponente Zeilen per Delphi-Drag&Drop umsortieren kann und gleichzeitig das auch als Drag-Quelle nach Extern nutzen kann.
Als Drop-Ziel ist beides zusammen möglich.